Кодирование Хаффмана
Частые символы — короткие коды: оптимальное префиксное сжатие.
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 строятся на этой идее.
Пошаговый разбор
- 01
Частоты
Считаем каждый символ.
- 02
Слияния
Два редких → узел.
- 03
Коды
Путь по дереву = код.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
ZIP/GZIP
Deflate = Хаффман + LZ77.
JPEG/MP3
Кодирование коэффициентов.
Передача
Оптимальные коды при known-частотах.
Связанные алгоритмы
«Почему ZIP сжимает: коды Хаффмана»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.