Методы сжатия информации

Автор работы: Пользователь скрыл имя, 17 Апреля 2014 в 01:23, отчет по практике

Краткое описание

Я рассмотрю методы сжатия без потери информации. К таким методам относятся:
Алгоритм Хафмана
Арифметическое кодирование
Контекстное кодирование (PPM - Prediction by Partial Matching)
Алгоритм Зива-Лемпеля(-Welch)
Алгоритм Барроуза-Веллера

Содержание

Методы сжатия информации 2
Статический алгоритм Хафмана 5
Метод Шеннона-Фано 9
Алгоритм Зива-Лемпеля 10
Локально адаптивный алгоритм сжатия 11
Сжатие данных с использованием преобразования Барроуза-Вилера 12
Используемая литература 15

Вложенные файлы: 1 файл

ТИПиС_МетСжИнф_ШерстневаАА_ЗТ-1-10.docx

— 98.04 Кб (Скачать файл)

Такое дерево называется деревом префиксных кодов. Это дерево может использоваться и при декодировании префиксных кодов. При поступлении битов декодер может следовать вдоль дерева, пока не достигнет листа, формируя таким способом сообщение. После этого при поступлении очередного бита осуществляется возврат к корню дерева и процедура повторяется. При декодировании могут использоваться несколько префиксных деревьев.

При использовании кодирования по схеме Хафмана надо вместе с закодированным текстом передать соответствующий алфавит. При передаче больших фрагментов избыточность, сопряженная с этим не может быть значительной. Для одного и того же массива бит могут быть сформированы разные алфавиты, но они будут одинаково оптимальными (среднее число бит, приходящихся на один символ для любого такого алфавита, будет идентичным). Таким образом, коды Хафмана являются оптимальным (наиболее экономным), но не единственным решением.

Возможно применение стандартных алфавитов (кодовых таблиц) для пересылки английского, русского, французского и т.д. текстов, программных текстов на С++, Паскале и т.д. Кодирование при этом не будет оптимальным, но исключается статистическая обработка пересылаемых фрагментов и отпадает необходимость пересылки кодовых таблиц. Ниже в таблице представлена таблица возможных кодов Хафмана для английского алфавита.

Буква

Код Хафмана

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


 

 

Ниже представлена аналогичная таблица для русского алфавита. В этой таблице коды букв Е и Ё идентичны, аналогичная сутуация с кодами Ь и Ъ. Следует также иметь в виду, что помимо букв определенные коды должны быть присвоены символам пунктуации, числам и некоторым специальным символам (1 2 3 4 5 6 7 8 9 0 . , : ; ! ? ... ' " ~ % # * + - = \ ( ) [ ] { } _).

Буква

Относит. 
частота

Код Хафмана

– 
пробел

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


 

 

Возможная схема реализации алгоритма формирования кодов Хафмана для русского алфавита показана на рис. 3.

Рис. 3.

Среднее число элементарных сигналов для передачи буквы при данном методе кодирования равно 4,4.

Метод Шеннона-Фано

Данный метод выделяется своей простотой. Берутся исходные сообщения 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, но это получается для короткой исходной последовательности. В случае материала большего объема будет получено реальное сжатие исходной последовательности.

Локально адаптивный алгоритм сжатия

Этот алгоритм используется для кодирования (L,I), где L строка длиной N, а I - индекс. Это кодирование содержит в себе несколько этапов.

1. Сначала кодируется  каждый символ L с использованием  локально адаптивного алгоритма  для каждого из символов индивидуально. Определяется вектор целых чисел R[0],…,R[N-1], который представляет собой коды для символов L[0],…,L[N-1]. Инициализируется список символов Y, который содержит в себе каждый символ из алфавита Х только один раз. Для каждого i = 0,…,N-1 устанавливается R[i] равным числу символов, предшествующих символу L[i] из списка Y. Взяв Y = [‘a’,’b’,’c’,’r’] в качестве исходного и L = ‘caraab’, вычисляем вектор R: (2 1 3 1 0 3).

2. Применяем алгоритм  Хафмана или другой аналогичный алгоритм сжатия к элементам R, рассматривая каждый элемент в качестве объекта для сжатия. В результате получается код OUT и индекс I.

Рассмотрим процедуру декодирования полученного сжатого текста (OUT,I).

Здесь на основе (OUT,I) необходимо вычислить (L,I). Предполагается, что список Y известен.

  1. Сначала вычисляется вектор R, содержащий N чисел: (2 1 3 1 0 3).

  1. Далее вычисляется строка L, содержащая N символов, что дает значения R[0],…,R[N-1]. Если необходимо, инициализируется список Y, содержащий символы алфавита X (как и при процедуре кодирования). Для каждого i = 0,…,N-1 последовательно устанавливается значение L[i], равное символу в положении R[i] из списка Y (нумеруется, начиная с 0), затем символ сдвигается к началу Y. Результирующая строка L представляет собой последнюю колонку матрицы M. Результатом работы алгоритма будет (L,I). Взяв Y = [‘a’,’b’,’c’,’r’] вычисляем строку L = ‘caraab’.

Наиболее важным фактором, определяющим скорость сжатия, является время, необходимое для сортировки вращений во входном блоке. Наиболее быстрый способ решения проблемы заключается в сортировке связанных строк по суффиксам.

Для того чтобы сжать строку S, сначала сформируем строку S’, которая является объединением S c EOF, новым символом, который не встречается в S. После этого используется стандартный алгоритм к строке S’. Так как EOF отличается от прочих символов в S, суффиксы S’ сортируются в том же порядке, как и вращения S’. Это может быть сделано путем построения дерева суффиксов, которое может быть затем обойдено в лексикографическом порядке для сортировки суффиксов. Для этой цели может быть использован алгоритм формирования дерева суффиксов Мак-Крейгта. Его быстродействие составляет 40% от наиболее быстрой методики в случае работы с текстами. Алгоритм работы с деревом суффиксов требует более четырех слов на каждый исходный символ. Манбер и Майерс предложили простой алгоритм сортировки суффиксов строки. Этот алгоритм требует только двух слов на каждый входной символ. Алгоритм работает сначала с первыми i символами суффикса а за тем, используя положения суффиксов в сортируемом массиве, производит сортировку для первых 2i символов. К сожалению этот алгоритм работает заметно медленнее.

Информация о работе Методы сжатия информации