Hacker News Digest

Тег: #huffman-coding

Постов: 1

Writing a competitive BZip2 encoder in Ada from scratch in a few days – part 2 (gautiersblog.blogspot.com)

День 2: строим дерево Хаффмана

Переписал bz2.adb на чистые структуры:
Bit_Writer, MTF, RLE, Burrows_Wheeler, Huffman.
Каждая структура = пакет + скрытый тип + конструктор Create, методы Encode, Flush, Reset.

Huffman

  • Считаем частоты 256 байт + 2 служебных символа (RUNA, RUNB).
  • Строим дерево: Node (частота, символ, левый, правый).
  • Сортируем список узлов по частоте, склеиваем два минимальных, повторяем, пока не останется один корень.
  • Коды длиной ≤ 20 бит (требование BZip2).
  • Генерируем таблицу Code_Length[0..257] и Code_Value[0..257].

Оптимизация

  • Если дерево выдаёт слишком длинные коды, увеличиваем частоты всех символов на 1 и перестраиваем — быстро сходится.
  • Память: дерево живёт только во время построения, затем храним только таблицы.

Интеграция
Huffman.Encode получает поток MTF/RLE-символов, пишет в Bit_Writer:

  1. 16-битная маска 0x425A ("BZ").
  2. 8-битная версия 0x68.
  3. Таблица длин кодов (передаём как 4-битные значения).
  4. Сами данные: коды Хаффмана + биты RLE-последовательностей.

Итог за день

  • 400 строк Ada, 0 зависимостей.
  • Код компилируется gnatmake -O2 bz2.adb за 0.3 с.
  • Тест: echo "abracadabra" | ./bz2 > out.bz2, bunzip2 принимает без ошибок.

Завтра: многопоточность и буферизация.

by ajdude • 13 августа 2025 г. в 14:47 • 116 points

ОригиналHN

#ada#bzip2#huffman-coding#burrows-wheeler-transform#move-to-front#run-length-encoding#compression#algorithms

Комментарии (8)

  • Участники обсуждают, нужно ли при обращении BWT хранить индекс первого символа: Nayuki утверждает, что это необходимо, а vintermann указывает на полностью биективный вариант без индекса.
  • Amy_petrik подчеркивает, что BWT переводит строку в «пространство суффиксных деревьев», что позволяет быстро искать внутри сжатых BZ2-файлов и лежит в основе современных ДНК/РНК-алгоритмов выравнивания.
  • Horizon2025 отмечает «магическую» обратимость преобразования при минимуме дополнительных данных.