Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КН.docx
Скачиваний:
9
Добавлен:
27.10.2018
Размер:
95.79 Кб
Скачать

27. Алгоритмы поиска. Основные понятия и определения. Задача поиска. Последовательный поиск элемента упорядоченного массива и связного упорядоченного списка.

Среди алгоритмов компьютерной обработки данных особое место занимает задача поиска, связанная с нахождением какой-либо конкретной информации в большом объеме ранее собранных данных. В качестве основной структуры данных для алгоритмов поиска используется АТД таблица, представляющая собой совокупность элементов, каждая из которых идентифицируется ключом. Логической особенностью таблиц является то, что доступ к элементам таблицы производится не по позиции, а по ключу. Поэтому часто к ключу предъявляется требование уникальности в данной таблице, а случаи дублированных ключей требуют разработки особых подходов.

АТД таблица поддерживает три основные операции:

  1. Поиск элемента с заданным ключом.

  2. Вставка элемента с заданным ключом.

  3. Удаление элемента с заданным ключом.

Абстрактные типы данных с перечисленными операциями называют также словарями. Из перечисленных операций основной является первая – поиск элемента с заданным ключом. Она может иметь 2 исхода: успешный, когда когда искомый элемент найден, и неуспешный, когда установлено, что элемента с заданным ключом в таблице нет. Остальные операции базируются на поиске.

Классификация таблиц:

- по месту хранения: внутренние таблицы хранятся в оперативной памяти, внешние – на внешних запоминающих устройствах.

- по отношениям связи между элементами: линейной и нелинейной. Линейные таблицы основаны на АТД линейный список и могут быть реализованы в виде массивов или связных списков. Нелинейные таблицы основаны на АТД деревья или представлены таблицами с вычисляемыми методами.

- по упорядоченности: в упорядоченной таблице элементы хранятся в соотв-ии с заданным критерием упорядоченности, в неупорядоченной таблице – произвольно.

Сформулируем более точно задачу поиска для линейных таблиц. Пусть имеется линейная таблица элементов Т1, Т2…Тn, снабженных соответственно ключами К1, К2,..Кn, где >=1 – количество элементов таблицы, и ключ поиска Х. Требуется найти позицию I элемента Ti, содержащего заданный ключ x=Ki. В качестве представления линейной таблицы в программных реализациях будем рассматривать массив записей типа TBase, каждая запись состоит из ключа key и сопутствующей информации Info. Диапазон чисел от 1 до N задает тип Index, таблица описана типом Table, например:

Type

TBase=record

Key: Tkey;

Info: Tinfo;

End;

Index:=1..N;

Table=array[index] of Tbase;

Алгоритм последовательного поиска (sequential search)в неупорядоченной таблице заключается в последовательном просмотре всех элементов таблицы, начиная с первого, до тех пор, пока либо искомый элемент не будет найден, либо не будут просмотрены все элементы таблицы в случае неуспешного поиска. Функция SeqSearch возвращает номер искомого элемента Х в случае успешного поиска или N+1, если ключ не найден.

Function SeqSearch (x: Tkey; var T: Table): Index;

Var i: index;

Begin

I:=1;

While (i<=N) and (x<>T[i].key) do i:=i+1;

SeqSearch:=I;

End;

Эффективность операции оценивается как O(N). Время выполнения зависит от количества сравнений ключей и успешности поиска: последовательный поиск производит N сравнений для каждого неуспешного поиска, и в среднем N/2 сравнений для успешного. Для успешного поиска, если мы предположим, что любой элемент имеет равную вероятность быть искомым, среднее количество сравнений равно: (1+2+…+N)/N=(N+1)/2.

Известен способ существенного улучшения последовательного поиска с помощью барьерного элемента. Следует добавить фиктивную запись в конец таблицы и хранить в ней искомый ключ (в цикле while будем выполнять только 1 проверку вместо 2-х).

Function QSeqSearch (x: Tkey; var T: table): Index;

Var i: index;

Begin

I:=1;

T[N+1].key := x;

While x<>t[i].key do i:=i+1;

QSeqSearch:=I;

End;

Эмпирический анализ показывает, что при поиске по большим таблицам скорость улучшенного алгоритма QSeqSearch увеличивается до 30% по сравнению с вариантом SeqSearch.