Дерево Хаффмана Исходный текст: AFABCDEABCAADEA A 6 6 B 2 2 C 2 2 D 2 2 E 2 2 F 1 1 15 4 9 5 3 A 6 0 B 2 100 C 2 101 D 2 110 E 2 1110 F 1 1111 Долой деревяшку! Недостатки дерева: • восстановить код символа – сложно. • сохранить/передать дерево декодеру – сложно. Достоинства дерева: • декодировать текст – просто! Выводы: • При декодировании лучше использовать дерево. • При кодировании дерево лучше чем-то заменить. Замена дереву 6 A 6 0 B 2 100 2 C 2 101 2 D 2 110 2 15 4 E 2 1110 2 F 1 1111 1 9 5 3 Оказывается, структура дерева и длины кодов символов жёстко связаны. Коды Хаффмана можно восстановить только по их длине, при условии, что символы объединяются по правилам упорядоченности! Алгоритм «без липы» Исходный текст: AFABCDEABCAADEA A 6 B 2 C 6 A 0 2 B 0 2 2 C 0 D 2 2 D 0 E 2 2 E 0 F 1 1 F 0 Формируем списки Объединение списков Объединить самые «лёгкие» списки Упорядочить списки 6 A 0 6 A 0 2 B 0 2 B 0 2 C 0 2 C 0 2 B 0 2 D 0 2 D 0 2 C 0 2 E 0 2 D 0 3 1 F 0 E 0+1 6 3 F 0+1 A 0 E 0+1 F 0+1 Объединение списков 6 A 0 6 A 3 E 1 4 C 0+1 D 0+1 2 B 0 3 E 1 F 2 C 0 2 B 0 2 D 0 F 1 0 1 Объединение списков 6 4 3 2 A C E B 0 1 1 0 D F 6 A 0 5 E 1+1 F 1+1 4 C D 1 1 1 1 B 0+1 Объединение списков 6 5 4 A E C 0 2 1 F D 2 B 6 A 0 9 E 2+1 1 F 2+1 B 1+1 C 1+1 D 1+1 1 9 E 3+1 F 3+1 B 2+1 C 2+1 D 2+1 A 0+1 Восстановление кодов Хаффмана код = 0 ЕСТЬ! 0 A 1 B 3 C 3 D 3 E 4 F 4 Ожидаемая длина кода=1 код +1 Ож.длина+0 Восстановление кодов Хаффмана код = 1 0 A 1 B 3 C 3 D 3 E 4 F 4 НЕТ Ожидаемая длина кода=1 код << 1 Ож.длина+1 Восстановление кодов Хаффмана код = 10 0 A 1 B 3 C 3 D 3 E 4 F 4 НЕТ Ожидаемая длина кода=2 код << 1 Ож.длина+1 Восстановление кодов Хаффмана код = 100 0 A 1 100 B 3 C 3 D 3 E 4 F 4 ЕСТЬ! Ожидаемая длина кода=3 код +1 Ож.длина+0 Восстановление кодов Хаффмана код = 101 0 A 1 100 B 3 101 C 3 D 3 E 4 F 4 ЕСТЬ! код +1 Ожидаемая длина кода=3 Ож.длина+0 Восстановление кодов Хаффмана код = 110 0 A 1 100 B 3 101 C 3 110 D 3 E 4 F 4 ЕСТЬ! код +1 Ожидаемая длина кода=3 Ож.длина+0 Восстановление кодов Хаффмана код = 111 0 A 1 100 B 3 101 C 3 110 D 3 E 4 F 4 НЕТ код <<1 Ожидаемая длина кода=3 Ож.длина+1 Восстановление кодов Хаффмана код = 1110 0 A 1 100 B 3 101 C 3 110 D 3 1110 E 4 F 4 ЕСТЬ! код +1 Ожидаемая длина кода=4 Ож.длина+0 Восстановление кодов Хаффмана код = 1111 0 A 1 100 B 3 101 C 3 110 D 3 1110 E 4 1111 F 4 ЕСТЬ! код +1 Ожидаемая длина кода=4 Ож.длина+0