Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Primery_lectiy.doc
Скачиваний:
145
Добавлен:
20.06.2014
Размер:
722.43 Кб
Скачать

Деревья цифрового поиска

Методы цифрового поиска достаточно громоздки и плохо иллюстрируются. Поэтому мы кратко остановимся на наиболее простом механизме - бинарном дереве цифрового поиска. Как и в деревьях, обсуждавшихся в предыдущих разделах, в каждой вершине такого дерева хранится полный ключ, но переход по левой или правой ветви происходит не путем сравнения ключа-аргумента со значением ключа, хранящегося в вершине, а на основе значения очередного бита аргумента.

Поиск начинается от корня дерева. Если содержащийся в корневой вершине ключ не совпадает с аргументом поиска, то анализируется самый левый бит аргумента. Если он равен 0, происходит переход по левой ветви, если 1 - по правой. Если не обнаруживается совпадение ключа с аргументом поиска, то анализируется следующий бит аргумента и т.д., пока либо не будут проверены все биты аргумента, или мы не наткнемся на вершину с отсутствующей левой или правой ссылкой.

На рисунке 16 показан пример дерева цифрового поиска для некоторых заглавных букв латинского алфавита. Считается, что буквы кодируются в соответствии с кодовым набором ASCII, а для их представления и поиска используются 5 младших бит кода. Например, код буквы A равен 41(16), а представляться A будет как последовательность бит 00001.

Рис. 10.16.

  1. Алгоритмы поиска на графах.

Алгоритмы обхода дерева в глубину и в ширину можно модифицировать таким образом, чтобы их можно было использовать для систематического обхода всех вершин произвольного графа.

Например, используя рекурсивную процедуру, линейный по временной сложности алгоритм обхода графа Gв глубину можно записать следующим образом:

procedureОБХОД-В-ГЛУБИНУ(p: вершина);beginПосетить вершинуp;    for all q fromмножества вершин, смежных сpdo        if qеще не посещаласьthenОБХОД-В-ГЛУБИНУ(q)end    endend;begin    for all p fromмножества вершинGdo        if pеще не посещаласьthen ОБХОД-В-ГЛУБИНУ(p)end    endend.

В результате работы алгоритма пройденные ребра графа образуют вместе с посещенными вершинами одно или несколько деревьев (по одному дереву для каждой компоненты связности графа). Если приписать пройденным ребрам ориентацию в соответствии с тем направлением, в каком они проходятся при выполнении алгоритма, то мы получим совокупность ордеревьев, причем их корнями будут служить все те вершины, которые в процессе работы алгоритма помещались в пустой стек. Например, для графа, изображенного на рис. 11.1,а, описанным способом будут получены два ордерева, приведенных на рис. 11.1,б. Порядок на всем множестве вершин графа, а также порядок вершин, смежных всякой его вершине, соответствует алфавитному порядку букв, помечающих вершины.

Рис. 11.1. Граф и его обход в глубину

Нерекурсивный вариант алгоритма обхода графа Gв глубину может иметь следующий вид:

procedureОБХОД-В-ГЛУБИНУ-1(p: вершина);beginПосетить вершинуpи поместить ее в пустой стек S;    whileСтек S непустdo        Пустьp-- вершина, находящаяся на верхушке стека S;            ifуpесть непосещенные смежные вершиныthenПустьq-- непосещенная вершина, смежная вершинеp;                     Пройти по ребру (p,q), посетить вершинуqи поместить ее в стек S            elseУдалить вершинуpиз стека S            end    endend;

Обход в ширину связного графа предполагает рассмотрение всех его вершин в порядке возрастания расстояния от некоторой вершины, с которой начался данный обход графа. Например, в результате обхода графа G(рис. 11.1) в ширину возможен следующий порядок посещения вершин:C,A,B,D,H,K,L,E,F,G. Следующий алгоритм позволяет осуществить обход в ширину любого связного графаG:

procedureОБХОД-В-ШИРИНУ(p: вершина);beginПоместить вершинуpв пустую очередьO;    whileочередьOне пустаdoВзять первую вершинуpиз очередиO;            if pеще не посещаласьthenПосетить вершинуpи поместить в очередьOвсе вершины, смежные сp            end    endend;

Соседние файлы в папке Лекции