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

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

 

Пример

 

Написать программу поиска элемента 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.