Автор работы: Пользователь скрыл имя, 29 Января 2013 в 10:13, реферат
Любая информационная система должна обеспечивать выполнение следующих основных функций: прием, хранение, передача, обработка и выдача информации. Причем хранение и передача информации занимает важное место. Нынешний век называют информационным веком, информация играет все более и более важную роль в современной жизни. Ее объемы постоянно возрастают, и, таким образом, требуются все большие и большие накопители и все более быстрые каналы связи для передачи.
Введение 4
1 Классификация методов сжатия 5
2 Критерии оценки методов сжатия 6
3 Надежность программ и сложность алгоритмов 7
4 Современные методы сжатия 8
4.1 Алгоритмы статистического моделирования 8
4.2 Алгоритмы словарного сжатия 8
4.3 Алгоритмы сжатия сортировкой блоков 9
4.4 Методы энтропийного кодирования 9
4.5 Префиксные коды 9
4.6 Арифметические коды 10
5 Обзор алгоритмов сжатия без потерь 11
5.1 RLE 11
5.2 Алгоритмы семейства LZ 12
5.3 Алгоритм LZ77 13
5.4 Алгоритм LZSS 15
5.5 Алгоритм LZ78 17
5.6 Алгоритм LZW 19
5.7 Алгоритм LZM 25
5.8 Алгоритм LZB 27
5.9 Алгоритм LZH 28
5.10 Алгоритм LZC 28
5.11 Алгоритм LZT 28
5.12 Алгоритм LZMV 29
5.13 Алгоритм LZJ 29
5.14 Алгоритм LZFG 29
5.15 Унарное кодирование 30
5.16 Метод Хафмана 31
5.16.1 Идея метода 31
5.16.2 Алгоритм 31
5.16.3 Кодирование Хаффмана 32
5.16.4 Адаптивное сжатие Хаффмана 33
5.16.5 Адаптивное кодирование Хаффмана 34
5.16.6 Проблемы адаптивного кодирования 35
5.16.7 Фиксированный алгоритм Хаффмана 36
5.16.8 Алгоритм стопки книг 36
5.17 Арифметическое кодирование 37
5.18 Вероятностное сжатие 39
Заключение 40
Библиографический список 41
Алгоритм обновления дерева
ОбновитьМодельСимволом(Символ)
{
ТекущийУзел = ЛистСоответствующий(Символ);
Всегда
УвеличитьВес(ТекущийУзел);
Если ТекущийУзел = КореньДерева
Выход;
Если Вес(ТекущийУзел) > Вес(СледующийЗа(ТекущийУзел))
Перестановка();
ТекущийУзел = Родитель(ТекущийУзел);
Конец Всегда;
}
Хорошо было бы, чтобы кодер не тратил зря кодовое пространство на символы, которые не встречаются в сообщении. Если речь идет о классическом алгоритме Хаффмана, то те символы, которые не встречаются в сообщении, уже известны до начала кодирования, так как известна таблица частот и символы, у которых частота встречаемости равна 0. В адаптивной версии алгоритма мы не можем знать заранее, какие символы появятся в сообщении. Можно проинициализировать дерево Хаффмана так, чтобы оно имело все 256 символов алфавита (для 8-и битовых кодов) с частотой, равной 1. В начале кодирования каждый код будет иметь длину 8 битов. По мере адаптации модели наиболее часто встречающиеся символы будут кодироваться все меньшим и меньшим количеством битов. Такой подход работоспособен, но он значительно снижает степень сжатия, особенно на коротких сообщениях.
Лучше начинать моделирование с пустого дерева и добавлять в него символы только по мере их появления в сжимаемом сообщении. Но это приводит к очевидному противоречию: когда символ появляется в сообщении первый раз, он не может быть закодирован, так как его еще нет в дереве кодирования.
Чтобы разрешить это противоречие, введем специальный ESCAPE код, который будет означать, что следующий символ закодирован вне контекста модели сообщения. Например, его можно передать в поток сжатой информации как есть, не кодируя вообще. Метод "ЗакодироватьСимвол" в алгоритме адаптивного кодирования Хаффмана можно записать следующим образом:
ЗакодироватьСимвол(Символ)
{
Если СимволУжеЕстьВТаблице(
ВыдатьКодХаффманаДля(Символ);
Иначе
{
ВыдатьКодХаффманаДля(ESC);
ВыдатьСимвол(Символ);
}
}
Использование специального символа ESC подразумевает определенную инициализацию дерева до начала кодирования и декодирования: в него помещаются 2 специальных символа: ESC и EOF (конец файла), с весом, равным 1.
Поскольку процесс обновления не коснется их веса, то по ходу кодирования они будут перемещаться на самые удаленные ветви дерева и иметь самые длинные коды.
Следующим вариантом рассматриваемого алгоритма является фиксированный алгоритм Хаффмана, сочетающий в себе достоинства двух предыдущих – высокую скорость работы, простоту и отсутствие дополнительного словаря, создающего излишнюю избыточность. Идея его в том, чтобы пользоваться некоторым усредненным по многим текстам деревом, одинаковым для кодировщика и декодировщика. Такое дерево не надо строить и передавать вместе с текстом, а значит отпадает необходимость первого прохода. Но, с другой стороны, усредненное фиксированное дерево оказывается еще более неоптимальным, чем динамическое. Поэтому, иногда может быть удобно иметь несколько фиксированных деревьев для разных видов информации.
Cужествует еще одна разновидность адаптивного алгоритма Хаффмана, описанная Рябко, а затем Бентли и названная, соответственно, алгоритмом стопки книг или “двигай вверх” (“MTF – Move To Front”).
Каждому символу (букве) присваивается
код в зависимости от его положения
в алфавите. Чем ближе символ к
началу алфавита, тем короче код (в
качестве кода можно использовать,
например, код дерева для монотонных
источников). После кодирования очередного
символа мы помещаем его в начало
алфавита, сдвигая все остальные
буквы на одну позицию вглубь. Через
некоторое время наиболее часто
встречаемые символы
Заключение
С тех пор, как Д. А. Хаффман опубликовал
в 1952 году свою работу "Метод построения
кодов с минимальной
Арифметическое кодирование
Текст, сжатый арифметическим кодером, рассматривается как некоторая двоичная дробь из интервала [0, 1). Результат сжатия можно представить как последовательность двоичных цифр из записи этой дроби. Каждый символ исходного текста представляется отрезком на числовой оси с длиной, равной вероятности его появления и началом, совпадающим с концом отрезка символа, предшествующего ему в алфавите. Сумма всех отрезков, очевидно должна равняться единице. Если рассматривать на каждом шаге текущий интервал как целое, то каждый вновь поступивший входной символ “вырезает” из него подинтервал пропорционально своей длине и положению.
Поясним работу метода на примере:
Пусть алфавит состоит из двух символов: “a” и “b” с вероятностями соответственно 3/4 и 1/4.
Рассмотрим (открытый справа) интервал [0, 1). Разобьем его на части, длина которых пропорциональна вероятностям символов. В нашем случае это [0, 3/4) и [3/4, 1). Суть алгоритма в следующем: каждому слову во входном алфавите соответствует некоторый подинтервал из [0, 1). Пустому слову соответствует весь интервал [0, 1). После получения каждого очередного символа арифметический кодер уменьшает интервал, выбирая ту его часть, которая соответствует вновь поступившему символу. Кодом сообщения является интервал, выделенный после обработки всех его символов, точнее, число минимальной длины, входящее в этот интервал. Длина полученного интервала пропорциональна вероятности появления кодируемого текста.
Выполним алгоритм для цепочки “aaba”:
Шаг |
Просмотренная цепочка |
Интервал |
0 |
“” |
[0, 1) = [0, 1) |
1 |
“a” |
[0, 3/4) = [0, 0.11) |
2 |
“aa” |
[0, 9/16) = [0, 0.1001) |
3 |
“aab” |
[27/64, 36/64) = [0.011011, 0.100100) |
4 |
“aaba” |
[108/256, 135/256) = [0.01101100, 0.10000111) |
На первом шаге мы берем первые
3/4 интервала, соответствующие символу
"а", затем оставляем от него
еще только 3/4. После третьего шага
от предыдущего интервала
В качестве кода можно взять любое число из диапазона, полученного на шаге 4. Возникает вопрос: "А где же здесь сжатие? Исходный текст можно было закодировать четырьмя битами, а мы получили восьмибитный интервал". Дело в том, что в качестве кода мы можем выбрать, например, самый короткий код из интервала, равный 0.1 и получить четырехкратное сокращение объема текста. Для сравнения, код Хаффмана не смог бы сжать подобное сообщение, однако, на практике выигрыш обычно невелик и предпочтение отдается более простому и быстрому алгоритму из предыдущего раздела.
Арифметический декодер
При рассмотрении этого метода возникают
две проблемы: во-первых, необходима
вещественная арифметика, вообще говоря,
неограниченной точности, и во-вторых,
результат кодирования
Подобно алгоритму Хаффмана, арифметический кодер также является двухпроходным и требует передачи вместе с закодированным текстом еще и таблицы частот символов. Вообще, эти алгоритмы очень похожи и могут легко взаимозаменяться. Следовательно, существует адаптивный алгоритм арифметического кодирования со всеми вытекающими достоинствами и недостатками. Его основное отличие от статического в том, что новые интервалы вероятности перерассчитываются после получения каждого следующего символа из входного потока.
Чрезвычайно интересный и самый быстрый из известных (наряду с RLE) методов сжатия информации, дающий, к тому же неплохие результаты. Вероятностное сжатие во многом напоминает гадание на кофейной гуще или предсказание погоды, только более эффективно.
Работает алгоритм следующим образом:
имеется достаточно большая, динамически
обновляющаяся таблица
Декомпрессор работает по аналогичной
программе, поддерживая и обновляя
таблицу синхронно с
Таким образом, для компактного хранения информации мы будем применять процесс сжатия данных. Существует множество способов сжатия информации. Прежде всего методы сжатия бывают с искажением данных и без искажения данных при восстановлении после сжатия. Для сжатия будет применяться тот алгоритм, который подходит к критериям нашего сжатия. Критериями сжатия являются качество (коэффициент или степень) сжатия, скорость кодирования и декодирования, определяемые временем, затрачиваемым на кодирование и декодирование данных, объем требуемой памяти.
1 http://www.findpatent.ru
2 http://mf.grsu.by
3 www.wikipedia.ru
4 www.intuit.ru
5 www.landef.ru