Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVET_OAIP.docx
Скачиваний:
22
Добавлен:
27.09.2019
Размер:
589.57 Кб
Скачать

31. Приложения деревьев.Дерево Хаффмана. (оставь здесь 10 шрифт!!!)

Приложения(широкое применение):1)Трансляторы таблиц решений;2)Создание и ведение таблиц символов;3)Экономическое кодирование сообщений;4)Решение арифметических выражений. Пусть требуется закодировать длинное сообщение в виде строки битов: А В А С С D А кодом, минимизирующим длину закодированного сообщения. 1) назначим коды:

Символ Код

A 010

B 100

C 000

D 111

Каждый символ тремя битами, получим строку: 010 100 010 000 000 111 010; А В А С С D А; 7*3=21 всего 21 бит - неэффективно

2) Сделаем иначе: предположим, что каждому символу назначен 2-битовый код

Символ Код

A 00

B 01

C 10

D 11

00 01 00 10 10 11 00

А В А С С D А Тогда кодировка требует лишь 14 бит.

3) Выберем коды, которые минимизируют длину сообщения по частоте вхождений символа в строку: много вхождений - код короткий, мало вхождений - код длинный.

А -3 раза, С -2 раза, В -1 раз, D -1 раз то-есть можно:1) использовать коды переменной длины;2)код одного символа не должен совпадать с кодом другого (раскодирование идет слева направо). Если А имеет код 0 т.к часто встречается, то В, С, D - начинаются с 1, если дальше 0,то это С, следующий может быть 0 или 1: 1 - D , 0 - В; то-есть В и D различаются по последнему биту, А -по первому, С - по второму, B и D - по третьему.

Символ Код

A 0

B 10

C 110

D 111

Таким образом, если известны частоты появления символов в сообщении, то метод реализует оптимальную схему кодирования. Частота появления группы символов равна сумме частот появления каждого символа. Сообщение АВАССDА кодируется как 0 | 10| 0| 110| 110| 111| 0 и требует лишь 13 бит. ABACCDA; В очень длинных сообщениях, которые содержат символы, встречающиеся очень редко - экономия существенна.Пример:

Рис. Дерево Хаффмена

32. Бинарная куча. Проверка основного свойства кучи.

Бинарной (двоичной) кучей (binary heap) называется массив, обладающей определенными свойствами упорядоченности.

для которого выполнены три условия:

  1. Значение в любой вершине не меньше, чем значения её потомков.

  2. Глубина листьев (расстояние до корня) отличается не более чем на 1 слой.

  3. Последний слой заполняется слева направо

  4. Каждая вершина содержит ключ и информацию

Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Heapify. Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов A и индекс i. Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент A[i].

Если i-й элемент больше, чем его сыновья, всё поддерево уже является кучей, и делать ничего не надо. В противном случае меняем местами i-й элемент с наибольшим из его сыновей, после чего выполняем Heapify для этого сына.

Процедура выполняется за время O(log n).

Основные операции с кучами:

  • Проверка основного свойства кучи Heapify время работы - O(logn)

  • Построение кучи из произвольного массива BuildHeap - O(n)

  • Сортировка массива без использования дополнительной памяти SortHeap -O(nlogn)

  • Извлечение наибольшего (очередь с приоритетами) ExtractMax -O(logn)

  • Мах - O(1)

  • Добавление элемента InsertHeap - O(logn)

Основное свойство кучи(HEAPIFY):

для любого i (кроме корня)

A[parent(i)]>=A[i](РОДИТЕЛЬ БОЛЬШЕ СВОИХ ПОТОМКОВ ИНАЧЕ ПОМЕНЯТЬ МЕСТАМИ)

Функция:

void Heap::Heapify(int ix){

int l=Left(ix),r=Right(ix),irl=ix;

if(l>0){

if(isGreat(Storage[l],Storage[ix])) irl=l;

if(r>0&&isGreat(Storage[r],Storage[irl])) irl=r;

if(irl!=ix){

Swap(ix,irl);

Heapify(irl);}}}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]