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.4. Метод Хаффмана
Элегантное решение (алгоритм) для задачи построения оптимального префиксного кода нашел Д.Хаффман (D.A. Haffman). Дадим описание этого алгоритма в рекурсивной форме.

Обозначим Wn = (wi)1n. Пусть набор Wn  упорядочен:

w1  w2  … wn  1  wn.

Если n = 2, то завершаем процесс кодирования, приписав сообщению с весом w1  код 1, а сообщению с весом w2  – код 0. Иначе (т. е. при n  2) выполняем следующие действия:

  1. Из минимальных весов wn  1  и  wn образуем .

  2. Из набора Wn исключаем элементы wn  1  и  wn и добавляем в него новый элемент . Полученный набор обозначим .

  3. Решаем таким же способом задачу с набором весов , а затем в полученном решении заменяем узел (лист) на поддерево из двух листьев wn  1  и  wn, приписав им коды 1 и 0, соответственно.

Ясно, что набор весов изменится ровно n – 1 раз, и алгоритм содержит n – 1 шаг, что легко записать и в итеративном виде (см. далее 1.5).

В алгоритме Хаффмана дерево строится «снизу вверх». Узлы с наименьшими весами wn  1  и  wn образуют поддерево, которое заменяется на узел , который в свою очередь далее в нужный момент участвует в подобном объединении. Схематично это можно изобразить так:



Доказательство оптимальности кода Хаффмана будет дано далее в 1.6.

Пример 1. Пусть дано (тот же пример, что и в 1.1)


wi

3

2

1

1

i

А

Б

В

Г

Работу алгоритма схематично изобразим следующим образом

3(А), 2(Б), 1(В), 1(Г)

3(А), 2(Б), 2(ВГ)

4(БВГ), 3(А)

7(АБВГ)

З
десь пара объединяемых на данном шаге «символов» подчеркнута. Результат замены узлов wn  1  и  wn на узел отображается на следующей строке. Фактически эта запись представляет в перевернутом виде дерево

Код получился таким же, как и в 1.1.

Пример 2. Пусть дано (тот же пример, что и в 1.2)


wi

8

3

3

3

3

i

А

Б

В

Г

Д


Алгоритм Хаффмана по шагам даёт следующее.

8(А), 3(Б), 3(В), 3(Г), 3(Д)

8(А), 6(ГД), 3(Б), 3(В)

8(А), 6(ГД), 6(БВ)

12(БВГД), 8(А)

20(АБВГД)

Получаем дерево Хаффмана

Полученный код есть


wi

8

3

3

3

3

i

А

Б

В

Г

Д

ci

0

100

101

110

111


Это тот же код, который приводился в 1.2 как альтернатива коду Фано-Шеннона. Для него в 1.2 было получено L = 44 бита, и это оптимальный код.

Пример 3. Пусть дано


wi

6

4

3

2

1

i

А

Б

В

Г

Д


Вариант 1. Алгоритм Хаффмана по шагам даёт следующее.

6(А), 4(Б), 3(В), 2(Г), 1(Д)

6(А), 4(Б), 3(В), 3(ГД)

6(А), 6(ВГД), 4(Б)

10(БВГД), 6(А)

16(АБВГД)

Получаем дерево Хаффмана



и код


wi

6

4

3

2

1

i

А

Б

В

Г

Д

ci

0

10

110

1111

1110


Полная длина кода есть L = 61+42+33+4(2+1) = 35 бит.

Вариант 2. Отличие на третьем шаге.

6(А), 4(Б), 3(В), 2(Г), 1(Д)

6(А), 4(Б), 3(В), 3(ГД)

6(ВГД), 6(А), 4(Б)

10(АБ), 6(ВГД)

16(АБВГД)


Получаем другое дерево Хаффмана

и код


wi

6

4

3

2

1

i

А

Б

В

Г

Д

ci

11

10

00

011

010


Полная длина кода есть L = 2(6+4+3)+3(2+1) = 35 бит.

Сравнивая варианты 1 и 2, видим, что полная длина кода L  в них одинакова, но коды разные. Более того, максимальная длина кодового слова для варианта 1 равна 4, а для варианта 2 равна 3. Неоднозначность возникает при наличии нескольких кандидатов с равным весом для объединения узлов. Если в случае равных весов при объединении узлов раньше использовать те из них, которые были получены раньше (в частности листья), то, оказывается [*], что получим дерево (код) с минимальным значением высоты (длины кодового слова) среди всех деревьев (кодов), которые минимизируют = i=1..n wi li .