- •Рекурсивные определения и вычисления. Рекурсивные функции и процедуры. Модель исполнения рекурсивных подпрограмм компьютером. (Лек 1.1)
- •. Рекурсивные определения и вычисления
- •If b then e1 else e2 (где e1, e2 - выражения)
- •Накапливающие параметры. (Лек 1.2)
- •Абстрактная модель последовательности и линейные сд (стек, очередь, дек). (Лек 4)
- •Аксиомы
- •Реализация с массивом
- •Алгоритм перестроения дерева Хаффмана
- •Идеально сбалансированные бинарные деревья. (Лек 8).
Реализация с массивом
Структура данных SW – массив (сортировка: около n log2 n операций).
Основные затраты связаны с операцией Insert.
Бинарный поиск места вставки на i-м шаге в массиве
из k = n i 1 элементов требует не более log2(k + 1) операций.
Как легко показать, суммарно за все n 1 шагов алгоритма это даст около n log2 n операций.
Вставка элемента в найденное место в массиве из k элементов требует в среднем около k/2 операций.
Суммарно по всем значениям k от 1 до n 1 это даст около n2/4 операций.
Итак, реализация алгоритма с использованием упорядоченного массива имеет сложность порядка n2.
Реализация со списками
Сначала создается упорядоченный список весов (на это требуется около n log2 n операций).
Всего около n log2 n
Реализация алгоритма Хаффмана с использованием пирамиды
Имеет сложность порядка n log2n.
Использует реализацию структуры SW на базе так называемой пирамиды
(бинарного дерева, обладающего свойством пирамидальности и размещенного в массиве – рассмотрим позднее).
В этом случае и операция извлечения минимального элемента, и операция вставки имеют сложность
порядка log2n.
Суммарно по всем шагам это дает сложность
порядка n log2n
Кодирование информации по Хаффману. Оптимальность метода. (Лек 6)
Энтропийная оценка оптимальной длины кода. (Лек 6)
Динамическое кодирование по Хаффману. Постановка задачи и идея алгоритма. (Лек 6)
Недостатки статического метода Хаффмана :
двухпроходность алгоритма (сначала вычисляются веса , затем строится дерево (код));
необходимость передавать кодовое дерево вместе с последовательностью закодированных сообщений.
Алгоритм перестроения дерева Хаффмана
Пусть дерево Хаффмана (ДХ) строится так, что левый сын имеет вес не больший, чем правый.
При этом ДХ, вообще говоря, не единственно.
Пример: заданы веса W4 = (5, 4, 3, 2).
Дерево Хаффмана является строго бинарным и содержит ровно 2n 1 узлов, n из которых являются листьями.
Действительно, пусть в строго бинарном дереве содержится n листьев (внешних узлов) и s внутренних узлов.
Тогда число исходящих из внутренних узлов веток есть 2s.
Подсчет этих же веток, как входящих во все узлы дерева, кроме корня, дает n + s 1.
Таким образом, 2s = n + s 1.
Отсюда следует s = n 1
и общее число узлов n + s = 2n 1.
В общем случае неубывающая последовательность весов x1 x2 x3 … x2n 1, получаемых в порядке взвешенного сочетания узлов в алгоритме Хаффмана, инвариантна для всех деревьев Хаффмана с заданными весами w1 w2 … wn 1 wn.
При этом внутренние узлы имеют веса x1 + x2, x3 + x4, …, x2n 3 + x2n 2 = x2n 1.
Строго бинарное упорядоченное дерево
А) n внешних узлов (листьев) получили веса (w1, w2, …, wn) в каком-то порядке, и каждый внутренний узел получил вес, равный сумме своих сыновей;
Б) 2n 1 узлов (внутренних и внешних) можно перечислить в такой последовательности (y1, y2, …, yn 1, yn), что если xi вес узла yi, то x1 x2 … x2n 1; узлы y2j 1 и y2j братья (сыновья одного отца).
упорядоченное дерево дерево Хаффмана