stringtranslate.com

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

В информатике линейный поиск или последовательный поиск — это метод поиска элемента в списке . Он последовательно проверяет каждый элемент списка до тех пор, пока не будет найдено совпадение или пока не будет просмотрен весь список. [ 1]

Линейный поиск выполняется за линейное время в худшем случае и делает максимум n сравнений, где n — длина списка. Если каждый элемент с одинаковой вероятностью будет найден, то линейный поиск имеет средний случай н+1/2 сравнения, но средний случай может быть затронут, если вероятности поиска для каждого элемента различаются. Линейный поиск редко бывает практичным, поскольку другие алгоритмы и схемы поиска, такие как алгоритм бинарного поиска и хэш-таблицы , позволяют значительно быстрее искать для всех списков, кроме коротких. [2]

Алгоритм

Линейный поиск последовательно проверяет каждый элемент списка, пока не найдет элемент, соответствующий целевому значению. Если алгоритм достигает конца списка, поиск завершается неудачно. [1]

Базовый алгоритм

При наличии списка L из n элементов со значениями или записями L 0 .... L n −1 и целевого значения T следующая подпрограмма использует линейный поиск для нахождения индекса цели T в L . [3]

  1. Установите i на 0.
  2. Если L i = T , поиск завершается успешно; вернуть i .
  3. Увеличьте i на 1.
  4. Если i < n , перейти к шагу 2. В противном случае поиск завершается неудачно.

С часовым[4]

Базовый алгоритм выше делает два сравнения за итерацию: одно для проверки, равно ли L i T , а другое для проверки, все еще ли i указывает на допустимый индекс списка. Добавив дополнительную запись L n в список ( сигнальное значение ), которое равно цели, второе сравнение можно исключить до конца поиска, что ускорит алгоритм. Поиск достигнет сигнального значения, если цель не содержится в списке. [5]

  1. Установите i на 0.
  2. Если Li = T , перейти к шагу 4 .
  3. Увеличьте i на 1 и перейдите к шагу 2.
  4. Если i < n , поиск завершается успешно; вернуть i . В противном случае поиск завершается безуспешно.

В упорядоченном столе

Если список упорядочен таким образом, что L 0L 1 ... ≤ L n −1 , поиск может установить отсутствие цели быстрее, завершив поиск, как только L i превысит цель. Этот вариант требует дозорного, который больше цели. [6]

  1. Установите i на 0.
  2. Если Li T , перейти к шагу 4 .
  3. Увеличьте i на 1 и перейдите к шагу 2.
  4. Если L i = T , поиск завершается успешно; вернуть i . В противном случае поиск завершается безуспешно.

Анализ

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

Если искомое значение встречается в списке k раз и все упорядочения списка равновероятны, то ожидаемое число сравнений равно

Например, если искомое значение встречается в списке один раз, и все упорядочения списка равновероятны, то ожидаемое количество сравнений равно . Однако, если известно , что оно встречается один раз, то требуется не более n - 1 сравнений, а ожидаемое количество сравнений равно

(например, для n = 2 это 1, что соответствует единственной конструкции if-then-else).

В любом случае, асимптотически стоимость в худшем случае и ожидаемая стоимость линейного поиска составляют O ( n ).

Неравномерные вероятности

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

В частности, когда элементы списка расположены в порядке убывания вероятности, а эти вероятности распределены геометрически , стоимость линейного поиска составляет всего лишь O(1). [7]

Приложение

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

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

В результате, хотя в теории другие алгоритмы поиска могут быть быстрее линейного поиска (например, бинарный поиск ), на практике даже на массивах среднего размера (около 100 элементов или меньше) может быть нецелесообразно использовать что-либо другое. На больших массивах имеет смысл использовать другие, более быстрые методы поиска, только если данные достаточно велики, поскольку начальное время подготовки (сортировки) данных сопоставимо со многими линейными поисками. [4]

Смотрите также

Ссылки

Цитаты

  1. ^ ab Knuth 1998, §6.1 («Последовательный поиск»).
  2. ^ Кнут 1998, §6.2 («Поиск путем сравнения ключей»).
  3. ^ Кнут 1998, §6.1 («Последовательный поиск»), подраздел «Алгоритм B».
  4. ^ ab Хорват, Адам. "Производительность бинарного и линейного поиска на платформах .NET и Mono" . Получено 19 апреля 2013 г.
  5. ^ Кнут 1998, §6.1 («Последовательный поиск»), подраздел «Алгоритм Q».
  6. ^ Кнут 1998, §6.1 («Последовательный поиск»), подраздел «Алгоритм T».
  7. ^ Кнут, Дональд (1997). "Раздел 6.1: Последовательный поиск". Сортировка и поиск . Искусство программирования. Том 3 (3-е изд.). Эддисон-Уэсли. С. 396–408. ISBN  0-201-89685-0.

Работы