Автор работы: Пользователь скрыл имя, 05 Июня 2012 в 11:17, курсовая работа
Раньше в вычислительных машинах для хранения больших объемов информации в течение длительного времени использовались накопители на магнитных лентах, которые обладали колоссальной емкостью, а сжатие информации на диске было нерациональным решением, так как работа с ней в таком виде отнимала драгоценное машинное время.
Теперь когда наше дерево создано, мы можем кодировать файл . Мы должны всегда начинать из корня ( Root ). Кодируя первый символ (лист дерева С) Мы прослеживаем вверх по дереву все повороты ветвей и если мы делаем левый поворот, то запоминаем 0-й бит, и аналогично 1-й бит для правого поворота. Так для C, мы будем идти влево к 55 ( и запомним 0 ), затем снова влево (0) к самому символу . Код Хаффмана для нашего символа C - 00. Для следующего символа ( А ) у нас получается - лево,право,лево,лево , что выливается в последовательность 0100. Выполнив выше сказанное для всех символов получим
C = 00 ( 2 бита )
A = 0100 ( 4 бита )
D = 0101 ( 4 бита )
F = 011 ( 3 бита )
B = 10 ( 2 бита )
E = 11 ( 2 бита )
При
кодировании заменяем символы на
данные последовательности.
2.3.1.3
Арифметическое кодирование
Совершенно иное решение предлагает т.н. арифметическое кодирование. Арифметическое кодирование является методом, позволяющим упаковывать символы входного алфавита без потерь при условии, что известно распределение частот этих символов и является наиболее оптимальным, т.к. достигается теоретическая граница степени сжатия.
Предполагаемая
требуемая последовательность символов,
при сжатии методом арифметического
кодирования рассматривается
Идея
метода состоит в следующем: исходный
текст рассматривается как
Пример.
Пусть алфавит состоит из двух символов: a и b с вероятностями соответственно 0,75 и 0,25.
Рассмотрим наш интервал вероятностей [0, 1). Разобьем его на части, длина которых пропорциональна вероятностям символов. В нашем случае это [0; 0,75) и [0,75; 1). Суть алгоритма в следующем: каждому слову во входном алфавите соответствует некоторый подинтервал из интервала [0, 1) а пустому слову соответствует весь интервал [0, 1). После получения каждого следующего символа интервал уменьшается с выбором той его части, которая соответствует новому символу. Кодом цепочки является интервал, выделенный после обработки всех ее символов, точнее, двоичная запись любой точки из этого интервала, а длина полученного интервала пропорциональна вероятности появления кодируемой цепочки.
Применим данный алгоритм для цепочки "aaba":
Границы
интервала вычисляются так
В качестве кода можно взять любое число из интервала, полученного на шаге 4, например, 0,43.
Алгоритм декодирования работает аналогично кодирующему. На входе 0,43 и идет разбиение интервала.
Продолжая
этот процесс, мы однозначно декодируем
все четыре символа. Для того, чтобы
декодирующий алгоритм мог определить
конец цепочки, мы можем либо передавать
ее длину отдельно, либо добавить к алфавиту
дополнительный уникальный символ - "конец
цепочки".
2.3.1.4
Алгоритм Лемпеля –
Зива - Велча (Lempel-Ziv-Welch -
LZW)
Данный алгоритм отличают высокая скорость работы как при упаковке, так и при распаковке, достаточно скромные требования к памяти и простая аппаратная реализация.
Недостаток - низкая степень сжатия по сравнению со схемой двухступенчатого кодирования.
Предположим, что у нас имеется словарь, хранящий строки текста и содержащий порядка от 2-х до 8-ми тысяч пронумерованных гнезд. Запишем в первые 256 гнезд строки, состоящие из одного символа, номер которого равен номеру гнезда.
Алгоритм просматривает входной поток, разбивая его на подстроки и добавляя новые гнезда в конец словаря. Прочитаем несколько символов в строку s и найдем в словаре строку t - самый длинный префикс s.
Пусть он найден в гнезде с номером n. Выведем число n в выходной поток, переместим указатель входного потока на length(t) символов вперед и добавим в словарь новое гнездо, содержащее строку t+c, где с - очередной символ на входе (сразу после t). Алгоритм преобразует поток символов на входе в поток индексов ячеек словаря на выходе.
При практической реализации этого алгоритма следует учесть, что любое гнездо словаря, кроме самых первых, содержащих одно-символьные цепочки, хранит копию некоторого другого гнезда, к которой в конец приписан один символ. Вследствие этого можно обойтись простой списочной структурой с одной связью.
Пример: ABCABCABCABCABCABC - 1 2 3 4 6 5 7 7 7
1 | A |
2 | B |
3 | C |
4 | AB |
5 | BC |
6 | CA |
7 | ABC |
8 | CAB |
9 | BCA |
2.3.1.5
Двухступенчатое кодирование.
Алгоритм Лемпеля-Зива
Гораздо большей степени сжатия можно добиться при выделении из входного потока повторяющихся цепочек - блоков, и кодирования ссылок на эти цепочки с построением хеш таблиц от первого до n-го уровня.
Метод, о котором и пойдет речь, принадлежит Лемпелю и Зиву и обычно называется LZ-compression.
Суть его состоит в следующем: упаковщик постоянно хранит некоторое количество последних обработанных символов в буфере. По мере обработки входного потока вновь поступившие символы попадают в конец буфера, сдвигая предшествующие символы и вытесняя самые старые.
Размеры этого буфера, называемого также скользящим словарем (sliding dictionary), варьируются в разных реализациях кодирующих систем.
Экспериментальным путем установлено, что программа LHarc использует 4-килобайтный буфер, LHA и PKZIP - 8-ми, а ARJ - 16-килобайтный.
Затем,
после построения хеш таблиц алгоритм
выделяет (путем поиска в словаре)
самую длинную начальную
В случае, если такая подстрока не найдена, в выходной поток просто копируется очередной символ входного потока.
В первоначальной версии алгоритма предлагалось использовать простейший поиск по всему словарю. Однако, в дальнейшем, было предложено использовать двоичное дерево и хеширование для быстрого поиска в словаре, что позволило на порядок поднять скорость работы алгоритма.
Таким образом, алгоритм Лемпеля-Зива преобразует один поток исходных символов в два параллельных потока длин и индексов в таблице (length + distance).
Очевидно, что эти потоки являются потоками символов с двумя новыми алфавитами, и к ним можно применить один из упоминавшихся выше методов (RLE, кодирование Хаффмана или арифметическое кодирование).
Так мы приходим к схеме двухступенчатого кодирования - наиболее эффективной из практически используемых в настоящее время. При реализации этого метода необходимо добиться согласованного вывода обоих потоков в один файл. Эта проблема обычно решается путем поочередной записи кодов символов из обоих потоков.
Пример:
Первая ступень
abcabcabcabcabc - 1 а 1 b 1 c 3 3 6 3 9 3 12 3
Вторая ступень - исключение большой группы повторяющихся последовательностей
1 а 1 b 1 c 12 3
и
сжатие RLE, кодирование Хаффмана , арифметическое
кодирование
Перечень
программ сжатия с
кратким указанием
алгоритмов их работы.
PKPAK 3.61:
Метод Packed -- алгоритм RLE.
Метод Crunched -- алгоритм LZW.
Метод Squashed -- двухпроходное статическое кодирование Хаффмана.
PKZIP 1.10:
Метод Shrinked -- модифицированный алгоритм LZW с частичной очисткой словаря и переменной длиной кода.
Метод Imploded -- модифицированный алгоритм Лемпеля-Зива и
статическое кодирование Хаффмана.
LHArc:
Алгоритм Лемпеля-Зива и динамическое кодирование Хаффмана.
LHA:
Алгоритм Лемпеля-Зива и статическое кодирование Хаффмана.
ARJ:
Алгоритм
Лемпеля-Зива и оригинальный метод
кодирования
2.3.2
Алгоритмы сжатия
с потерями
2.3.2.1
Особенности сжатия
графики
Напомним,
что растровые изображения
Изображения
без палитры бывают в какой-либо
системе цветопредставления и в
градациях серого. При использовании
некой системы
На
заре компьютерной эры для сжатия
графики применялись
Алгоритмы
сжатия с потерями не рекомендуется
использовать при сжатии изображений,
которые затем будут предназначены для
печати с высоким качеством или для обработки
с помощью ПО распознавания образов.
2.3.2.2
Фрактальное сжатие
Так называемые фрактальные алгоритмы обеспечивают степень сжатия изображения до 1:2000 (формат FIF). Кроме того, при разархивации изображение можно масштабировать. Уникальность этих алгоритмов в том, что изображение не дробится на квадраты и учитывается не близость цветов в локальной области, а подобие разных по размеру областей изображения.
Фрактальные алгоритмы ориентированы на полноцветные изображения и изображения в градациях серого. Они требуют огромных вычислительных мощностей при архивации, зато распаковка менее ресурсоемка, чем JPEG.
За годы с момента возникновения первой программы данного типа написаны сотни различных архиваторов, поддерживающих различные форматы архивов. На момент становления и развития архиваторов самым распространенным форматом был ARJ, на втором месте почти сразу за ним ZIP, с некоторым отрывом следовали такие архиваторы, как ARC, ACE, LZH. На данный момент ситуация значительно изменилась. Первое место среди форматов архиваторов занимает ZIP, отвоевав его у ARJ, который отошел теперь на задний план, на втором месте RAR и со значительным отрывом следуют ACE, ARJ и другие менее популярные форматы.
Таким образом, в нашем обзоре нас интересуют в первую очередь архиваторы самых распространенных форматов:
ZIP - формат был разработан PKWARE.
RAR - формат был разработан
2.4 Основные виды программ-архиваторов
Наиболее известные программы-