Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции_ по алгоритм и структуре.doc
Скачиваний:
56
Добавлен:
07.08.2019
Размер:
1.34 Mб
Скачать

5. Поиск

Поиск является одной из основных операций при обра­ботке информации в ЭВМ. Ее назначение - по заданному ар­гументу найти среди массива те данные, которые со­ответствуют этому аргументу.

Признак, по которому элемент структуры отличается от других данных называется ключом.

Если в таблице существует только одно данное с ключом, то такой ключ является уникальным и называется первичным.

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

Ключи данных могут быть собраны в од­ном месте (в другой таблице) или представлять собой запись, в которой одно из полей - это ключ.

Внешний ключ (и) - это Ключ (и), который выделе­н из таблицы данных и организован в свой файл, называ­ются

Внутренний ключ – это ключ, который находится в записи

Поиском по заданному аргументу называется алгоритм, определяющий соответствие ключа с заданным аргументом.

Результатом работы алгоритма поиска является нахожде­ние этого данного или отсутствие его в таблице. В случае от­сутствия данного возможны две операции:

  1. индикация того, что данного нет

  2. вставка данного в таблицу.

Пусть k - массив ключей. Для каждого k(i) существует r(i) - данное. Key - аргумент поиска. Ему соответствует ин­формационная запись геc. В зависимости от того, какова структура данных в таблице, различают несколько видов по­иска.

5. 1. Линейный поиск

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

Производится по­следовательный просмотр, по всей таблице начиная от млад­шего адреса в оперативной памяти к самым старшим.

Последовательный поиск в массиве осуществляется с помощью переменной search, которая хранит номер найденного элемента.

Рис. 26 - Последовательный поиск в массиве

for i:=l to n

if k(i) = key then

search = i

return

end if

next i

search = 0

return

На Паскале программа будет выглядеть следующим обра­зом:

for i:=l to n do

if k[i] = key then

begin

search = i;

exit;

end;

search = 0;

exit;

Эффективность последовательного поиска в массиве можно определить как количество производимых сравнений М.

Mmin = 1, Mmax = n. Если данные расположены равноверо­ятно во всех ячейках массива, то Мср ≈ (п + 1)/2.

Если элемент не найден в таблице и необходимо произвести вставку, то последние 2 оператора заменяются на n = n + 1

на Паскале

n:=n+l n:=n+l;

k(n) = key k[n]:=key;

r(n) = rec r[n]:=rec;

search = n search :=n;

return exit;

Если таблица данных задана в виде односвязного спи­ска, то производится последовательный поиск в списке (рис. 5.2).

table

Рис. – Поиск в списке

Пример программы

q:=nil;

p:=table;

while (p<> nil) do

begin

if p^.k = key then

begin

search = p ;

exit;

end;

q = p;

p = p^.nxt;

end;

New (s);

s^.k:= key

s^.r = rec

s^.nxt: = nil;

if q = nil then table = s

else q.^nxt = s;

search: = s;

exit

Достоинством списковой структуры является ускорен­ный алгоритм удаления или вставки элемента в список.

Время вставки или удаления не зависит от количества элементов, а в массиве каждая вставка или удаление требуют передвижения примерно половины элементов.

Эффективность последовательного поиска

Эффективность любого поиска может оцениваться по количеству сравнений аргумента поиска С с ключами табли­цы данных. Чем меньше количество сравнений, тем эффек­тивнее алгоритм поиска.

Эффективность последовательного поиска в массиве:

С = 1 +п, С = (п + 1)/2.

Целью поиска является выполнение следующих процедур:

  1. Найденную запись считать.

  2. При отсутствии записи произвести ее вставку в таблицу.

  3. Найденную запись удалить.

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

Если k - число передвижений элементов в массиве, то k= (n + 1)/2.