
- •Глава 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.5. Префиксный цифровой поиск
6.5.1. Префиксное дерево
При цифровом поиске
сравнение ключей связано не с проверкой
числового соотношения
,
а с последовательным учётом символов,
входящих в состав ключа поиска (как это
делается при поиске перевода данного
слова с помощью словаря). В качестве
ключа может использоваться любая строка
из символов данного алфавита (включая
символ конца слова). Например, ключ может
задаваться как последовательность цифр
и/или букв. На практике обычно, символы
алфавита кодируются числами.
Введём необходимые определения.
Алфавитом
будем называть конечный набор различных
символов
(включая символ конца слова
).
Словом в этом алфавите называется любой
набор его символов, заканчивающийся
символом
.
Решается задача поиска слов, которые, возможно, хранятся в базе данных («пробить по базе»).
База данных
реализована в виде
-арного
дерева, то
есть дерева, у которого каждый узел
является корнем не более чем
поддеревьев (иными словами, каждый узел
является родителем не более чем для
узлов).
Префиксом
узла уровня
называется последовательность
символов данного алфавита
(среди которых могут быть и совпадающие).
Префиксом корня является пустое слово
(состоящее только из символа конца
слова).
Узел уровня
— это
-мерный
вектор
;
каждая его компонента
соответствует определённому символу
алфавита и может иметь в качестве
значения:
- либо слово,
начинающееся с префикса узла — в том
случае, когда в базе
имеется единственное слово, начинающееся
с таким префиксом; именно оно является
целью поиска;
- либо ссылку на
узел уровня
,
если префикс не является законченным
словом, но в базе есть слова с таким
началом; в
-м
узле в этом случае следует смотреть
компоненту, соответствующую символу
префикса
- либо пустую
ссылку
,
если слова с таким префиксом в базе нет.
Реализованная таким образом база данных называется префиксным деревом (или лучом, или нагруженным деревом).
Пример. База данных состоит из слов
{лес, лето, лото, лотос, лось, мал, мала, мол, мел, мех, меха, место, смета, сом, соха, тол, холл}
в алфавите {м,
л,
х, с, т, а, о, ь, е,
}.
Символ конца слова
подразумевается присутствующим в конце
каждого слова (на рис. 42, изображающем
соответствующее префиксное дерево,
символ
заменён жирным подчёркиванием клетки
с полным словом). Префиксное дерево
содержит пять уровней, включая корень
.
Рис. 42.
6.5.2. Алгоритм префиксного поиска
Префиксный (или
лучевой)
поиск — это
поиск по префиксам в базе, представленной
префиксным деревом. Символы ключа обычно
представляются числами в диапазоне от
до
,
где символу конца слова соответствует
нуль, так что поиск называетсяцифровым.
Алгоритм.
Пусть
— указатель на дерево (то есть адрес
корня);
— ссылка на узел;
— вектор в текущем узле
;
ключ
,
где каждое
— символ алфавита;
— текущий номер символа в ключе.
╔
Ш1. Начальная установка.
—ссылка указывает
вначале на корень луча;
.
Ш2. Переход к узлу следующего уровня:
;
;
здесь
— компонента узлового вектора,
закреплённая
за символом
;
если
является ссылкой, то
перейти к Ш3;
если
является ключом, то
перейти к
Ш4
(— это единственный претендент на
совпадение с ключом поиска).
Ш3. Продвижение по лучу:
если
,
то
;
вернуться к Ш2;
если
,
то
ключ в базе данных отсутствует.
Ш4. Сравнение ключа со словом в соответствующей компоненте
вектора
:
если
,
то
ключ
найден,
указывает
на искомую запись;
иначе
ключ отсутствует.
╚
NB:
При неудачном поиске он завершается со
значением ключа
,
наиболее близким к
.
Префиксный поиск со вставкой. Алгоритм поиска легко дополняется до алгоритма поиска со вставкой отсутствующего ключа в базу: пустая ссылка в компоненте вектора на шаге Ш4 заменяется ключом поиска. Таким образом, подавая в корень очередные слова для поиска со вставкой, можно сформировать базу данных в виде префиксного дерева.
Бинарный цифровой
поиск.
Это частный
случай лучевого поиска по
-арному
дереву при
.
Каждый символ исходного алфавита
кодируется двоичным числом фиксированной
длины. Теперь очередной символ ключа
поиска — бит с возможными значениями
или
.
Эти значения определяют выбор ветки в
двоичном дереве при переходе к очередному
узлу.