Сжатие без потерь — это класс сжатия данных , который позволяет идеально восстановить исходные данные из сжатых данных без потери информации . Сжатие без потерь возможно, поскольку большинство реальных данных демонстрируют статистическую избыточность . [1] Напротив, сжатие с потерями позволяет восстановить только приближение исходных данных , хотя обычно со значительно улучшенными показателями сжатия (и, следовательно, уменьшенными размерами носителей).
Используя принцип «ящика» , ни один алгоритм сжатия без потерь не может уменьшить размер всех возможных данных: некоторые данные станут длиннее как минимум на один символ или бит.
Алгоритмы сжатия обычно эффективны для документов, читаемых человеком и машиной, и не могут уменьшить размер случайных данных, которые не содержат избыточности . Существуют различные алгоритмы, которые разработаны либо с учетом определенного типа входных данных, либо с определенными предположениями о том, какие виды избыточности, вероятно, будут содержать несжатые данные.
Сжатие данных без потерь используется во многих приложениях. Например, оно используется в формате файла ZIP и в инструменте GNU gzip . Оно также часто используется как компонент в технологиях сжатия данных с потерями (например, предварительная обработка стереозвука без потерь mid/side с помощью кодировщиков MP3 и других кодировщиков аудио с потерями). [2]
Сжатие без потерь используется в случаях, когда важно, чтобы исходные и распакованные данные были идентичны, или когда отклонения от исходных данных были бы неблагоприятными. Обычными примерами являются исполняемые программы, текстовые документы и исходный код. Некоторые форматы файлов изображений, такие как PNG или GIF , используют только сжатие без потерь, в то время как другие, такие как TIFF и MNG, могут использовать как методы сжатия без потерь, так и методы сжатия с потерями. Форматы аудио без потерь чаще всего используются для архивирования или производства, в то время как меньшие аудиофайлы с потерями обычно используются на портативных плеерах и в других случаях, когда дисковое пространство ограничено или точная репликация аудио не нужна.
Большинство программ сжатия без потерь выполняют две операции последовательно: на первом этапе создается статистическая модель для входных данных, а на втором этапе эта модель используется для сопоставления входных данных с последовательностями битов таким образом, что «вероятные» (т. е. часто встречающиеся) данные будут давать более короткие выходные данные, чем «маловероятные» данные.
Основными алгоритмами кодирования, используемыми для создания битовых последовательностей, являются кодирование Хаффмана (также используемое алгоритмом deflate ) и арифметическое кодирование . Арифметическое кодирование достигает показателей сжатия, близких к наилучшим возможным для конкретной статистической модели, которая задается информационной энтропией , тогда как сжатие Хаффмана проще и быстрее, но дает плохие результаты для моделей, которые имеют дело с вероятностями символов, близкими к 1.
Существует два основных способа построения статистических моделей: в статической модели данные анализируются и строится модель, затем эта модель сохраняется вместе со сжатыми данными. Этот подход прост и модульен, но имеет тот недостаток, что сама модель может быть дорогой для хранения, а также то, что он заставляет использовать одну модель для всех сжимаемых данных и поэтому плохо работает с файлами, содержащими неоднородные данные. Адаптивные модели динамически обновляют модель по мере сжатия данных. И кодер, и декодер начинают с тривиальной модели, что приводит к плохому сжатию исходных данных, но по мере того, как они узнают больше о данных, производительность улучшается. Большинство популярных типов сжатия, используемых на практике, теперь используют адаптивные кодеры.
Методы сжатия без потерь можно классифицировать в соответствии с типом данных, для сжатия которых они предназначены. Хотя, в принципе, любой алгоритм сжатия без потерь общего назначения ( универсальный означает, что он может принимать любую битовую строку) может использоваться для любого типа данных, многие из них не способны достичь значительного сжатия данных, которые не имеют формы, для сжатия которой они были разработаны. Многие из методов сжатия без потерь, используемых для текста, также достаточно хорошо работают для индексированных изображений .
Эти методы используют преимущества специфических характеристик изображений, таких как распространенное явление смежных 2-D областей схожих тонов. Каждый пиксель, кроме первого, заменяется разницей с его левым соседом. Это приводит к тому, что малые значения имеют гораздо большую вероятность, чем большие значения. Это часто применяется также к звуковым файлам и может сжимать файлы, содержащие в основном низкие частоты и низкую громкость. Для изображений этот шаг можно повторить, взяв разницу с верхним пикселем, а затем в видео можно взять разницу с пикселем в следующем кадре.
Иерархическая версия этой техники берет соседние пары точек данных, сохраняет их разность и сумму, и на более высоком уровне с более низким разрешением продолжает с суммами. Это называется дискретным вейвлет-преобразованием . JPEG2000 дополнительно использует точки данных из других пар и коэффициенты умножения, чтобы смешать их с разностью. Эти коэффициенты должны быть целыми числами, так что результат будет целым числом при любых обстоятельствах. Таким образом, значения увеличиваются, увеличивая размер файла, но распределение значений может быть более пиковым. [ необходима цитата ]
Адаптивное кодирование использует вероятности из предыдущего образца при кодировании звука, из левого и верхнего пикселя при кодировании изображения и дополнительно из предыдущего кадра при кодировании видео. В вейвлет-преобразовании вероятности также передаются через иерархию. [3]
Многие из этих методов реализованы в открытых и фирменных инструментах, в частности LZW и его вариантах. Некоторые алгоритмы запатентованы в Соединенных Штатах и других странах, и их законное использование требует лицензирования держателем патента. Из-за патентов на определенные виды сжатия LZW и, в частности, практики лицензирования держателем патента Unisys, которую многие разработчики считали злоупотребляющей, некоторые сторонники открытого исходного кода призывали людей избегать использования формата Graphics Interchange Format (GIF) для сжатия неподвижных файлов изображений в пользу Portable Network Graphics (PNG), который объединяет алгоритм deflate на основе LZ77 с выбором фильтров прогнозирования, специфичных для домена. Однако патенты на LZW истекли 20 июня 2003 года. [4]
Многие из методов сжатия без потерь, используемых для текста, также достаточно хорошо работают и для индексированных изображений , но есть и другие методы, которые не работают для обычного текста, но полезны для некоторых изображений (особенно простых растровых изображений), а также другие методы, которые используют преимущества специфических характеристик изображений (таких как распространенное явление смежных двумерных областей схожих тонов и тот факт, что цветные изображения обычно имеют преобладание ограниченного диапазона цветов из тех, которые представлены в цветовом пространстве).
Как упоминалось ранее, сжатие звука без потерь — это несколько специализированная область. Алгоритмы сжатия звука без потерь могут использовать повторяющиеся шаблоны, показанные волнообразной природой данных — по используя авторегрессионные модели для прогнозирования «следующего» значения и кодирования (возможно, небольшой) разницы между ожидаемым значением и фактическими данными. Если разница между прогнозируемыми и фактическими данными (называемая ошибкой ) имеет тенденцию быть небольшой, то определенные значения разницы (например, 0, +1, −1 и т. д. в значениях выборки) становятся очень частыми, что можно использовать, кодируя их в нескольких выходных битах.
Иногда бывает полезно сжимать только различия между двумя версиями файла (или, в сжатии видео , последовательными изображениями в последовательности). Это называется дельта-кодированием (от греческой буквы Δ , которая в математике обозначает разницу), но этот термин обычно используется только в том случае, если обе версии имеют смысл вне компрессии и декомпрессии. Например, в то время как процесс сжатия ошибки в вышеупомянутой схеме сжатия звука без потерь можно было бы описать как дельта-кодирование от аппроксимированной звуковой волны до исходной звуковой волны, аппроксимированная версия звуковой волны не имеет смысла ни в каком другом контексте.
Ни один алгоритм сжатия без потерь не может эффективно сжать все возможные данные
. По этой причине существует множество различных алгоритмов, которые разработаны либо с учетом определенного типа входных данных, либо с определенными предположениями о том, какие виды избыточности, вероятно, будут содержаться в несжатых данных.Ниже перечислены некоторые из наиболее распространенных алгоритмов сжатия без потерь.
compress
и утилите UnixПосмотреть список кодеков видео без потерь
Криптосистемы часто сжимают данные («открытый текст») перед шифрованием для дополнительной безопасности. При правильной реализации сжатие значительно увеличивает расстояние уникальности , удаляя шаблоны, которые могут облегчить криптоанализ . [9] Однако многие обычные алгоритмы сжатия без потерь создают заголовки, оболочки, таблицы или другие предсказуемые выходные данные, которые вместо этого могут облегчить криптоанализ. Таким образом, криптосистемы должны использовать алгоритмы сжатия, выходные данные которых не содержат этих предсказуемых шаблонов.
Алгоритмы генетического сжатия (не путать с генетическими алгоритмами ) — это последнее поколение алгоритмов без потерь, которые сжимают данные (обычно последовательности нуклеотидов) с использованием как обычных алгоритмов сжатия, так и специальных алгоритмов, адаптированных к генетическим данным. В 2012 году группа ученых из Университета Джонса Хопкинса опубликовала первый алгоритм генетического сжатия, который не полагается на внешние генетические базы данных для сжатия. HAPZIPPER был адаптирован для данных HapMap и достигает более чем 20-кратного сжатия (уменьшение размера файла на 95%), обеспечивая сжатие в 2–4 раза лучше, чем ведущие универсальные утилиты сжатия. [10]
Алгоритмы сжатия геномной последовательности, также известные как компрессоры последовательностей ДНК, исследуют тот факт, что последовательности ДНК имеют характерные свойства, такие как инвертированные повторы. Наиболее успешными компрессорами являются XM и GeCo. [11] Для эукариот XM немного лучше по коэффициенту сжатия, хотя для последовательностей размером более 100 МБ его вычислительные требования непрактичны.
Самораспаковывающиеся исполняемые файлы содержат сжатое приложение и декомпрессор. При запуске декомпрессор прозрачно распаковывает и запускает исходное приложение. Это особенно часто используется в демо -кодировании, где проводятся соревнования для демонстраций со строгими ограничениями по размеру, вплоть до 1k . Этот тип сжатия не ограничивается строго бинарными исполняемыми файлами, но может также применяться к скриптам, таким как JavaScript .
Алгоритмы сжатия без потерь и их реализации регулярно тестируются в сравнительных тестах . Существует ряд более известных тестов сжатия. Некоторые тесты охватывают только коэффициент сжатия данных , поэтому победители в этих тестах могут быть непригодны для повседневного использования из-за низкой скорости лучших исполнителей. Другим недостатком некоторых тестов является то, что их файлы данных известны, поэтому некоторые авторы программ могут оптимизировать свои программы для лучшей производительности на определенном наборе данных. Победители в этих тестах часто принадлежат к классу программного обеспечения для сжатия с микшированием контекста .
Мэтт Махони в своем издании бесплатной брошюры « Объяснение сжатия данных» за февраль 2010 года дополнительно перечисляет следующее: [12]
На сайте Compression Ratings опубликована сводная диаграмма «границы» коэффициента сжатия и времени. [15]
Инструмент анализа сжатия [16] — это приложение Windows, которое позволяет конечным пользователям сравнивать характеристики производительности потоковых реализаций LZF4, Deflate, ZLIB, GZIP, BZIP2 и LZMA, используя их собственные данные. Он производит измерения и диаграммы, с помощью которых пользователи могут сравнивать скорость сжатия, скорость распаковки и степень сжатия различных методов сжатия, а также изучать, как уровень сжатия, размер буфера и операции очистки влияют на результаты.
Алгоритмы сжатия данных без потерь не могут гарантировать сжатие для всех входных наборов данных. Другими словами, для любого алгоритма сжатия данных без потерь будет набор входных данных, который не станет меньше при обработке алгоритмом, и для любого алгоритма сжатия данных без потерь, который делает хотя бы один файл меньше, будет хотя бы один файл, который он сделает больше. Это легко доказать с помощью элементарной математики, используя аргумент подсчета, называемый принципом пихонного отверстия , следующим образом: [17] [18]
Большинство практических алгоритмов сжатия предоставляют возможность «выходного» режима, который может отключить нормальное кодирование для файлов, которые станут длиннее при кодировании. Теоретически, требуется только один дополнительный бит, чтобы сообщить декодеру, что нормальное кодирование было отключено для всего ввода; однако большинство алгоритмов кодирования используют для этой цели по крайней мере один полный байт (а обычно больше одного). Например, сжатые файлы deflate никогда не должны увеличиваться более чем на 5 байт на 65 535 байт ввода.
Фактически, если мы рассмотрим файлы длиной N, если бы все файлы были равновероятны, то для любого сжатия без потерь, которое уменьшает размер некоторого файла, ожидаемая длина сжатого файла (усредненная по всем возможным файлам длины N) обязательно должна быть больше N. [19] Поэтому, если мы ничего не знаем о свойствах данных, которые мы сжимаем, мы могли бы вообще не сжимать их. Алгоритм сжатия без потерь полезен только тогда, когда мы с большей вероятностью сжимаем определенные типы файлов, чем другие; тогда алгоритм может быть разработан для лучшего сжатия этих типов данных.
Таким образом, главный урок из аргумента заключается не в том, что человек рискует большими потерями, а в том, что он не может всегда выигрывать. Выбор алгоритма всегда подразумевает выбор подмножества всех файлов, которые станут полезно короче. Это теоретическая причина, по которой нам нужно иметь разные алгоритмы сжатия для разных типов файлов: не может быть алгоритма, который был бы хорош для всех типов данных.
«Трюк», который позволяет алгоритмам сжатия без потерь, используемым на типе данных, для которых они были разработаны, последовательно сжимать такие файлы в более короткую форму, заключается в том, что файлы, для которых разработаны алгоритмы, все имеют некоторую форму легко моделируемой избыточности , которую алгоритм призван удалить, и, таким образом, принадлежат к подмножеству файлов, которые этот алгоритм может сделать короче, тогда как другие файлы не будут сжаты или даже станут больше. Алгоритмы, как правило, довольно специфически настроены на определенный тип файла: например, программы сжатия аудио без потерь плохо работают с текстовыми файлами, и наоборот.
В частности, файлы случайных данных не могут быть последовательно сжаты любым мыслимым алгоритмом сжатия данных без потерь; действительно, этот результат используется для определения концепции случайности в сложности Колмогорова . [20]
Доказано, что невозможно создать алгоритм, который может сжимать любые данные без потерь. Хотя за эти годы было много заявлений о том, что компании достигли «идеального сжатия», когда произвольное число N случайных битов всегда может быть сжато до N − 1 бит, подобные заявления можно смело отбросить, даже не рассматривая какие-либо дополнительные подробности относительно предполагаемой схемы сжатия. Такой алгоритм противоречит фундаментальным законам математики, поскольку, если бы он существовал, его можно было бы применять многократно для сокращения любого файла до длины 1 без потерь. [18]
С другой стороны, также было доказано [21] , что не существует алгоритма для определения того, является ли файл несжимаемым в смысле сложности Колмогорова. Следовательно, возможно, что любой конкретный файл, даже если он кажется случайным, может быть значительно сжат, даже включая размер декомпрессора. Примером являются цифры математической константы pi , которые кажутся случайными, но могут быть сгенерированы очень маленькой программой. Однако, даже если невозможно определить, является ли конкретный файл несжимаемым, простая теорема о несжимаемых строках показывает, что более 99% файлов любой заданной длины не могут быть сжаты более чем на один байт (включая размер декомпрессора).
Абстрактно, алгоритм сжатия можно рассматривать как функцию последовательностей (обычно октетов). Сжатие успешно, если полученная последовательность короче исходной последовательности (и инструкций для карты распаковки). Чтобы алгоритм сжатия был без потерь , карта сжатия должна формировать инъекцию из «простых» в «сжатые» битовые последовательности. Принцип ящика запрещает биекцию между набором последовательностей длины N и любым подмножеством набора последовательностей длины N −1. Следовательно, невозможно создать алгоритм без потерь, который уменьшает размер каждой возможной входной последовательности. [22]
Разработчики реальных алгоритмов сжатия признают, что потоки с высокой информационной энтропией не могут быть сжаты, и соответственно включают средства для обнаружения и обработки этого состояния. Очевидный способ обнаружения — применение алгоритма необработанного сжатия и проверка того, меньше ли его вывод, чем ввод. Иногда обнаружение выполняется эвристикой ; например, приложение сжатия может считать файлы, имена которых заканчиваются на «.zip», «.arj» или «.lha», несжимаемыми без какого-либо более сложного обнаружения. Обычный способ обработки этой ситуации — цитирование ввода или несжимаемых частей ввода в выводе, что минимизирует накладные расходы на сжатие. Например, формат данных zip определяет «метод сжатия» «Stored» для входных файлов, которые были скопированы в архив дословно. [23]
Марк Нельсон, в ответ на заявления о «магических» алгоритмах сжатия, появляющихся в comp.compression, создал двоичный файл размером 415 241 байт с высокоэнтропийным содержимым и объявил публичный вызов в 100 долларов любому, кто напишет программу, которая вместе со своими входными данными будет меньше предоставленных им двоичных данных, но сможет восстановить их без ошибок. [24] Похожий вызов с вознаграждением в 5000 долларов был объявлен Майком Голдманом. [25]
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )2.6 Функция не является частично рекурсивной.