Автор работы: Пользователь скрыл имя, 23 Июня 2013 в 13:18, курсовая работа
Целью данной курсовой работы является изучение архивации данных и средств ее осуществления.
Задачи:
познакомиться с такими понятиями как «архивация данных», «архиватор»;
изучить существующие алгоритмы сжатия информации;
познакомиться с программами-архиваторами для Windows;
подробно рассмотреть одну из самых популярных программ-архиваторов WinRAR.
Программа, создавая архив, обрабатывает как текстовые файлы, так и бинарные файлы. Первые всегда сжимаются в несколько раз (в зависимости от архиватора), тогда как сжатие бинарных файлов зависит от их характера. Одни бинарные файлы могут быть сжаты в десятки раз, сжатие же других может и вовсе не уменьшить занимаемый ими объем.
Сжатие данных обычно происходит значительно медленнее, чем обратная операция.
Характеристики архиваторов:
Характеристики архиваторов – обратно зависимые величины. То есть, чем больше скорость сжатия, тем меньше степень сжатия, и наоборот.
Нахождение для любого входного файла программы наименьшего возможного размера, печатающей этот файл, является алгоритмически неразрешимой задачей, поэтому «идеальный» архиватор невозможен.
Все способы сжатия можно разделить на две категории: обратимое (сжатие без потерь) и необратимое сжатие.
Под необратимым сжатием
подразумевают такое
Такие подходы и алгоритмы используются для сжатия, например, данных растровых графических файлов с низкой степенью повторяемости байтов в потоке. При таком подходе используется свойство структуры формата графического файла и возможность представить графическую картинку приблизительно схожую по качеству отображения (для восприятия человеческим глазом) несколькими способами. Поэтому, кроме степени или величины сжатия, в таких алгоритмах возникает понятие качества. Т.к. исходное изображение в процессе сжатия изменяется, то под качеством можно понимать степень соответствия исходного и результирующего изображения, оцениваемая субъективно, исходя из формата информации. Для графических файлов такое соответствие определяется визуально, хотя имеются и соответствующие интеллектуальные алгоритмы и программы. Необратимое сжатие невозможно применять в областях, в которых необходимо иметь точное соответствие информационной структуры входного и выходного потоков. Данный подход реализован в популярных форматах представления видео и фото информации, известных как JPEG и JFIF алгоритмы и JPG и JIF форматы файлов.
Обратимое сжатие всегда приводит к снижению объема выходного потока информации без изменения его информативности, т.е. без потери информационной структуры.
Более того, из выходного потока, при помощи восстанавливающего или декомпрессирующего алгоритма, можно получить входной, а процесс восстановления называется декомпрессией или распаковкой и только после процесса распаковки данные пригодны для обработки в соответствии с их внутренним форматом.
Наиболее известный простой
Суть методов данного подхода состоит в замене цепочек или серий повторяющихся байтов или их последовательностей на один кодирующий байт и счетчик числа их повторений.
Например:
44 44 44 11 11 11 11 11 01 33 FF 22 22 - исходная последовательность
03 44 05 11 01 01 01 33 01 FF 02 22 - сжатая последовательность
Первый байт указывает сколько раз нужно повторить следующий байт
Если первый байт равен 00, то затем идет счетчик, показывающий, сколько за ним следует неповторяющихся данных.
Данные методы, как правило,
достаточно эффективны для сжатия растровых
графических изображений (BMP, PCX, TIF, GIF),
т.к. последние содержат достаточно
много длинных серий
Недостатком метода RLE является достаточно низкая степень сжатия.
Сжимая файл по алгоритму Хаффмана первое, что мы должны сделать – прочитать файл полностью и подсчитать, сколько раз встречается каждый символ из расширенного набора ASCII.
Если мы будем учитывать все 256 символов, то для нас не будет разницы в сжатии текстового и EXE файла.
После подсчета частоты вхождения каждого символа, необходимо просмотреть таблицу кодов ASCII и сформировать бинарное дерево.
Арифметическое кодирование является методом, позволяющим упаковывать символы входного алфавита без потерь при условии, что известно распределение частот этих символов, и оно является наиболее оптимальным, т.к. достигается теоретическая граница степени сжатия.
Предполагаемая требуемая последовательность символов при сжатии методом арифметического кодирования рассматривается как некоторая двоичная дробь из интервала [0, 1). Результат сжатия представляется как последовательность двоичных цифр из записи этой дроби.
Идея метода состоит в следующем: исходный текст рассматривается как запись этой дроби, где каждый входной символ является "цифрой" с весом, пропорциональным вероятности его появления. Этим объясняется интервал, соответствующий минимальной и максимальной вероятностям появления символа в потоке.
Алгоритм декодирования работает аналогично кодирующему. На входе и идет разбиение интервала.
Продолжая этот процесс, мы однозначно декодируем все символы. Для того, чтобы декодирующий алгоритм мог определить конец цепочки, мы можем либо передавать ее длину отдельно, либо добавить к алфавиту дополнительный уникальный символ - "конец цепочки".
Данный алгоритм отличают высокая скорость работы как при упаковке, так и при распаковке, достаточно скромные требования к памяти и простая аппаратная реализация.
Предположим, что у нас имеется словарь, хранящий строки текста и содержащий порядка от 2-х до 8-ми тысяч пронумерованных гнезд. Запишем в первые 256 гнезд строки, состоящие из одного символа, номер которого равен номеру гнезда.
Алгоритм просматривает входной поток, разбивая его на подстроки и добавляя новые гнезда в конец словаря. Прочитаем несколько символов в строку s и найдем в словаре строку t - самый длинный префикс s.
Пусть он найден в гнезде с номером n. Выведем число n в выходной поток, переместим указатель входного потока на length(t) символов вперед и добавим в словарь новое гнездо, содержащее строку t+c, где с – очередной символ на входе (сразу после t). Алгоритм преобразует поток символов на входе в поток индексов ячеек словаря на выходе.
При практической реализации
этого алгоритма следует
Недостаток: низкая степень сжатия по сравнению со схемой двухступенчатого кодирования.
Гораздо большей степени сжатия можно добиться при выделении из входного потока повторяющихся цепочек – блоков, и кодирования ссылок на эти цепочки с построением хеш-таблиц от первого до n-го уровня.
Метод, о котором и пойдет речь, принадлежит Лемпелю и Зиву и обычно называется LZ-compression.
Суть его состоит в следующем: упаковщик постоянно хранит некоторое количество последних обработанных символов в буфере. По мере обработки входного потока, вновь поступившие символы попадают в конец буфера, сдвигая предшествующие символы и вытесняя самые старые.
Размеры этого буфера, называемого также скользящим словарем (sliding dictionary), варьируются в разных реализациях кодирующих систем.
Экспериментальным путем установлено, что программа LHarc использует 4-килобайтный буфер, LHA и PKZIP - 8-ми, а ARJ - 16-килобайтный.
Затем, после построения хеш-таблиц алгоритм выделяет (путем поиска в словаре) самую длинную начальную подстроку входного потока, совпадающую с одной из подстрок в словаре, и выдает на выход пару (length, distance), где length – длина найденной в словаре подстроки, а distance – расстояние от нее до входной подстроки (то есть фактически индекс подстроки в буфере, вычтенный из его размера).
В случае, если такая подстрока не найдена, в выходной поток просто копируется очередной символ входного потока.
В первоначальной версии алгоритма предлагалось использовать простейший поиск по всему словарю. Однако в дальнейшем, было предложено использовать двоичное дерево и хеширование для быстрого поиска в словаре, что позволило на порядок поднять скорость работы алгоритма.
Таким образом, алгоритм Лемпеля-Зива преобразует один поток исходных символов в два параллельных потока длин и индексов в таблице (length + distance).
Очевидно, что эти потоки являются потоками символов с двумя новыми алфавитами, и к ним можно применить один из упоминавшихся выше методов (RLE, кодирование Хаффмана или арифметическое кодирование).
Так мы приходим к схеме двухступенчатого кодирования - наиболее эффективной из практически используемых в настоящее время. При реализации этого метода необходимо добиться согласованного вывода обоих потоков в один файл. Эта проблема обычно решается путем поочередной записи кодов символов из обоих потоков.
PKPAK 3.61:
Метод Packed – алгоритм RLE.
Метод Crunched – алгоритм LZW.
Метод Squashed – двухпроходное статическое кодирование Хаффмана.
PKZIP 1.10:
Метод Shrinked – модифицированный алгоритм LZW с частичной очисткой словаря и переменной длиной кода.
Метод Imploded – модифицированный алгоритм Лемпеля-Зива и
статическое кодирование Хаффмана.
LHArc:
Алгоритм Лемпеля-Зива и динамическое кодирование Хаффмана.
LHA:
Алгоритм Лемпеля-Зива и
статическое кодирование
ARJ:
Алгоритм Лемпеля-Зива и оригинальный метод кодирования.
Растровые изображения представляют собой двумерный массив чисел - пикселей, а изображения можно подразделить на две группы: с палитрой и без нее. У первых в пикселе хранится число – индекс в некотором одномерном векторе цветов, называемом палитрой (из 16 и 256 цветов).
Изображения без палитры бывают в какой-либо системе цветопредставления и в градациях серого. При использовании некой системы цветопредставления каждый пиксель является структурой, полями которой являются компоненты цвета (например, RGB и CMYK).
На заре компьютерной эры
для сжатия графики применялись
традиционные алгоритмы, рассмотренные
выше. С появлением новых типов
изображений эти алгоритмы
Алгоритмы сжатия с потерями не рекомендуется использовать при сжатии изображений, которые затем будут предназначены для печати с высоким качеством или для обработки с помощью ПО распознавания образов.
Так называемые фрактальные алгоритмы обеспечивают степень сжатия изображения до 1:2000 (формат FIF). Кроме того, при разархивации изображение можно масштабировать. Уникальность этих алгоритмов в том, что изображение не дробится на квадраты и учитывается не близость цветов в локальной области, а подобие разных по размеру областей изображения.
Фрактальные алгоритмы ориентированы на полноцветные изображения и изображения в градациях серого. Они требуют огромных вычислительных мощностей при архивации, зато распаковка менее ресурсоемка, чем JPEG.