LZW-сжатие
Словарь фраз растёт на ходу; словарь не хранится — decoder строит его сам.
1function lzwEncode(input: string): number[] {2 const dict = new Map<string, number>()3 let next = 2564 for (let i = 0; i < 256; i++) dict.set(String.fromCharCode(i), i)5 6 const out: number[] = []7 let w = ''8 for (const ch of input) {9 const wc = w + ch10 if (dict.has(wc)) {11 w = wc // фраза уже в словаре — растим12 } else {13 out.push(dict.get(w)!) // выдать код w14 dict.set(wc, next++) // и выучить wc15 w = ch16 }17 }18 if (w) out.push(dict.get(w)!)19 return out20}Проблема
Словарь фраз растёт на ходу; словарь не хранится — decoder строит его сам.
Что вы видите
Видим знакомую фразу — растим; новую — выдаём код и выучиваем.
Как это работает
Каждая новая фраза получает код 256+. Декодер строит идентичный словарь из потока кодов — файл не хранит словарь. Повторяющиеся паттерны сжимаются экспоненциально.
Пошаговый разбор
- 01
Рост
Знакомая фраза — длиннее.
- 02
Выдача
Код текущей фразы.
- 03
Обучение
Новая фраза в словарь.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
GIF/TIFF
Классический формат с LZW.
compress
UNIX-утилита.
Modem
V.42bis сжатие.
Связанные алгоритмы
«GIF сжимает без словаря в файле»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.