Jump to content

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

(Перенаправлено с последовательного поиска )
Линейный поиск
Сорт Алгоритм поиска
Худшая производительность На )
Лучшая производительность О (1)
Средняя производительность На )
Наихудшая пространственная сложность О (1) итеративный
Оптимальный Да

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

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

Алгоритм

[ редактировать ]

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

Основной алгоритм

[ редактировать ]

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

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

С дозорным [4]

[ редактировать ]

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

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

В упорядоченной таблице

[ редактировать ]

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

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

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

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

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

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

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

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

[ редактировать ]

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

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

Приложение

[ редактировать ]

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

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

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

См. также

[ редактировать ]
  1. ^ Jump up to: а б Кнут 1998 , §6.1 («Последовательный поиск»).
  2. ^ Кнут 1998 , §6.2 («Поиск путем сравнения ключей»).
  3. ^ Кнут 1998 , §6.1 («Последовательный поиск»), подраздел «Алгоритм B».
  4. ^ Jump up to: а б Хорват, Адам. «Бинарный поиск и производительность линейного поиска на платформах .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 .

Работает

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 5428a7a0674bb5f5ab806ac8435dd10b__1712643300
URL1:https://arc.ask3.ru/arc/aa/54/0b/5428a7a0674bb5f5ab806ac8435dd10b.html
Заголовок, (Title) документа по адресу, URL1:
Linear search - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)