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

Находите элементы, проверяя каждый по одному.

Около 5 мин чтения
  • Дайте определение линейному поиску и объясните его своими словами
  • Правильно используйте ключевые термины, например «линейный поиск»
  • Применяйте изученное к новым примерам и вопросам
  • Избегайте типичных ошибок, которые ученики допускают в этой теме

Не все решения равны: одни находят имя в списке из миллиона за двадцать шагов, а другим нужен миллион. На уровне GCSE вы переходите от написания любого работающего решения к написанию хороших. Эта глава охватывает классические алгоритмы поиска и сортировки — и то, как измерить, какой из них лучше.

Этот урок посвящён линейному поиску: находите элементы, проверяя каждый по одному.

Определение: Линейный поиск

Находите элементы, проверяя каждый по одному.

Ключевые идеи

Бинарный поиск требует отсортированных данных

Бинарный поиск намного быстрее линейного — около 20 сравнений для миллиона элементов — но он работает только если список сначала отсортирован. Сортировка тоже требует времени, поэтому для разового поиска в неотсортированных данных линейный поиск может оказаться лучше. Правильный алгоритм зависит от ситуации, а не только от теории.

Худший случай — вот что важно

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

Термин — линейный поиск: Проверка каждого элемента списка по одному, пока не найдена цель. Просто, работает на неотсортированных списках, но медленно на больших.

Бинарный поиск в действии

Используйте бинарный поиск, чтобы найти 7 в отсортированном списке [1, 3, 5, 7, 9, 11, 13].

low = 0, high = 6. Средний индекс = (0 + 6) // 2 = 3. Элемент с индексом 3 — это 5. 5 меньше 7, поэтому отбрасываем левую половину: low становится 4. Средний индекс = (4 + 6) // 2 = 5. Элемент с индексом 5 — это 11. 11 больше 7, поэтому отбрасываем правую половину: high становится 4. Средний индекс = (4 + 4) // 2 = 4. Элемент с индексом 4 — это 7. Найдено — 7 находится под индексом 4 всего после 3 сравнений.

Ответ: Бинарный поиск находит 7 под индексом 4 за 3 сравнения; линейному поиску понадобилось бы 4.

Типичные ошибки
  • Использование бинарного поиска в неотсортированном списке Исправление: сначала отсортируйте список или используйте линейный поиск — бинарный поиск в неотсортированных данных даёт неверные ответы, а не просто работает медленно.
  • Забывчивость о том, что индексы списка начинаются с 0 Исправление: в списке из 7 элементов последний индекс — 6; ошибки на единицу — классическая ловушка на экзамене, поэтому разбирайте внимательно.

Практика

Сколько сравнений нужно линейному поиску в худшем случае, чтобы найти элемент в списке из 50?
Худший случай означает проверку каждого элемента.

50 — каждый элемент должен быть проверен, если цель последняя или отсутствует.

Сколько примерно сравнений нужно бинарному поиску для 1 000 000 отсортированных элементов?
Каждое сравнение делит список пополам; 2 в степени 20 — это примерно миллион.

Около 20 — каждый шаг уменьшает оставшиеся элементы вдвое, поэтому миллион сокращается до одного примерно за 20 делений пополам.

Почему линейный поиск может оказаться быстрее бинарного для одного поиска?
Подумайте, что нужно бинарному поиску сначала.

Если список не отсортирован, бинарному поиску сначала нужна сортировка — её стоимость может перевесить более быстрый поиск для разового запроса.

Алгоритм работает 4 секунды на 100 элементах и 16 секунд на 200 элементах. На какой рост по Big-O это указывает?
Удвоение входных данных учетверило время.

O(n²) — учетверение при удвоении входных данных — признак квадратичного роста.

Быстрая проверка

Линейный поиск — быстрая проверка

Что из этого лучше всего определяет "линейный поиск"?

Проверка каждого элемента списка по одному, пока не найдена цель. Просто, работает на неотсортированных списках, но медленно на больших.

Верно или неверно: бинарный поиск — всегда лучший алгоритм поиска.

Неверно — нужны отсортированные данные, а для маленьких или неотсортированных списков накладные расходы не окупаются; лучший алгоритм зависит от ситуации.

Проследите один проход сортировки пузырьком на списке [5, 3, 8, 1]. Что будет со списком после?

[3, 5, 1, 8] — 5 и 3 меняются, 5 и 8 остаются, 8 и 1 меняются.
Главные выводы
  • Линейный поиск: находите элементы, проверяя каждый по одному.
  • Бинарный поиск требует отсортированных данных: Бинарный поиск намного быстрее линейного — около 20 сравнений для миллиона элементов — но он работает только если список сначала отсортирован.
  • Бинарный поиск: Многократное деление отсортированного списка пополам для поиска цели — сравнение со средним элементом и отбрасывание половины, которая не может содержать цель.
  • Остерегайтесь: использования бинарного поиска в неотсортированном списке