DEV//UNIT

Кодирование Хаффмана

Частые символы — короткие коды: оптимальное префиксное сжатие.

время O(n log n)память O(n)уровень: средний
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
1function huffman(freqs: Array<[ch: string, n: number]>) {
2 // очередь с приоритетом: два самых редких сливаются в узел
3 const heap = freqs.map(([ch, n]) => ({ ch, n }))
4 while (heap.length > 1) {
5 heap.sort((a, b) => a.n - b.n)
6 const a = heap.shift()!
7 const b = heap.shift()!
8 heap.push({ ch: a.ch + b.ch, n: a.n + b.n })
9 }
10 return heap[0]! // корень дерева кодов
11}
12
13function codes(node: Tree, prefix = ''): Record<string, string> {
14 if (node.ch.length === 1) return { [node.ch]: prefix || '0' }
15 return {
16 ...codes(node.left!, prefix + '0'),
17 ...codes(node.right!, prefix + '1'),
18 }
19}

Проблема

Частые символы — короткие коды: оптимальное префиксное сжатие.

Что вы видите

Два самых редких сливаются в узел; код = путь по дереву. Ни один код не префикс другого.

Как это работает

Жадное слияние двух минимальных частот даёт оптимальный префиксный код (доказано). Сжатие без разделителей: decoder однозначен. ZIP/JPEG/MP3 строятся на этой идее.

Пошаговый разбор

  1. 01

    Частоты

    Считаем каждый символ.

  2. 02

    Слияния

    Два редких → узел.

  3. 03

    Коды

    Путь по дереву = код.

Complexity и ограничения

time
O(n log n)
space
O(n)

Сложность см. в шапке страницы.

Edge cases

  • Пустой вход

    Корректная тривиальная обработка.

  • Вырожденный случай

    Минимум работы — сразу ответ.

Где встречается в реальности

ZIP/GZIP

Deflate = Хаффман + LZ77.

JPEG/MP3

Кодирование коэффициентов.

Передача

Оптимальные коды при known-частотах.

Связанные алгоритмы

Shorts

«Почему ZIP сжимает: коды Хаффмана»

Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.

Shorts 9:16

Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.

Почему ZIP сжимает: коды Хаффмана
Нажмите Play
Бит 1/6 · 0–2 с
Hook
script-setup.ru/algorithms/huffman