![](/user_photo/2706_HbeT2.jpg)
- •25. Реализация атд стек.
- •Var p: stack;
- •26. Атд очередь
- •27. Алгоритмы поиска. Основные понятия и определения. Задача поиска. Последовательный поиск элемента упорядоченного массива и связного упорядоченного списка.
- •28. Алгоритмы поиска. Основные понятия и определения. Задача поиска. Бинарный поиск элемента упорядоченного массива и связного упорядоченного списка.
- •30. Деревья. Основные понятия и определения. Поиск, добавление и удаление узла. Рекурсивные алгоритмы.
27. Алгоритмы поиска. Основные понятия и определения. Задача поиска. Последовательный поиск элемента упорядоченного массива и связного упорядоченного списка.
Среди алгоритмов компьютерной обработки данных особое место занимает задача поиска, связанная с нахождением какой-либо конкретной информации в большом объеме ранее собранных данных. В качестве основной структуры данных для алгоритмов поиска используется АТД таблица, представляющая собой совокупность элементов, каждая из которых идентифицируется ключом. Логической особенностью таблиц является то, что доступ к элементам таблицы производится не по позиции, а по ключу. Поэтому часто к ключу предъявляется требование уникальности в данной таблице, а случаи дублированных ключей требуют разработки особых подходов.
АТД таблица поддерживает три основные операции:
-
Поиск элемента с заданным ключом.
-
Вставка элемента с заданным ключом.
-
Удаление элемента с заданным ключом.
Абстрактные типы данных с перечисленными операциями называют также словарями. Из перечисленных операций основной является первая – поиск элемента с заданным ключом. Она может иметь 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.