NetNado
  Найти на сайте:

Учащимся

Учителям



1. /_Методички/Мультимедиа-системы. Архитектура, стандарты, алгоритмы.pdf
2. /_Методички/Организация ЭВМ 2006.doc
3. /_Методички/Основы сетевых технологий.djvu
4. /_Методички/Программирование/Биные Деревья Поиска/2_01БДПоиска.doc
5. /_Методички/Программирование/Биные Деревья Поиска/2_02БинДП.doc
6. /_Методички/Программирование/Биные Деревья Поиска/2_03СлучайБДП.doc
7. /_Методички/Программирование/Деревья Хаффмана/1.doc
8. /_Методички/Программирование/Деревья Хаффмана/1_1ДХафф.doc
9. /_Методички/Программирование/Деревья Хаффмана/1_2_3_ДХафф.doc
10. /_Методички/Программирование/Деревья Хаффмана/1_4_ДХафф.doc
11. /_Методички/Программирование/Деревья Хаффмана/1_5_ДХафф.doc
12. /_Методички/Программирование/Деревья Хаффмана/1_6_7_ДХафф.doc
13. /_Методички/Программирование/Деревья Хаффмана/1_8ДХафф.doc
14. /_Методички/Программирование/Деревья Хаффмана/1_9ДХафф.doc
15. /_Методички/Программирование/Деревья Хаффмана/ДерХафф full.doc
16. /_Методички/Программирование/Деревья Хаффмана/КарлКлара.doc
17. /_Методички/Программирование/Деревья Хаффмана/Кодируется текст АБРАКАДАБРА.doc
18. /_Методички/Программирование/Динамические СД/00Титул.rtf
19. /_Методички/Программирование/Динамические СД/0Введение.rtf
20. /_Методички/Программирование/Динамические СД/1Списки.doc
21. /_Методички/Программирование/Динамические СД/2СтекОчДек1.rtf
22. /_Методички/Программирование/Динамические СД/3Деревья.rtf
23. /_Методички/Программирование/Динамические СД/4прим_лит.rtf
24. /_Методички/Программирование/Динамические СД/5оглавление.doc
25. /_Методички/Программирование/Динамические СД/Динамическое программирование - Задача о перемножении матриц.doc
26. /_Методички/Программирование/Пособие по разработке корректных программ/00Титул1_3.doc
27. /_Методички/Программирование/Пособие по разработке корректных программ/01Введение.rtf
28. /_Методички/Программирование/Пособие по разработке корректных программ/1АлгоритмЕвклида.doc
29. /_Методички/Программирование/Пособие по разработке корректных программ/2ОсновыАналитВерифПрогРовно.doc
30. /_Методички/Программирование/Пособие по разработке корректных программ/3ИндуктФункции.doc
31. /_Методички/Программирование/Пособие по разработке корректных программ/4Массивы.doc
32. /_Методички/Программирование/Пособие по разработке корректных программ/5Поиск.doc
33. /_Методички/Программирование/Пособие по разработке корректных программ/ОглавФонар.doc
34. /_Методички/Программирование/Пособие по разработке корректных программ/СписЛит&УслОбознач.doc
35. /_Методички/Сетевые технологии.pdf
36. /_Методички/Средства моделирования вычислительных сетей.pdf
37. /_Методички/Управление вычислительными сетями.pdf
Учебное пособие Редактор А. В. Крейцер Издательство спбгэту «лэти» 1 97376, С. Петербург, ул. Проф. Попова, 5
2. Деревья поиска Идеально сбалансированные бинарные деревья
2 Случайные бинарные деревья поиска
Абракадабра!, содержащий 12 символов, включая специальный символ !
Задача кодирования сообщений. Префиксные коды и деревья Пусть задан алфавит
1 Код Фано-Шеннона
1 Метод Хаффмана
1 Реализация алгоритмов кодирования
1 Доказательство оптимальности кода Хаффмана Лемма 1
1 Энтропийная оценка средней длины кода
1 Динамическое кодирование по Хаффману
Абракадабра!, содержащий 12 символов, включая специальный символ !
Абракадабра!, содержащий 12 символов, включая специальный символ !
А. Ю. Алексеев с. А. Ивановский д. В. Куликов
При обучении программированию особую трудность вызывает работа с динамическими структурами данных
2. стеки и очереди спецификация стека и очереди
3 Определения дерева, леса, бинарного дерева. Скобочное представление
Примечания и библиографические указания
Списки
Задача о порядке перемножения матриц
С. А. Ивановский разработкакорректныхпрограм м санкт-Петербург 2003
Программирования
Разработка, доказательство корректности и анализ алгоритма
2. основы аналитической верификации программ основные правила аналитической верификации программ
3. индуктивные функции на последовательностях
4. корректность программ при работе с массивами
5. поиск в массиве линейный поиск
Разработка, доказательство корректности
Шень А. Программирование: теоремы и задачи: Учеб пособие

скачать doc



1.6. Доказательство оптимальности кода Хаффмана
Лемма 1. Пусть w1  w2  … wn  1  wn. Существует такой оптимальный префиксный код, что l1  l2  … ln  1  ln.

Доказательство. Пусть C = {c1, c2,…, cn} – некоторый оптимальный префиксный код, а  префиксный код, полученный из C  перестановкой i-го и j-го кодовых слов. Тогда и , а для имеем . Далее



Тогда из следует li  lj. Если же , то . За конечное число перестановок индексов i и j , удовлетворяющих условию , можно получить требуемое неравенство для li  и  lj.

