JavaRush /Курсы /Модуль 1: Python Core /Сравнение линейного и бинарного поиска

Сравнение линейного и бинарного поиска

Модуль 1: Python Core
16 уровень , 3 лекция
Открыта

4.1 Сравнение временной сложности линейного и бинарного поиска

Давайте сравним временную сложность линейного и бинарного поиска.

Сравнение временной сложности линейного и бинарного поиска

Линейный поиск:

  • Временная сложность: O(n), где n — количество элементов в массиве или списке.
  • Лучший случай: O(1) — элемент найден на первом месте.
  • Средний случай: O(n/2) = O(n) — элемент найден в среднем где-то в середине.
  • Худший случай: O(n) — элемент найден на последнем месте или отсутствует.

Бинарный поиск:

  • Временная сложность: O(log n), где n — количество элементов в массиве или списке.
  • Лучший случай: O(1) — элемент найден на первом шаге (средний элемент).
  • Средний случай: O(log n) — поиск в отсортированном массиве.
  • Худший случай: O(log n) — элемент найден на последнем шаге или отсутствует.

Пример анализа временной сложности

Линейный поиск:

  • Массив [1, 3, 5, 7, 9, 11, 13], искомый элемент 7.
  • Проверка каждого элемента до нахождения 7 на индексе 3.
  • Потребовалось 4 проверки, что соответствует O(n).

Бинарный поиск:

  • Массив [1, 3, 5, 7, 9, 11, 13], искомый элемент 7.
  • Средний элемент (7) найден на первом шаге.
  • Потребовалась 1 проверка, что соответствует O(log n).

4.2 Преимущества и недостатки каждого метода

Рассмотрим преимущества и недостатки каждого типа поиска.

Линейный поиск:

Преимущества:

  • Простота реализации: Линейный поиск очень легко реализовать и понять.
  • Нет требований к данным: Линейный поиск может применяться к неотсортированным данным.
  • Подходит для небольших массивов: Линейный поиск эффективен для массивов небольшого размера.

Недостатки:

  • Низкая эффективность для больших массивов: Временная сложность O(n) делает его неэффективным для больших массивов.
  • Длительное время выполнения: Для больших массивов линейный поиск может занять много времени, особенно если искомый элемент находится ближе к концу массива или отсутствует.

Бинарный поиск:

Преимущества:

  • Высокая эффективность для больших массивов: Временная сложность O(log n) делает его очень эффективным для больших массивов.
  • Быстрое выполнение: Бинарный поиск значительно быстрее линейного поиска при работе с большими отсортированными массивами.

Недостатки:

  • Требование отсортированных данных: Бинарный поиск работает только с отсортированными массивами, что может потребовать дополнительного времени на предварительную сортировку.
  • Сложность реализации: Реализация бинарного поиска сложнее по сравнению с линейным поиском.

4.3 Когда использовать какой поиск

Рассмотрим, когда использовать линейный поиск, а когда бинарный поиск.

Линейный поиск.

Используйте линейный поиск, когда:

  • Массив или список не отсортированы.
  • Размер массива или списка небольшой.
  • Нужна простота и быстрое решение без дополнительных затрат на сортировку.
  • Требуется найти первое вхождение или все вхождения элемента.
  • Данные поступают в реальном времени, и их предварительная сортировка невозможна или нецелесообразна.

Бинарный поиск.

Используйте бинарный поиск, если:

  • Массив или список отсортированы.
  • Размер массива или списка большой.
  • Частый поиск элементов в одном и том же наборе данных (можно предварительно отсортировать данные один раз).
  • Важна высокая скорость поиска.
  • Допустимо потратить время на предварительную сортировку данных.

4.4 Примеры задач для линейного поиска

1. Поиск в неотсортированном списке

Нужно найти индекс заданного числа в неотсортированном списке чисел.

Пример:


def linear_search(arr, target):
    for index, element in enumerate(arr):
        if element == target:
            return index
    return -1

arr = [4, 2, 7, 1, 9, 3]
target = 7
print(linear_search(arr, target))  # Вывод: 2

2. Поиск первого вхождения в массиве

Нужно найти первое вхождение заданного элемента в списке строк.

Пример:


def linear_search(arr, target):
    for index, element in enumerate(arr):
        if element == target:
            return index
    return -1

words = ["apple", "banana", "cherry", "date", "banana"]
target = "banana"
print(linear_search(words, target))  # Вывод: 1

3. Поиск в данных реального времени

Найти элемент в потоке данных, поступающих в реальном времени.

Пример:


import random

def find_in_stream(stream, target):
    for index, element in enumerate(stream):
        if element == target:
            return index
    return -1

stream = [random.randint(1, 100) for _ in range(100)]
target = 50
print(find_in_stream(stream, target))

4.5 Примеры задач для бинарного поиска

1. Поиск в отсортированном массиве

Нужно найти индекс заданного числа в отсортированном массиве чисел.

Пример:


def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

sorted_array = [1, 3, 5, 7, 9, 11, 13]
target = 7
print(binary_search(sorted_array, target))  # Вывод: 3

2. Частый поиск в большом наборе данных

Часто искать элементы в большом отсортированном массиве чисел.

Пример:


import random

sorted_large_array = sorted([random.randint(1, 1000000) for _ in range(1000000)])
target = random.choice(sorted_large_array)
print(binary_search(sorted_large_array, target))

3. Поиск элемента в отсортированной базе данных

Найти запись в отсортированной базе данных по ключевому полю.

Пример:


database = sorted([{"id": i, "value": f"record_{i}"} for i in range(100000)])
def binary_search_db(db, target_id):
    left, right = 0, len(db) - 1
    while left <= right:
        mid = (left + right) // 2
        if db[mid]["id"] == target_id:
            return db[mid]
        elif db[mid]["id"] < target_id:
            left = mid + 1
        else:
            right = mid - 1
    return None

target_id = 54321
print(binary_search_db(database, target_id))
2
Задача
Модуль 1: Python Core, 16 уровень, 3 лекция
Недоступна
Соревнование
Соревнование
2
Задача
Модуль 1: Python Core, 16 уровень, 3 лекция
Недоступна
Лучший поиск
Лучший поиск
1
Опрос
Алгоритмы поиска, 16 уровень, 3 лекция
Недоступен
Алгоритмы поиска
Алгоритмы поиска
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 59
8 августа 2025
Второй повтор двух первых лекций. Альо! JavaRush разработчик, тебя держат в плену и ты пытаешься посылать какие-то знаки?!