← Все вопросы

код хаффмана как строить, дерево совсем не понимаю

Задан 2 месяца назад485 просмотров2 ответа
5

Задали разобрать алгоритм Хаффмана, надо построить коды для букв по их частотам. Например буквы с частотами: A=5, B=2, C=1, D=1.

Я читал что там какое-то дерево строят, объединяют самые редкие буквы... но у меня получается какая-то ерунда и коды не сходятся с ответом. Можете на этих частотах прям по шагам показать, как строится дерево и откуда берутся 0 и 1?

2 ответа

10
✓ Принятый ответ — помог автору

Хаффман строится снизу вверх. Главная идея: частым буквам — короткие коды, редким — длинные. Делаем так: каждый раз берём ДВЕ самые маленькие частоты, объединяем в один узел с суммой, и повторяем, пока не останется один узел.

Твои буквы: A=5, B=2, C=1, D=1.

Шаг 1. Два самых маленьких: C=1 и D=1. Объединяем → новый узел (CD)=2. Осталось: A=5, B=2, (CD)=2.

Шаг 2. Два самых маленьких: B=2 и (CD)=2. Объединяем → узел (BCD)=4. Осталось: A=5, (BCD)=4.

Шаг 3. Объединяем A=5 и (BCD)=4 → корень = 9. Всё, дерево готово.

Теперь расставляем биты: на каждой развилке левая ветка = 0, правая = 1 (можно наоборот, главное единообразно). Спускаемся от корня к каждой букве и собираем код:

корень
├─0─ A            -> A = 0
└─1─ (BCD)
     ├─0─ B       -> B = 10
     └─1─ (CD)
          ├─0─ C  -> C = 110
          └─1─ D  -> D = 111

Итого: A=0, B=10, C=110, D=111. Видишь — частая A получила 1 бит, редкие C и D по 3 бита. Это и есть смысл Хаффмана: экономим на частых.

Лайфхак чтоб не путаться: всегда выписывай частоты в строчку и на каждом шаге подчёркивай два наименьших. Если несколько одинаковых — бери любые два, ответ по длине кодов получится тот же.

И да — коды Хаффмана всегда удовлетворяют условию Фано (ни один не префикс другого), потому что буквы сидят только в листьях дерева.

3

Где обычно ошибаются: берут не два самых маленьких, а первые попавшиеся, или забывают, что новый объединённый узел ТОЖЕ участвует в следующих шагах наравне с буквами.

Быстрая самопроверка: посчитай сумму (частота × длина кода) по всем буквам — это общая длина закодированного текста, у правильного Хаффмана она минимальна. Если у соседа получилось меньше — где-то ты объединил не те узлы.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект