Найти тему
SoftAppNews

Принцип сжатия данных в архиве

Оглавление

Цель моей статьи рассказать на простых примерах, как работает сжатие данных в архиве. На моем Телеграм канале проводился опрос на эту тему, и было много желающих узнать о принципе сжатия данных в архиве.

Итак вопрос заключался в том, как данные имеющие условно размер в 10МБ в сжатом виде в архиве начинают занимать намного меньше места?!

Давайте начну с того, что расскажу что существует несколько типов сжатия, так называемый "с потерями" и "без потерь". Это условное разделение. По названию понятно, что в одном случае данные сжимаются с какими-то потерями, и восстановить исходный уже не получится, а второй говорит о том, что как бы не был сжат файл, всегда можно восстановить исходный.

Итак сжатие "с потерями" используется в основном для видео, музыки и картинок. К примеру если мы возьмем обычную картинку размером 1200x1200 пикселей и сожмем ее до размера например 500x500, то занимаемый ей объем на жестком диске будет существенно снижен. Но вот восстановить исходный размер 1200 на 1200 без потери качества из картинки 500 на 500 уже не выйдет. Это не алгоритм сжатия это простой пример, объясняющий общие принципы работы енкодера. Енкодер не обязательно сжимает именно размер картинок, он может манипулировать другими параметрами, но суть остается сутью.

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

Для сжатия без потерь используются другие алгоритмы, и я постараюсь объяснить на очень простом примере. Смотрите, к примеру у нас есть вот такой текст:

Пример текста для сжатия
Пример текста для сжатия

Подумайте как мы можем уменьшить объем этого текста, не теряя его исходного содержания? Может кто в детстве игрался с шифрами и знает?

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

Выделим к примеру в тексте слово Lorem и посмотрим сколько раз оно встречается:

-3

В данном тексте слово встречается 4 раза. Можем заменить его на какой-то символ, пусть будет 🔶. Получится что-то вроде этого:

-4

Теперь выделим сочетание букв, к примеру an:

-5

Уже гораздо больше совпадений. И заменим их значком🟢:

-6

Визуально может и не сильно заметно разницу, но для подсчета битов в тексте, объем будет уменьшен, так как 2 символа были заменены на 1.

Собственно, можно брать и заменять не сочетания букв, а слова целиком и тогда чем больше будет повторяемых слов, тем меньше окажется текст в итоге.

Теперь давайте применим инструменты. Возьмем и подсчитаем в этом же тексте количество слов и их повторяемость

Подсчет слов
Подсчет слов

У нас даже получится некая сортировка слов, которые повторяются чаще всего. В данном случае видно, что это слова "the", "lorem", "ipsum" и "of". Заменив только 4 этих слова на один символ, мы уже получим существенное сокращение текста, давайте попробуем

-8

Снова берем исходный текст без изменений и заменяем слова:
the - T
lorem - L
ipsum - I
of - O

-9

Даже на таком незначительном уменьшении видно, что текст так же занимает 8 строк, но 8 строка уже существенно сократилась до 3 символов.

Думаю с текстом мысль понятна. Конечно архиваторы при сжатии не символы текста сокращают а их составляющие из бинарного кода 1 и 0, но принцип тот же.

Текст понятно, а как картинки и прочее?

А с картинками и прочим все тоже самое. Нужно помнить, что файл на жестком диске это не текст, даже если мы его видим как текст. Это набор из 1 и 0 в определенной последовательности. Программа может выбирать не символы в картинках или текстах, она может выбирать последовательность этих самых 1 и 0 и сокращать эти последовательности до 1 символа, точна указывая себе некую карту где и какие символы были заменены, чтобы вернуть обратно, когда нужно распаковать архив.

Коротко об алгоритмах

Надеюсь общий смысл работы сжатия мне удалось объяснить. Но наверняка задается вопрос, а ведь существует множество алгоритмов сжатия и чем они отличаются? А отличаются они как раз тем, что по разному выбирают последовательности этих самых символов и по разному их заменяют. Поэтому одни алгоритмы лучше подходят текстам, другие картинкам и видео. Сам корневой принцип сжатия без потерь остается тем же самым. Программа сначала анализирует файл перед сжатием, чтобы выбрать наиболее удачные последовательности, которые можно заменить. Затем она составляет карту замен этих последовательностей, чтобы правильно вернуть символы на место при распаковке. Конечно, эта самая карта тоже занимает место, именно поэтому часто маленькие файлы сжатые в архиве могут весить больше, чем без архива, потому что карта получается тяжелее текста, который мы сжимали. Потом при распаковке, программа пользуясь этой самой картой восстанавливает исходные символы.

P.S.

Надеюсь я ответил на ваши вопросы, если нет, просьба писать комментарии в моем Телеграм канале и здесь на Zen.