Популярный алгоритм DEFLATE использует кодирование Хаффмана поверх Lempel-Ziv.
В общем, если у нас есть случайный источник данных (= 1 бит энтропии / бит), никакое кодирование, включая Хаффмана, скорее всего не сожмет его в среднем. Если бы Лемпель-Зив был «идеальным» (что подходит для большинства классов источников, поскольку длина уходит в бесконечность), пост-кодирование с Хаффманом не помогло бы. Конечно, Лемпель-Зив не идеален, по крайней мере, с конечной длиной, и поэтому сохраняется некоторая избыточность.
Именно эта оставшаяся избыточность частично устраняет кодирование Хаффмана и тем самым улучшает сжатие.
Мой вопрос: почему эта оставшаяся избыточность успешно устранена кодированием Хаффмана, а не LZ? Какие свойства Хаффмана против LZ делают это возможным? Будет ли простой запуск LZ (то есть кодирование сжатых данных LZ с помощью LZ во второй раз) завершить что-то подобное? Если нет, то почему нет? Аналогично, сначала будет работать сжатие с Хаффманом, а затем - с помощью LZ, а если нет, то почему?
ОБНОВЛЕНИЕ: Понятно, что даже после LZ некоторая избыточность сохранится. Несколько человек высказали это мнение. Что неясно: почему Хаффман лучше обращается к этой оставшейся избыточности, чем к LZ? Что в этом уникального по сравнению с оригинальной избыточностью источника, где LZ работает лучше, чем Хаффман?