Menu
Coddy logo textTech

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

Последнее обновление

Линейный поиск (его также называют последовательным поиском) — простейший алгоритм поиска: начните с первого элемента и сравнивайте каждый с целью, пока не найдёте совпадение или элементы не закончатся. Он не делает никаких предположений о данных — массив может быть неотсортированным, а элементами может быть что угодно, что можно сравнить на равенство.

Анимация выше подсвечивает каждое сравнение по мере того, как просмотр движется слева направо, и останавливается в момент появления цели. За простоту приходится платить скоростью: в худшем случае проверяется каждый элемент, поэтому алгоритм работает за O(n). Если данные отсортированы, бинарный поиск находит тот же ответ за O(log n) — а если сначала нужны отсортированные данные, посмотрите сортировку слиянием.

Временная и пространственная сложность

СлучайСложностьПримечания
Лучший случайO(1)Первый элемент оказывается целью.
Средний случайO(n)В среднем до попадания проверяется половина элементов.
Худший случайO(n)Цель — последний элемент, или её нет вовсе.
ПамятьO(1)Хранится только текущий индекс.

Шаг за шагом

ШагЧто происходит
1Начните с индекса 0 — первого элемента массива.
2Сравните текущий элемент с целевым значением.
3Если они равны, верните текущий индекс — найдено.
4Иначе сдвиньтесь на одну позицию вправо и повторите.
5Если конец массива достигнут без совпадения, цели нет (верните -1).

Разобранный пример

Поиск 5 в [7, 3, 9, 1, 5, 8, 2]:

СравнениеИндексЭлементРезультат
1077 ≠ 5 — продолжаем просмотр.
2133 ≠ 5 — продолжаем просмотр.
3299 ≠ 5 — продолжаем просмотр.
4311 ≠ 5 — продолжаем просмотр.
5455 = 5 — найдено по индексу 4.

Когда использовать линейный поиск

Используйте, когдаИзбегайте, когда
Данные не отсортированы или постоянно меняютсяДанные отсортированы — бинарный поиск экспоненциально быстрее
Коллекция мала, и простота важнееНабор данных большой и в нём ищут многократно
У вас есть только последовательный доступ (потоки, связные списки)Вы можете позволить себе индекс или хеш-таблицу для поиска за O(1)

Чистая, готовая к запуску реализация Linear Search на Python, JavaScript, Java, C++, C, Pseudocode. Выберите язык, скопируйте код или откройте его уже загруженным в плейграунде Coddy.

Код Linear Search на Python

Python
1def linear_search(a, target):2    # Scan left to right until the target appears3    for i in range(len(a)):4        if a[i] == target:5            return i6    return -17
8
9nums = [7, 3, 9, 1, 5, 8, 2]10print("Index of 5:", linear_search(nums, 5))11print("Index of 4:", linear_search(nums, 4))
Запустите этот код в плейграунде Python

Вопросы и ответы о линейном поиске

Какова временная сложность линейного поиска?
O(n) в среднем и худшем случаях — просмотру может понадобиться посетить каждый элемент — и O(1) в лучшем случае, когда первый элемент оказывается целью. Он использует O(1) дополнительной памяти.
Нужны ли линейному поиску отсортированные данные?
Нет — в этом его главное преимущество. Линейный поиск работает с полностью неотсортированными данными, потому что проверяет каждый элемент на равенство; порядок не имеет значения. Бинарный поиск, напротив, работает только с отсортированными массивами.
Когда линейный поиск лучше бинарного?
Когда данные не отсортированы и ищутся лишь один раз (предварительная сортировка стоила бы O(n log n)), когда коллекция крошечная или когда доступ только последовательный — например, поток или связный список. Для многократного поиска в отсортированных массивах выигрывает бинарный поиск.
Линейный поиск — это то же самое, что последовательный поиск?
Да — оба названия описывают один и тот же алгоритм: просматривать элементы по порядку, пока цель не найдена или коллекция не закончилась.
Сколько сравнений линейный поиск делает в среднем?
Если цель присутствует и с равной вероятностью может быть где угодно, в среднем около n/2 сравнений; если цель отсутствует — ровно n. Именно этот линейный рост дал алгоритму его название.
Coddy programming languages illustration

Освойте алгоритмы с Coddy

НАЧАТЬ