Лемма 2. Пусть w1  w2  … wn  1  wn. Существует такой оптимальный префиксный код C, что l1  l2  … ln  1 = ln, и кодовые слова и различаются в точности последним символом.

Доказательство. Пусть C – некоторый оптимальный префиксный код, в котором l1  l2  … ln  1  ln (лемма 1), и пусть сn = (сn(1), сn(2),…, сn(ln)). Рассмотрим два случая.

Случай 1: нет кодового слова (сn(1), сn(2),…, сn(ln 1), 1  сn(ln)). В терминах дерева это означает, что имеет место одна из двух ситуаций



Поскольку код префиксный, то узел отец (n) не представляет кодового слова. Тогда узел n можно «поднять» на место его отца и, следовательно, уменьшить величину ln , а тем самым и длину полного кода = i=1..n wi li , что противоречит оптимальности кода C. Итак, случай 1 невозможен.

Случай 2: пусть для некоторого i1..n 1 существует кодовое слово сi = (сn(1), сn(2),…, сn(ln 1), 1  сn(ln)). Если i n 1, то утверждение леммы справедливо. Если же i n 1, то li = ln = l1. Переставим кодовые слова с номерами i  и n 1 (перевесим листья дерева). При этом значение = i=1..n wi li  не изменится, а новый префиксный код будет обладать желаемым (по лемме) свойством. Лемма 2 доказана.

При формулировке следующего утверждения будут использованы обозначения Wn и , как они определены в 1.4 при описании алгоритма Хаффмана. Кроме того, полную длину кода L будем записывать как функцию от набора весов Wn и кодового дерева Tn: L(Wn, Tn). Если Tn – оптимальное кодовое дерево (ОКД), то обозначим Lmin(Wn) = L(Wn, Tn).

Утверждение. Пусть  w1  w2  … wn  1  wn. Пусть – ОКД для , т. е. . Пусть


Тогда – ОКД для Wn , т. е.

.

Доказательство. По построению дерева справедливо

. (*)

С другой стороны пусть Tn – некоторое ОКД для набора весов Wn , а – такое ОКД для набора весов Wn , что удовлетворены все условия леммы 2, тогда

(**)

где – дерево, полученное из ОКД заменой поддерева из двух листьев с весами wn  1  и wn на лист с весом . Из неравенств (*) и (**) получаем требуемое равенство

,

завершая тем самым доказательство утверждения.

Фактически доказанное утверждение есть обоснование индуктивного перехода в доказательстве оптимальности дерева Хаффмана методом математической индукции. Действительно, мы показали, что из оптимальности предварительно построенного следует оптимальность дерева .
1.7. Неравенство Крафта
Оптимальное кодовое дерево определяет набор длин (l1l2, …, ln) кодовых слов, минимизирующий = i=1..n wi li  и учитывающий требование префиксности кода. Рассмотрим это требование более формально. Оказывается, что на вопрос о том, для каких заданных длин (li)1n кодовых слов существует префиксный код, можно дать точный ответ, найденный Л. Крафтом (L.G. Kraft).

Утверждение (неравенство Крафта). Для того, чтобы существовал префиксный код с длинами кодовых слов l1l2, …, ln , необходимо и достаточно выполнение неравенства

.

Доказательство. 1) Необходимость (из существования префиксного кода следует неравенство Крафта). Рассмотрим кодовое дерево, соответствующее префиксному коду с длинами кодовых слов l1l2, …, ln . Обозначим  число листьев на k-ом уровне (k = 0, 1,…, K, где K – максимальная длина кодового слова или высота кодового дерева). Очевидно, . Можно дать более точную оценку. Наличие листа на уровне i исключает узлов на уровне k (k  i). Если на уровне i имеется листьев, то они «обрывают» поддеревья с узлов на уровне k. Следовательно, число узлов на уровне k не превосходит

,

а следовательно

.

Отметим, что на последнем уровне неравенство «<» имеет место за счет того, что дерево может быть не строго бинарным, а код, соответственно, неполным. Разделив обе части полученного неравенства на и сгруппировав слагаемые, получим



или

.

Заменяя суммирование по уровням на суммирование по листьям, получаем

.

2) Достаточность (из неравенства Крафта следует существование префиксного кода). Пусть выполняется неравенство Крафта. Переходя от суммирования по листьям к суммированию по уровням, получим

.

Отсюда следует, что и для всех слагаемых выполняется

,

и, следовательно, для всех k 1..K

. (***)

Далее рассмотрим полное ровное дерево высоты K. Будем строить кодовое дерево по уровням от корня вниз, удаляя лишние узлы и ветки. Начнём с , которое может принимать значения 0, 1, 2. Выберем в соответствии с l1l2, …, ln . Рассмотрим . Очевидно, после нашего выбора на втором уровне останется 4  2 узлов, из которых нужно выбрать листьев. Поскольку в силу неравенства (***) имеем , то этот выбор возможен. Далее рассмотрим третий уровень. На нём свободных для выбора осталось узлов. Из неравенства (***) следует, что , т. е. опять-таки выбор листьев возможен. Повторяя этот процесс до k = K, получим требуемое кодовое дерево. Доказательство завершено.

Теперь можно сформулировать задачу построения оптимального префиксного кода, как задачу нахождения такого набора , который минимизирует при заданном наборе и при ограничениях: 1)  целые и для ; 2) (свойство префиксности).