Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных" - Presentation Transcript
Хакасский государственный университет им. Н.Ф. Катанова
Структуры и алгоритмы обработки данных
Лекция: Деревья
Николай Гребенщиков, www.grebenshikov.ru
Дерево - конечное множество T одного или более узлов со
следующими свойствами:
1. ∃ один выделенный узел, а именно - корень даннго дерева
T.
2. остальные узлы распределены среди m ≥ 0 непересека-
ющихся множеств T1, . . . , Tm, и каждое из этих множеств
является деревом (деревья T1, . . . , Tm называются подде-
ревьями).
Дерево - ориентированный, ацикличный, связный граф.
1
Дерево используется для представления иерархических свя-
зей типа “Один ко многим”.
Что можно представить в виде дерева?
2
Нотация
Корень
Родитель
Ребёнок
Предки
Потомки
Братья
5
Бинарное дерево - конечно множество узлов, которое мо-
жет быть либо пустым, либо состоять из корня с двумя дру-
гими бинарными поддеревьями
6
Обход дерева - метод исследования дерева, при котором
каждый узел песещается ровно один раз.
• Прямой порядок: корень, все поддеревья начиная с само-
го левого
• Обратный порядок
• Центрированный порядок (только для бинарного дерева)
7
Представление бинарных деревьев с помощью масси-
вов
A:
1 2 3 4 5 6 7
a b c d e f g
A[i] является родителем для A[2*i] и A[2*i+1], где A[2*i] и
A[2*i+1] левый и правый ребенок соответственно.
15
Реализация бинарных деревьев с помощью указателей
1 class BinaryTreeImpl<T> implements BinaryTree<T> {
2 BinaryTree<T> parent;
3 BinaryTree<T> left;
4 BinaryTree<T> right;
5 T data;
6 }
16
Применение бинарных деревьев: кодирование и сжатие
Символ Код №1 Код №2
a 000 000
b 001 11
c 010 01
d 011 001
e 100 10
bcd ⇒ 001 010 011 (Код №1) ⇒ 11 01 001 (Код №2)
17
Префиксный код в теории кодирования код со словом пе-
ременной длины, имеющий такое свойство: если в код входит
слово a, то для любой непустой строки b слова ab в коде не
существует. Хотя префиксный код состоит из слов разной
длины, эти слова можно записывать без разделительного
символа.
Идея сжатия: использовать для чаще встречающихся сим-
волов(слов) кодовые слова меньшей длинны, чем для реже
встречающихся.
В задаче построения префиксного кода для символов опре-
деленной строки даны символы строки и их вероятность.
Как построить?
18
Алгоритм Хаффмана
19
Алгоритм Хаффмана
1. Пока ∃ >1 дерева в лесу
2. i = идекс дерева с наименьшим весом, j = идекс дерева
со вторым наименьшим весом
3. Создаем новый узел с левым сыном i и правым сыном j
4. Заменяем в лесу i-е дерево новым деревом и ставим ему
вес как сумму весов i-го и j-го деревьев
5. Удаляем j-е дерево
20
Реализация леса для алгоритма Хаффмана
1 class HaffmanTree extends BinaryTreeImpl<String> {
2 public double weight;
3
4 public HaffmanTree(String str, double weight) {
5 super(str);
6 this.weight = weight;
7 }
8 }
9
10 HaffmanTree[] forest = new HaffmanTree[MAX_COUNT];
11 int forestLength = 0;
21
Основной цикл алгоритма Хаффмана
1 length=forestLength;
2 while (length > 1) {
3 swapInForest(getIndexWithMinWeight(), length-1);
4 forestLength--;
5 int min = getIndexWithMinWeight();
6 HaffmanTree newTree = new HaffmanTree(
7 forest[min].getData()+forest[length].getData(),
8 forest[min].weight + forest[length].weight);
9 newTree.setLeft(forest[min]);
10 newTree.setRight(forest[length]);
11 forest[min] = newTree;
12 }
22
Список литературы
• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и
алгоритмы. - М. : Издательский дом “Вильямс”, 2000.
сс.77-102.
• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-
мы: построение и анализ, 2-е издание. - М. : Издатель-
ский дом “Вильямс”, 2007. сс.274-281, 459-467.
• Кнут Д, Искусство программирования, том 1. Основные
алгоритмы, 3-е изд. - М. : Издательский дома “Вильямс”,
2000. сс.352-475.
23
0 comments
Post a comment