Как DEFLATE так сильно оптимизирует это?

#compression #gzip #zlib #deflate #lz77

#сжатие #gzip #zlib #deflate #lz77

Вопрос:

Я пытаюсь понять алгоритм deflate, и я прочитал о кодах Хаффмана, а также о сжатии LZ77. Я играл с размерами сжатия разных строк и наткнулся на то, что не мог объяснить. Строка aaa при сжатии, как через zlib, так и через gzip, оказывается того же размера, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa что и (36 a с).

Прежде чем читать об этом, я бы предположил, что компрессор выполняет что-то вроде хранения 36 * a вместо каждого символа по отдельности, но я не смог найти нигде в спецификациях, где это упоминается.

Использование фиксированного кода Хаффмана дало тот же результат, поэтому я предполагаю, что экономия места заключается в LZ77, но при этом используются только пары расстояние-длина. Как это позволит строке длиной 3 расширяться в 12 раз без увеличения размера?

Прерывание строки a s одним или несколькими b s в середине резко увеличивает размер. Если пары расстояния и длины — это то, что делает работу, почему она не может просто пропустить b s при поиске в обратном направлении? Или используются коды Хаффмана, и я неправильно понял, что подразумевают фиксированные коды Хаффмана?

Ответ №1:

36 «a» эффективно кодируются LZ77 по длине выполнения, предоставляя первую «a» в качестве литерала, а затем совпадение с расстоянием в единицу и длиной 35. Длина может достигать 258 для deflate.

Поищите в Интернете учебные пособия по LZ77, кодированию Хаффмана и deflate. Вы можете разобрать полученные сжатые данные с помощью infgen, чтобы получить более полное представление о том, как данные представляются.

Комментарии:

1. Ах, это имеет смысл, так что в основном это просто перебор поискового буфера. Спасибо!