Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Эта статья представляет собой учебник для начинающих по основным типам сжатия
данных, содержащий вводное объяснение математических методов и алгоритмов,
используемых в технологиях сжатия. В статье приводятся краткое рассмотрение
вопросов и примеры, призванные помочь вам в выборе подходящих инструментальных
средств и методов сжатия для ваших приложений. Статья содержит ссылки на более
широкие теоретические обсуждения и готовые к использованию инструментальные
средства и библиотеки для сжатия данных. Обновление: Таблицы 1 и 2 были обновлены
для исправления ошибок форматирования. – ред.
Что понимается под сжатием данных? Если говорить кратко, то сжатие устраняет из
данных избыточность; в терминах же теории информации сжатие увеличивает энтропию
сжатого текста. Однако оба этих утверждения по существу по существу верны в силу
определения самих понятий. Избыточность может быть выражена в самых разных формах.
Одним типом является последовательности повторяющихся битов (11111111). Вторым
– последовательности повторяющихся байтов (XXXXXXXX). Однако чаще избыточность
проявляется в более крупном масштабе и выражается либо закономерностями в наборе
данных, взятом как единое целое, либо последовательностями различной длины,
имеющими общие признаки. По существу, цель сжатия данных заключается в поиске
Сжатие пустых мест крайне «дешево» с точки зрения реализации. Вопрос состоит лишь
в считывании потока данных и исключении из выходного потока нескольких конкретных
значений. Во многих случаях этап «распаковки» вообще не предусматривается. Однако
даже если бы мы захотели воссоздать что-то близкое к оригиналу потока данных, это
потребовало бы лишь небольшого объема ресурсов ЦП или памяти. Восстановленные
данные не обязательно будут совпадать с исходными данными; это зависит от того, какие
правила и ограничения содержались в оригинале. Страница HTML, напечатанная человеком
в текстовом редакторе, вероятно, будет содержать пробелы, расставленные согласно
определенным правилам. Это же относится и к автоматизированным инструментальным
средствам, которые часто создают «обоснованные» отступы и интервалы в коде HTML.
В случае с жестким форматом отчета, представленным в нашем примере, не существует
никаких причин, по которым первоначальное представление не могло бы быть воссоздано
каким-либо «форматирующим распаковщиком».
Групповое кодирование
Групповое кодирование (RLE) является простейшим из широко используемых методов
сжатия без потерь. Подобно сжатию пустых мест, оно не требует особых затрат, особенно
для декодирования. Идея, стоящая за данным методом, заключается в том, что многие
представления данных состоят большей частью из строк повторяющихся байтов. Наш
образец отчета является одним из таких представлений данных. Он начинается со строки
повторяющихся символов «=» и имеет разбросанные по отчету строки, состоящие только
из пробелов. Вместо того чтобы представлять каждый символ с помощью его собственного
байта, метод RLE предусматривает (иногда или всегда) указание количества повторений, за
которым следует символ, который необходимо воспроизвести указанное число раз.
Исходный набор символов (состоящий из чисел) может быть легко закодирован (без сжатия)
в виде 4-х битных последовательностей (полубайтов). Приведенное кодирование по методу
Хаффмана будет использовать до 5 битов для символов в наихудшем случае, что очевидно
хуже кодирования с помощью полубайтов. Однако в лучшем случае потребуется всего 1
бит; при этом известно, что именно лучший случай будет использоваться чаще всего (так
как именно этот символ чаще всего встречается в данных). Таким образом, мы могли бы
закодировать конкретный телефонный номер следующим образом:
772 7628 --> 1 1 010 1 00010 010 00011
набор данных будет представлять собой прозу на английском языке, то частоты появления
букв хорошо известны и постоянны для различных наборов данных.
Приведенных операций должно быть достаточно для демонстрации работы модели. Хотя
никакого заметного сжатия пока не достигнуто, уже видно, что мы повторно использовали
слоты 11 и 16, закодировав по два символа одним выходным символом. Кроме того, мы уже
накопили крайне полезную последовательность байтов 772 в слоте 18, которая впоследствии
неоднократно будет встречаться в потоке.
Необходимо еще раз взглянуть на проблему, которую представляют данные. Так как это
не общий набор данных и для него существуют четкие предварительные требования,
то проблему можно переформулировать. Известно, что существует максимум 30000
телефонных номеров (от 7720000 до 7749999), некоторые из которых являются активными, а
некоторые – нет. Перед нами не стоит задача вывести полное представление всех активных
номеров. Нам просто требуется указать с помощью логического значения, активен данный
номер или нет. Размышляя о проблеме подобным образом, мы можем просто выделить
30000 битов в памяти и в системе хранения и использовать каждый бит для индикации
активности («да» или «нет») соответствующего телефонного номера. Порядок битов в
битовом массиве может соответствовать телефонным номерам, отсортированным по
возрастанию (от меньшего к большему).
Подобное решение на основе битового массива идеально со всех точек зрения. Оно требует
ровно 3750 байт для представления набора данных; различные методы сжатия будут
использовать меняющийся объем в зависимости от количества телефонных номеров в
наборе и эффективности сжатия. Однако если 10000 из 30000 возможных телефонных
номеров являются активными и если даже самому эффективному методу сжатия требуется
несколько байтов на один телефонный номер, то битовый массив однозначно выигрывает.
С точки зрения потребностей в ресурсах ЦП битовый массив не только превосходит
любой из рассмотренных методов сжатия, но и оказывается лучше, чем обычный метод
представления телефонных номеров в виде строк (без сжатия). Проход по битовому массиву
и увеличение счетчика текущего телефонного номера могут эффективно выполняться даже
во встроенном кэше современных процессоров.
Из этого простого примера можно понять, что далеко не каждая проблема имеет такое
идеальное решение, как рассмотренная выше. Многие проблемы действительно требуют
использования значительного объема ресурсов памяти, пропускной способности, хранилища
и ЦП; и в большинстве подобных случаев методы сжатия могут облегчить или снизить
эти требования. Но более важный вывод состоит в том, что перед применением методов
сжатия стоит еще раз удостовериться, что для представления данных выбрана правильная
концепция.
Об авторе
Девид Мертц (David Mertz)