Автор работы: Пользователь скрыл имя, 17 Апреля 2014 в 01:23, отчет по практике
Я рассмотрю методы сжатия без потери информации. К таким методам относятся:
Алгоритм Хафмана
Арифметическое кодирование
Контекстное кодирование (PPM - Prediction by Partial Matching)
Алгоритм Зива-Лемпеля(-Welch)
Алгоритм Барроуза-Веллера
Методы сжатия информации 2
Статический алгоритм Хафмана 5
Метод Шеннона-Фано 9
Алгоритм Зива-Лемпеля 10
Локально адаптивный алгоритм сжатия 11
Сжатие данных с использованием преобразования Барроуза-Вилера 12
Используемая литература 15
Буква |
Код Хафмана |
E |
100 |
T |
001 |
A |
1111 |
O |
1110 |
N |
1100 |
R |
1011 |
I |
1010 |
S |
0110 |
H |
0101 |
D |
11011 |
L |
01111 |
F |
01000 |
C |
01000 |
M |
00011 |
U |
00010 |
G |
00001 |
Y |
00000 |
P |
110101 |
W |
011101 |
B |
011100 |
V |
1101001 |
K |
110100011 |
X |
110100001 |
J |
110100000 |
Q |
1101000101 |
Z |
1101000100 |
Буква |
Относит. |
Код Хафмана |
– |
0,175 |
111 |
O |
0,090 |
110 |
Е,Ё |
0,072 |
1001 |
А |
0,062 |
1010 |
И |
0,062 |
1001 |
T |
0,053 |
1000 |
Н |
0,053 |
0111 |
C |
0,045 |
0110 |
Р |
0,040 |
01011 |
В |
0,038 |
01010 |
Л |
0,035 |
01001 |
К |
0,028 |
01000 |
М |
0,026 |
00111 |
Д |
0,025 |
001101 |
П |
0,023 |
001100 |
У |
0,021 |
00101 |
Я |
0,018 |
001001 |
Ы |
0,016 |
001000 |
З |
0,016 |
000111 |
Ь,Ъ |
0,014 |
000110 |
Б |
0,014 |
000101 |
Г |
0,013 |
000100 |
Ч |
0,012 |
000011 |
Й |
0,010 |
0000101 |
Х |
0,009 |
0000100 |
Ж |
0,007 |
0000011 |
Ш |
0,006 |
00000101 |
Ю |
0,006 |
00000100 |
Ц |
0,004 |
00000010 |
Щ |
0,003 |
00000001 |
Э |
0,003 |
000000001 |
Ф |
0,002 |
000000000 |
Данный метод выделяется своей простотой. Берутся исходные сообщения m(i) и их вероятности появления P(m(i)). Сообщения упорядываются так, чтобы вероятность i-го сообщения была не больше (i+1)-го. Этот список делится на две группы с примерно равной интегральной вероятностью. Каждому сообщению из группы 1 присваивается 0 в качестве первой цифры кода. Сообщениям из второй группы ставятся в соответствие коды, начинающиеся с 1. Каждая из этих групп делится на две аналогичным образом и добавляется еще одна цифра кода. Процесс продолжается до тех пор, пока не будут получены группы, содержащие лишь одно сообщение. Каждому сообщению в результате будет присвоен код x c длиной –lg(P(x)). Это справедливо, если возможно деление на подгруппы с совершенно равной суммарной вероятностью. Если же это невозможно, некоторые коды будут иметь длину –lg(P(x))+1. Алгоритм Шеннона-Фано не гарантирует оптимального кодирования.
В 1977 году Абрахам Лемпель и Якоб Зив предложили алгоритм сжатия данных, названный позднее LZ77. Этот алгоритм используется в программах архивирования текстов compress, lha, pkzip и arj. Модификация алгоритма LZ78 применяется для сжатия двоичных данных. Эти модификации алгоритма защищены патентами США. Алгоритм предполагает кодирование последовательности бит путем разбивки ее на фразы с последующим кодированием этих фраз. Позднее появилась модификация алгоритма LZ78 – Lempel-Ziv Welsh (использует словарь для байтов для потоков октетов).
Суть алгоритма заключается в следующем:
Если в тексте встретится повторение строк символов, то повторные строки заменяются ссылками (указателями) на исходную строку. Ссылка имеет формат <префикс, расстояние, длина>. Префикс в этом случае равен 1. Поле расстояние идентифицирует слово в словаре строк. Если строки в словаре нет, генерируется код символ вида <префикс, символ>, где поле префикс =0, а поле символ соответствует текущему символу исходного текста. Отсюда видно, что префикс служит для разделения кодов указателя от кодов символ. Введение кодов символ, позволяет оптимизировать словарь и поднять эффективность сжатия. Главная алгоритмическая проблема здесь заключатся в оптимальном выборе строк, так как это предполагает значительный объем переборов.
Рассмотрим пример с исходной последовательностью
U=0010001101 (без надежды получить реальное сжатие для столь ограниченного объема исходного материала).
Введем обозначения:
P[n] - фраза с номером n.
C - результат сжатия.
Разложение исходной последовательности бит на фразы представлено в таблице ниже.
N фразы |
Значение |
Формула |
Исходная последовательность U |
0 |
- |
P[0] |
0010001101 |
1 |
0 |
P[1]=P[0].0 |
0. 010001101 |
2 |
01 |
P[2]=P[1].1 |
0.01.0001101 |
3 |
010 |
P[3]=P[1].0 |
0. 01.00.01101 |
4 |
00 |
P[4]=P[2].1 |
0. 01.00.011.01 |
5 |
011 |
P[5]=P[1].1 |
0. 01.00. 011.01 |
P[0] - пустая строка. Символом « . » (точка) обозначается операция объединения (конкатенации).
Формируем пары строк, каждая из которых имеет вид (A.B). Каждая пара образует новую фразу и содержит идентификатор предыдущей фразы и бит, присоединяемый к этой фразе. Объединение всех этих пар представляет окончательный результат сжатия С. P[1]=P[0].0 дает (00.0), P[2]=P[1].0 дает (01.0) и т.д. Схема преобразования отражена в таблице ниже.
Формулы |
P[1]=P[0].0 |
P[2]=P[1].1 |
P[3]=P[1].0 |
P[4]=P[2].1 |
P[5]=P[1].1 |
Пары |
00.0=000 |
01.1=011 |
01.0=010 |
10.1=101 |
01.1=011 |
С |
000.011.010.101.011 = 000011010101011 |
Все формулы, содержащие P[0] вовсе не дают сжатия. Очевидно, что С длиннее U, но это получается для короткой исходной последовательности. В случае материала большего объема будет получено реальное сжатие исходной последовательности.