Одно из наиболее часто встречающихся в программировании действий поиск. Существует несколько основных вариантов поиска, и для них создано много различных алгоритмов. При дальнейшем рассмотрении делается принципиальное допущение: группа данных, в которой необходимо найти заданный элемент, фиксирована. Будет считаться, что множество из N элементов задано в виде такого массива
a: array[0..N 1] of Item
Обычно тип Item описывает запись с некоторым полем, играющим роль ключа. Задача заключается в поиске элемента, ключ которого равен заданному ⌠аргументу поиска■ x. Полученный в результате индекс i, удовлетворяющий условию а[i].key = x, обеспечивает доступ к другим полям обнаруженного элемента. Так как здесь рассматривается, прежде всего, сам процесс поиска, то мы будем считать, что тип Item включает только ключ.
Если нет никакой дополнительной информации о разыскиваемых данных, то очевидный подход простой последовательный просмотр массива с увеличением шаг за шагом той его части, где желаемого элемента не обнаружено. Такой метод называется линейным поиском. Условия окончания поиска таковы:
Элемент найден, т. е. аi = x.
Весь массив просмотрен и совпадения не обнаружено.
Это дает нам линейный алгоритм:
Алгоритм 1.
i:=0;
while (i<N) and (а[i]<>х) do i:=i+1
Следует обратить внимание, что если элемент найден, то он найден вместе с минимально возможным индексом, т. е. это первый из таких элементов. Равенство i=N свидетельствует, что совпадения не существует.
Очевидно, что окончание цикла гарантировано, поскольку на каждом шаге значение i увеличивается, и, следовательно, оно достигнет за конечное число шагов предела N; фактически же, если совпадения не было, это произойдет после N шагов.
На каждом шаге алгоритма осуществляется увеличение индекса и вычисление логического выражения. Можно упростить шаг алгоритма, если упростить логическое выражение, которое состоит из двух членов. Это упрощение осуществляется путем формулирования логического выражения из одного члена, но при этом необходимо гарантировать, что совпадение произойдет всегда. Для этого достаточно в конец массива поместить дополнительный элемент со значением x. Такой вспомогательный элемент называется ⌠барьером■. Теперь массив будет описан так:
а: array[0..N] of integer
и алгоритм линейного поиска с барьером выглядит следующим образом:
Алгоритм 1’.
a[N]:=x; i:=0;
while a[i]<>x do i:=i+1
Ясно, что равенство i=N свидетельствует о том, что совпадения (если не считать совпадения с барьером) не было.