
- •Глава 6. Алгоритмы поиска
- •6.1. Последовательный поиск
- •6.2. Бинарный поиск в упорядоченной таблице
- •6.3. Поиск Фибоначчи в упорядоченной таблице
- •6.4. Поиск по бинарному дереву
- •6.4.1. Бинарное дерево поиска
- •6.4.2. Поиск и вставка в дереве поиска.
- •6.4.3.Удаление из дерева поиска
- •6.4.4. Оптимальное бинарное дерево поиска
- •6.5. Префиксный цифровой поиск
- •6.5.1. Префиксное дерево
- •6.5.2. Алгоритм префиксного поиска
- •6.6. Поиск по вторичным ключам
Глава 6. Алгоритмы поиска
Задача поиска формулируется следующим образом. Имеется набор (массив, файл, таблица, список) элементов (записей), содержащих среди других полей и ключевое поле; требуется найти элемент или группу элементов с заданным значением ключа. Например, часто в качестве ключевого поля в файлах, хранящих сведения о работниках предприятия, используется табельный номер. Ключевыми полями для поиска в соответствующих файлах являются номер паспорта, автомобильный регистрационный номер, номер ИНН. Для больших файлов и их совокупностей распространён термин базы данных.
Как правило, записи файла имеют несколько ключей для поиска (например, ФИО, год рождения, стаж работы, и т. п.). Задача поиска может ставиться для набора значений нескольких ключевых полей — так обычно и происходит при работе с базами данных.
Как и в случае сортировки, целью поиска обычно является не сам ключ, а содержащая его (ассоциированная с ним) запись. Мы будем в дальнейшем для краткости говорить о поиске ключа.
По аналогии с методами сортировки, методы поиска делятся на внутренние (по данным, находящимся в быстрой оперативной памяти) и внешние (по данным, хранящимся на значительно более медленных внешних носителях). Другой аспект классификации делит методы поиска на статические (данные не меняются) и динамические (данные обновляются путём удаления и вставки новых записей).
Принципиальными для алгоритмов поиска являются следующие факторы: упорядоченность/неупорядоченность данных; их структура (способ представления); наконец объём области поиска.
Отметим отдельно задачу поиска по искажённому ключу, когда тем или иным способом формализуется количественно понятие сходства ключей и отбирается группа ключей, схожих с данным.
6.1. Последовательный поиск
Пусть имеется
таблица элементов
с ключами
.
Простейшая процедура последовательного
поиска перебирает ключи в соответствии
с их номерами и останавливается при
совпадении очередного ключа с заданным
значением
.
Если после просмотра всей таблицы ключ
не найден, то выдаётся соответствующее
сообщение.
Если искомый ключ
в таблице отсутствует или расположен
в её конце необходимо сделать
просмотров. Среднее число сравнений
ключа равно
.
Алгоритм прямого перебора:
╔
Ш1.
признак
— ключ найден/не найден.
Ш2.
Цикл по
:
если
,
то
запоминание
;
;
выход из цикла.
Ш3.
Если
обработка записи
,
иначе сообщение об отсутствии таковой.
╚
Быстрый последовательный поиск
Оптимизация циклической программы связана, прежде всего, с уменьшением количества действий в теле цикла, в данном случае — количества сравнений.
В теле цикла
вышеприведённой программы производятся
два сравнения: 1) текущее значение
параметра цикла
сравнивается с верхней границей
его
допустимого изменения, и 2) ключ
сравнивается с
.
Первого сравнения можно избежать:
дополним таблицубарьером
— значением
,
и, увеличивая
,
уже не будем сравнивать его с
.
После обнаружения ключа
(теперь это гарантированно произойдёт)
осуществляется выход из цикла. Далее
производится анализ текущего значения
:
если
,
то ключ не найден.
Последовательный поиск в упорядоченной таблице. Если
заведомо известно, что поиск в большой таблице будет производиться многократно, то целесообразно «не поскупиться» и предварительно отсортировать её.
Пусть
.
Теперь при последовательном поиске с
начала таблицы превышение очерёдным
ключом
искомого значения
позволяет ещё до завершения полного
прохода по всей таблице сделать вывод
об отсутствии нужной записи.
Как и раньше,
обозначим символом
значение, заведомо большее возможных
значений ключевого поля.
Алгоритм последовательного поиска состоит из следующих этапов:
╔
Ш1.
Начальные присваивания:
;
.
Ш2.
Если
,
то перейти к шагуШ4.
Ш3.
Увеличить
;
вернуться к шагу Ш2.
Ш4.
Если
,
то ключ найден, в противном случае
ключ в таблице отсутствует.
╚
Переход к шагу
Ш4
произойдёт, когда в первый раз встретится
ключ, не меньший
.
Тогда либо он — искомый (
),
либо
это уже лишний
добавленный ключ, и нужная запись не
найдена. Значение
в добавленной фиктивной записи гарантирует
выполнение условия
и выход из цикла, по крайней мере, для
.
Ускорение поиска
возможно при наличии априорной информации
о вероятностях
различных значений ключа поиска:
.
Тогда сортировка ключей в порядке
убывания вероятностей:
(
),
расположит наиболее вероятные значения в начале таблицы, и время поиска в среднем уменьшится.
На практике часто
применяют эвристический принцип «80–20»:
как правило,
запросов на поиск относятся к
содержимого файла. Накопленная статистика
позволит поместить эти
записей в начало файла и тем уменьшить
среднее время поиска. Для получения
указанной статистики можно на начальном
этапе обращений к файлу связать с каждой
записью счётчик числа запросов на её
поиск.