Как работает сжатие файлов?

19

Итак, сегодня я понял, что я принимаю сжатие файлов как должное. Возможность связать несколько файлов в один и получить их меньше, чем любой из них, это то, что я просто принимаю как факт, но как это на самом деле работает?

У меня есть ограниченные знания об этом, что включает в себя что-то, что можно заменить заменой всех дублирующихся записей указателями, чтобы сократить этот путь, но кроме этого, я довольно невежественен!

Поскольку я всегда открыт для новых знаний, так как я представляю, что большинство из нас здесь, я решил спросить. Итак, SuperUser, как на самом деле работает сжатие ?

Phoshi
источник
1
Статья Википедии является хорошим началом, но было бы неплохо иметь более конкретные объяснения. Хороший вопрос (хотя я был уверен, что у нас уже был такой вопрос, но кажется, что нет).
Gnoupi
2
@Gnoupi: Действительно, первое, что я сделал, - это поиск, так как был уверен, что он здесь есть. Видимо нет, поэтому я попытался исправить это: P
Phoshi
2
у нас есть тег «что есть», когда вы публикуете картинки и идете «wot izzit ??»; я заметил потребность в теге «как работает», но это слишком долго, и «как работает» звучит глупо. «объяснить» может сделать это, хотя.
Квик-кихот
@ Quackote: Ах, спасибо. Я искал в автозаполнении тег типа «plz-send-the-объяснение», но не смог его найти.
Phoshi
2
Я был близок к тому, чтобы просто создать тег «как» пару раз… но «объяснить», вероятно, лучше. «tutorial», «howto» и «beginner» все применимы, но не совсем подходят.
шарлатан-кихот

Ответы:

18

Сжатие без потерь

Сжатие без потерь - это когда данные не теряются. Все, что введено, может быть получено идеально. Это хорошо работает для текстовых или двоичных файлов, где будет замечена самая маленькая ошибка.

Сжатие файлов работает, принимая файл и сканируя шаблоны, и переводя эти шаблоны во что-то еще, что занимает меньше места.

Например, «AAAAAAAA» можно превратить в «8A».

Конечно, это не так, потому что тогда у вас возникает проблема, что если «8А» было в открытом тексте. Вы распакуете файл, и это будет неправильно. Хорошее место для начала - это Wikipedia или алгоритм сжатия данных LZW .

Ниже приведен простой псевдокод:

STRING = get input character
WHILE there are still input characters DO
    CHARACTER = get input character
    IF STRING+CHARACTER is in the string table then
        STRING = STRING+character
    ELSE
        output the code for STRING
        add STRING+CHARACTER to the string table
        STRING = CHARACTER
    END of IF
END of WHILE
output the code for STRING

Все сжатие использует словарь поиска, который используется для сжатия и распаковки файла. Чем больше словарь, тем больше вы можете сжать его, хотя вы сталкиваетесь с Законом убывающей отдачи .

Также стоит отметить, что сжатие не всегда приводит к уменьшению размера файла. Существуют ситуации (с небольшими файлами или при сжатии случайных данных ), когда вы не получите файл меньшего размера после сжатия. Были некоторые забавные проблемы, связанные с возможностью сжатия случайных данных.

Сжатие с потерями

Вышесказанное в основном относится к сжатию без потерь . Другие типы сжатия, используемые в видео / аудио приложениях, такие как MP3, JPG и h.264, являются примерами сжатия с потерями .

Сжатие с потерями работает путем отбрасывания данных, которые с наименьшей вероятностью будут замечены. В аудио это примерно 30 000 Гц и ниже 100 Гц, наряду с другими вещами. В картинке (статической) он удаляет различные вещи и объединяет пиксели вместе, а также отбрасывает данные.

Сжатие с потерями - это форма кодирования с преобразованием . Это усредняет данные, чтобы уменьшить общий размер. Например, блок из 10 пикселей на изображении, все немного разные цвета могут быть объединены в один цвет и, таким образом, сжаты.

При сжатии видео часто инструкции помещаются только в те перерисованные пиксели, которые изменились со времени последнего кадра или ключевого кадра .

Джош К
источник
Обратите внимание, что это объяснение только для сжатия без потерь, для которого вы можете восстановить точные исходные данные (наиболее вероятно используемые программами архивирования). Существуют другие виды сжатия, при которых вы теряете качество при меньшем размере, например, в JPG, MP3 и т. Д.
Gnoupi,
Первый пример Джоша - это форма реального метода сжатия, называемого Run-Length Encoding, и «8A» будет сжат до «181A». Очевидно, его последний абзац применим здесь; RLE лучше всего работает с данными со многими дубликатами.
Dour High Arch
3
Я добавил названия без потерь / с потерями и округлил их немного больше. Приятно отметить, что лучший способ понять это - просто прочитать статью в Википедии.
Джош К
5

Сжатие работает путем поиска шаблонов в данных, а затем замены этих шаблонов специальными шаблонами меньшего размера. Декомпрессия обратная: найдите специальные шаблоны и замените их на более крупные шаблоны, которые они представляют. Знание того, какие модели вероятны, важно; например, шаблоны, найденные в тексте, могут сильно отличаться от шаблонов, найденных на изображениях. Некоторые методы сжатия с потерями; они не гарантируют, что расширение восстановит ввод точно. Это обычно хорошо для аналоговых данных, таких как музыка и изображения, если потеря достаточно мала. Но такие данные, как текст, должны быть сжаты без потерь.

Важно понимать, что невозможно без потерь сжать случайные данные даже одним битом. Рассмотрим файл с N битами двоичных данных. Есть 2 ^ N возможных файлов. Если вы сжимаете какой-либо из этих файлов одним битом, поэтому размер сжатого файла составляет N-1 бит, существует только 2 ^ (N-1) возможных сжатых представления. Другими словами, каждый возможный сжатый файл должен представлять более одного возможного несжатого файла. Без уникального сжатого представления алгоритм распаковки не может гарантировать распаковку без потерь.

Фред
источник
3
файл может быть несжатым (прилагательное), но не может быть несжатым (глагол). вместо этого он распакован .
шарлатан-кихот