Алгоритм поиска
Поиск в упорядоченной таблице
Алгоритм последовательного поиска
Последовательный поиск
Введение в поиск
Алгоритмы поиска занимают важное место в прикладных алгоритмах. Обычно данные хранятся в определенном образом упорядоченном наборе. Найти некоторую запись из этого набора — вот классическая задача программирования, вокруг которой сгенерировано множество идей [1, 3, 9, 10, 13].
Пусть мы имеем таблицу, состоящую из записей (табл. 3.1). Первое поле каждой записи содержит ключ (например, табельный номер); второе — фамилию и так далее. Ключом может любое поле записи.
Таблица 3.1
Иванов | ||
Андреев | ||
Сидоров | ||
Петров |
Основная задача поиска — найти запись с заданным ключом.
Все алгоритмы поиска, в зависимости от того, упорядочена таблица или нет, разбиваются по две большие группы. Упорядоченность понимается как наличие хотя бы одного отсортированного поля — а именно, ключевого.
Наиболее примитивный, а значит, и наименее эффективный, способ поиска— это обычный последовательный просмотр записей таблицы [9,11]. Метод применяется к таблице, организованной как массив. Предложим, что к— массив из п ключей; г— массив записей такой, что k(i) — ключ для записи r(i); key — аргумент поиска. Запишем в переменную search наименьшее целое число /, такое, что k(i) = key, если такое / существует, и -1 в противном случае.
for ( search=-l, i=0; | i<n; | i + + ) |
if(key == k[i]) | ||
{ | ||
search=i; | ||
break; | ||
} |
Некоторым улучшением этой идеи является метод транспозиции: каждый запрос к записи сопровождается сменой мест этой и предшествующий записи; в итоге наиболее часто используемые записи постепенно перемещаются в начало таблицы; и при последующем обращении к ней запись будет находиться почти сразу.
На подобной идее основан и метод перемещения в начало: каждый запрос к записи сопровождается её перемещением в начало таблицы; в итоге в начале таблицы оказываются записи, используемые в последнее время.
Все реально применяемые методы поиска относятся к отсортированным таблицам. Для упорядоченной таблицы наиболее эффективными являются: 1) индексно-последовательный поиск и 2) бинарный поиск .
Индексно-последовательный поиск.В дополнение к отсортированной таблице заводится вспомогательная таблица, называемая индексной [9, 11]. Каждый элемент индексной таблицы состоит из ключа и указателя на запись в основной таблице, соответствующую этому ключу kindex. Элементы в индексной таблице, так же как элементы в основной таблице, должны быть отсортированы по этому ключу. Если индекс имеет размер, составляющий одну восьмую от размера основной таблицы, то каждая восьмая запись основной таблицы будет представлена в индексной таблице (рис. 3.1).
Алгоритм индексно-последовательного поиска прост. Предположим, что к — массив из п ключей; г — массив записей такой, что k(i) является ключом для записи r(i); key — аргумент поиска. Пусть — массив ключей в индексе; pindex — массив указателей в индексе на записи. Размер основной таблицы — п. Размер индексной таблицы — indsize.
i = 0; | ||||
while ( ( | i < ind size) | && (kindex | [i] <= key)) | |
i + +; | ||||
/^установить low на | наименьшую | возможную позицию | ||
элемента | в массиве*/ | |||
if(i == | 0) | |||
low= | 0; | |||
else | ||||
low | = pindex[i^ | ; | ||
/^установить high | на | наибольшую | возможную | |
позицию | элемента в | массиве*/ |
if (i==ind_size)
high=n; else
high=pindex[i];
/*поиск в массиве от low до high*/
for (j=low, search= if (k[j]==key)
{
search=j; breake;
■1; j<high; j+ +
Основная таблица
Индексная таблица
kindex pindex
I L
k r i ключ запись I |
8 ] - ^------- ч------ > |
14 ] i ^--------- т--------- s |
26 ,s \------------ ^----------- <. |
38 1У v--------- ^-------- ^ i s |
72 ] S |
I PJ 115 I oo ^------------ ^----------- ч i |
306 I I ^------------ ^----------- ч |
• 321 ] |
329 1 ^------------ т----------- > |
387 I ----------------------------------- -> i |
.409. ]| |
LS12 L )] |
540 1 I ч------------ ч----------- ч |
567 ) \------------- *------------ 4 |
1 583 1 *----------------- *---------------- * i |
5d2 1 ^----------- ^----------- ^ |
1--------- 1-------- h ' ■ ■ ■ i ч--------- ^------- гУ i |
Рис. З.1. Схема хранения информации при индексно-последовательном поиске
Достоинство алгоритма заключаются в том, что сокращаются время поиска, так как последовательный поиск первоначально ведется в индексной таблице, имеющей меньший размер, чем основная таблица; когда найден правильный индекс, второй последовательный поиск выполняется по небольшой части записей основной таблицы.
Бинарный поиск.Аргумент сравнивается с ключом среднего элемента в массиве [9, 11]. Если они равны, то поиск успешен. В противном случае поиск осуществляется аналогично в левой и правой частях массива. Алгоритм определяется рекурсивно, однако на практике применяется нерекурсивная версия ввиду её большой эффективности.