
- •Нелинейные структуры данных: классификация.
- •Деревья: ориентированные, упорядоченные и бинарные.
- •Представление деревьев в памяти компьютера: последовательное и связанное размещение элементов.
- •Операции над деревьями.
- •Графы и их представление в компьютере.
- •Матричное представление орграфов.
- •Связное представление орграфов.
- •Алгоритмы, оперирующие со структурами типа графа.
- •Поиск в глубину
- •Построение остова минимального веса
- •Построение эйлерова цикла
- •Поиск кратчайшего пути
- •Алгоритм поиска в ширину
- •Построение наибольшего паросочетания в двудольном графе
- •Алгоритм укладки графа на плоскости
- •Задачи поиска.
- •Исчерпывающий поиск: перебор с возвратом, метод ветвей и границ, динамическое программирование. Поиск с возвращением
- •Алгоритм поиска с возвращением
- •Метод ветвей и границ
- •Динамическое программирование
- •Быстрый поиск: бинарный и последовательный поиски в массивах, хеширование Бинарный поиск
- •Хеширование
- •Использование деревьев в задачах поиска: бинарные, случайные бинарные, оптимальные и сбалансированные деревья поиска.
- •Двоичные деревья
- •Сбалансированные двоичные деревья
- •Деревья оптимального поиска
- •Деревья цифрового поиска
- •Алгоритмы поиска на графах.
- •Внутренняя сортировка.
- •Сортировка включением
- •Обменная сортировка
- •Сортировка выбором
- •Сортировка разделением (Quicksort)
- •Сортировка с помощью дерева (Heapsort)
- •Сортировка со слиянием
- •Сравнение методов внутренней сортировки
- •Внешняя сортировка.
- •Прямое слияние
- •Естественное слияние
- •Сбалансированное многопутевое слияние
- •Многофазная сортировка
- •Улучшение эффективности внешней сортировки за счет использования основной памяти
- •Файлы: организация и обработка, представление деревьями: b-деревья. Классические b-деревья
- •Контрольные вопросы:
Деревья цифрового поиска
Методы цифрового поиска достаточно громоздки и плохо иллюстрируются. Поэтому мы кратко остановимся на наиболее простом механизме - бинарном дереве цифрового поиска. Как и в деревьях, обсуждавшихся в предыдущих разделах, в каждой вершине такого дерева хранится полный ключ, но переход по левой или правой ветви происходит не путем сравнения ключа-аргумента со значением ключа, хранящегося в вершине, а на основе значения очередного бита аргумента.
Поиск начинается от корня дерева. Если содержащийся в корневой вершине ключ не совпадает с аргументом поиска, то анализируется самый левый бит аргумента. Если он равен 0, происходит переход по левой ветви, если 1 - по правой. Если не обнаруживается совпадение ключа с аргументом поиска, то анализируется следующий бит аргумента и т.д., пока либо не будут проверены все биты аргумента, или мы не наткнемся на вершину с отсутствующей левой или правой ссылкой.
На рисунке 16 показан пример дерева цифрового поиска для некоторых заглавных букв латинского алфавита. Считается, что буквы кодируются в соответствии с кодовым набором ASCII, а для их представления и поиска используются 5 младших бит кода. Например, код буквы A равен 41(16), а представляться A будет как последовательность бит 00001.
Рис.
10.16.
Алгоритмы поиска на графах.
Алгоритмы обхода дерева в глубину и в ширину можно модифицировать таким образом, чтобы их можно было использовать для систематического обхода всех вершин произвольного графа.
Например, используя рекурсивную процедуру, линейный по временной сложности алгоритм обхода графа 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;