Класс | Алгоритм поиска |
---|---|
Наихудший случай производительность | O (n) |
Лучший случай производительность | O (1) |
Средняя производительность | O (n / 2) |
Худший случай сложность пространства | O (1) итеративная |
В информатике, линейный поиск или последовательный поиск - это метод поиска элемента в списке. Он последовательно проверяет каждый элемент списка, пока не будет найдено совпадение или пока не будет выполнен поиск по всему списку.
Линейный поиск выполняется в худшем случае линейное время и выполняет не более n сравнений, где n - длина списка. Если вероятность поиска каждого элемента одинакова, то линейный поиск имеет средний случай n + 1/2 сравнений, но на средний случай может повлиять изменение вероятностей поиска для каждого элемента. Линейный поиск редко бывает практичным, поскольку другие алгоритмы и схемы поиска, такие как алгоритм двоичного поиска и хеш-таблицы, позволяют значительно быстрее искать все, кроме коротких списков.
Линейный поиск последовательно проверяет каждый элемент списка, пока не найдет элемент, который соответствует целевому значению. Если алгоритм достигает конца списка, поиск завершается неудачно.
Дан список L из n элементов со значениями или записями L0.... L n-1 и целевое значение T, следующая подпрограмма использует линейный поиск, чтобы найти индекс целевого T в L.
Базовый алгоритм, приведенный выше, выполняет два сравнения за итерацию: одно для проверки, если L i равно T, а другой - для проверки, указывает ли я на действительный индекс списка. Путем добавления в список дополнительной записи L n (контрольное значение ), которая равна цели, второе сравнение можно исключить до конца поиска, что ускоряет алгоритм. Поиск достигнет дозорного, если цель не содержится в списке.
Если список упорядочен так, что L 0 ≤ L 1... ≤ L n-1, поиск может быстрее установить отсутствие цели, завершив поиск, как только L i превысит цель. Этот вариант требует, чтобы дозор был больше, чем цель.
.
Для списка с n элементами наилучший случай - когда значение равно первому элементу списка, и в этом случае требуется только одно сравнение. В худшем случае значение отсутствует в списке (или встречается только один раз в конце списка), и в этом случае необходимо n сравнений.
Если искомое значение встречается в списке k раз и все упорядочения в списке равновероятны, ожидаемое количество сравнений будет
Например, если искомое значение встречается в списке один раз, и все упорядочения списка одинаково вероятны, ожидаемое количество сравнений будет . Однако, если известно, что это происходит один раз, то необходимо не более n - 1 сравнений, а ожидаемое количество сравнений равно
(например, для n = 2 это 1, что соответствует единственной конструкции if-then-else).
В любом случае асимптотически стоимость наихудшего случая и ожидаемая стоимость линейного поиска равны O (n).
Производительность линейного поиска улучшается, если желаемое значение с большей вероятностью находится в начале списка, чем в его конце. Следовательно, если одни значения будут найдены с большей вероятностью, чем другие, желательно поместить их в начало списка.
В частности, когда элементы списка расположены в порядке убывания вероятности, и эти вероятности геометрически распределены, стоимость линейного поиска составляет всего O (1).
Линейный поиск обычно очень просто реализовать, и он практичен, когда в списке всего несколько элементов или при выполнении одного поиска в неупорядоченном списке.
Когда в одном списке нужно искать много значений, часто имеет смысл предварительно обработать список, чтобы использовать более быстрый метод. Например, можно отсортировать список и использовать двоичный поиск или построить из него эффективную структуру данных поиска. Если содержимое списка часто меняется, повторная реорганизация может доставить больше хлопот, чем она того стоит.
В результате, хотя теоретически другие алгоритмы поиска могут быть быстрее, чем линейный поиск (например, двоичный поиск ), на практике даже на массивах среднего размера (около 100 элементов или меньше) может оказаться невозможным использовать что-либо еще. На больших массивах имеет смысл использовать другие, более быстрые методы поиска, только если объем данных достаточно велик, поскольку начальное время для подготовки (сортировки) данных сопоставимо со многими линейными поисками.