Линейный поиск
Пусть имеется некоторый набор данных и требуется определить, где в этом наборе находится заданный элемент ( и есть ли он в наборе ). Такая задача называется задачей поиска. Большинство задач поиска сводится к поиску в таблице ( массиве ) элемента с заданным значением.
Пример
Написать программу поиска элемента x в массиве из n элементов. Значение элемента x вводится с клавиатуры.
Решение
Пусть имеются следующие описания:
Const n = 10; { размерность массива }
Var a: array ( 1...n ) Of Integer;
{ массив из n элементов целого типа }
x: Integer; { искомый элемент целого типа }
В данном случае известно только значение разыскиваемого элемента, никакой дополнительной информации о нем или о массиве, в котором его надо искать, нет. Проверка одного элемента не дает никакой информации об остальных. Поэтому для решения задачи разумно применить очевидный метод - последовательный просмотр массива и сравнение значения очередного рассматриваемого элемента с данным. Если значение очередного элемента совпадает с x, то запомним его номер в переменной к.
For i: =1 To n Do If a[i] = x Then k: = i;
Этот способ решения поставленной задачи, безусловно, приводит к цели, но обладает рядом существенных недостатков:
· если значение x встречается в массиве несколько раз, то найдено будет последнее из них;
· после того, как нужное значение уже найдено, массив просматривается до конца, то есть всегда выполняется n сравнений.
Разумно прекратить просмотр сразу после обнаружения заданного элемента. Так как в этом случае число повторений не известно, необходимо использовать цикл с предусловием. В результате:
- либо будет найден искомый элемент, то есть найдется такой индекс i, что а [ i ] = x;
- либо будет просмотрен весь массив, и искомый элемент не обнаружится.
Таким образом, поскольку нужно продолжать поиск до обнаружения искомого элемента или до конца массива, условие окончания цикла может выглядеть так:
While ( i <= n ) And ( a[ i ]<> x ) Do Inc ( i );
Примечание:Необходимо обратить внимание на порядок простых условий в составном условии цикла. Здесь предполагается, что второе условие не проверяется, если результат логического выражения ясен после проверки первого условия. В противном случае возникнет отказ из-за выхода индекса за границы массива.
Программа линейного поиска:
program n6;
const n=5;
var a:array[1..n] of integer;
{ массив из n элементов целого типа }
x:integer; { искомый элемент целого типа }
i,k:integer;
begin
writeln('Введите исходный массив:');
for i:=1 to n do read(a[i]);
writeln('Введите x');
readln(x);
for i:=1 to n do if a[i]=x then k:=i;
while (i<=n) and (a[i]<>x) do inc(i);
writeln('a[',k,']=',x,'=x');
end.