Автор работы: Пользователь скрыл имя, 06 Мая 2013 в 20:37, курсовая работа
В случайном текстовом файле мы ожидаем, что каждый символ встречается приблизительно равное число раз. Однако файлы, используемые на практике, навряд ли являются случайными. Они содержат осмысленные тексты, и по опыту известно, что, например, в типичном английском тексте некоторые буквы, такие, как «Е», «Т» и «А», встречаются гораздо чаще, чем «Z» и «Q». Это объясняет, почему код ASCII является избыточным, а также указывает на пути устранения избыточности. ASCII избыточен прежде всего потому, что независимо присваивает каждому символу, часто или редко используемому, одно и то же число бит (восемь). Чтобы удалить такую избыточность, можно воспользоваться кодами переменной длины, в котором короткие коды присваиваются буквам, встречающимся чаще, а редко встречающимся буквам достаются более длинные коды
Введение………………………………………………………….………...……..3
Глава 1.Сжатие данных…………………………………………….…………..6
Типы сжатия…………………………………………………………………..6
Методы сжатия данных. Арифметическое кодирование……………...…12
Глава 2.Кодирование Хаффмана……………………………………………..30
2.1 Описание алгоритма, реализующего код Хаффмана……………………...30
2.2 Декодирование Хаффмана. Описание алгоритма, реализующего код Хаффмана………………………………………………………………………...39
Глава 3. Описание программы кодирования Хаффмана…………………51
3.1 Обоснование выбора инструментальных средств………………………....51
3.2 Описание основных функций программы, реализующей алгоритмы кодирования по методу Хаффмана……………………………………………..54
Заключение ……………………………………………………………………60
Список источников информации …………………………………………....61
Числа Фибоначчи – элементы числовой последовательности:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, …,
в которой каждое последующее число равно сумме двух предыдущих чисел. Название по имени средневекового математика Леонардо Пизанского (или Фибоначчи).
Более формально, последовательность чисел Фибоначчи {F } задается рекуррентным соотношением:
F =1, F =1, F =F +F , n N
Иногда числа
Фибоначчи рассматривают и для
неположительных номеров n как двусторонне
бесконечную
F =F - F (1.5)
Пример двусторонне
бесконечной последовательности чисел
Фибоначчи представлен в
Таблица 1.5–Двусторонняя последовательность чисел Фибоначчи в интервале [-7..7]
n |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
F |
13 |
-8 |
5 |
-3 |
2 |
-1 |
1 |
0 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
Легко видеть, что F =(-1) F .
5)Д Гамма- коды Элиаса
Гамма-код Элиаса — двоичный префиксный код представления натуральных чисел. Число кодируется в два этапа. Определяется количество двоичных разрядов кодируемого числа. Вначале кодируется n посредством инвертированного унарного кода, после чего в неизменном виде дописываются n младших разрядов (старший единичный разряд, таким образом, опускается). Иными словами, код представляет собой число в двоичном представлении, заполненное нулями на 1 меньшей длины. В сумме длина кода должна равняться 2 n + 1. В таблице 1.6 приведены гамма-коды Элиаса малых натуральных чисел:
Таблица 1.6 – Гамма-коды Элиаса малых натуральных чисел
Числа |
Код |
Длина |
1 |
1 |
1 |
2-3 |
01х |
3 |
4-7 |
001хх |
5 |
8-15 |
0001ххх |
7 |
16-31 |
00001хххх |
9 |
32-63 |
000001ххххх |
11 |
64-127 |
0000001хххххх |
13 |
6) Дельта-коды Элиаса
Дельта-код Элиаса является производным от гамма-кода. В начале кодируется количество значащих двоичных разрядов в числе посредством гамма-кода, после чего записываются все значащие разряды, за исключением старшей единицы (общим количеством на 1 меньше закодированного количества). В таблице 1.7 приведены дельта-коды Элиаса для некоторых чисел. Закодированное количество разрядов и остальная часть числа разделены пробелом. Знаки х соответствуют разрядам двоичного представления кодируемого числа.
Таблица 1.7 – Дельта-коды Элиаса для некоторых чисел
Числа |
Код |
Длина |
1 |
1 |
1 |
2-3 |
010 х |
4 |
4-7 |
011 хх |
5 |
8-15 |
00100 ххх |
8 |
16-31 |
00101 хххх |
9 |
32-63 |
00110 ххххх |
10 |
64-127 |
00111 хххххх |
11 |
128-255 |
0001000 ххххххх |
14 |
256-511 |
0001001 хххххххх |
15 |
Дельта-код даёт
более оптимальное
Несколько примеров γ и δ кодов Элиаса приведены в таблице 1.8:
Таблица 1.8 – γ и δ коды Элиаса
n |
-код |
-код |
0 |
- |
1 |
1 |
1 |
0 1 |
2…3 |
01х |
0 01х |
4…7 |
001хх |
0 001хх |
8…15 |
0001ххх |
0 0001ххх |
16…31 |
00001хххх |
0 00001хххх |
32…63 |
000001ххххх |
0 000001ххххх |
7) Омега-код Элиаса
Омега-код Элиаса (рекурсивный код Элиаса) состоит из нескольких битовых групп, начинающихся с единичного бита, и замыкаемых нулевым битом [1]. Первая группа всегда имеет длину 2 бита. Длина каждой последующей группы определяется как на единицу большая, чем значение предыдущей. Последняя группа выражает кодируемое число. Исключение составляет число 1, оно кодируется единственным битом 0. Примеры кодов приведены в таблице 1.9:
Таблица 1.9 – Омега коды Элиаса
Число |
Код |
Длина |
1 |
0 |
1 |
2-3 |
1х 0 |
3 |
4-7 |
10 1хх 0 |
6 |
8-15 |
11 1ххх 0 |
7 |
16-31 |
10 100 1хххх 0 |
11 |
32-63 |
10 101 1ххххх 0 |
12 |
64-127 |
10 110 1хххххх 0 |
13 |
128-255 |
10 111 1ххххххх 0 |
14 |
256-511 |
11 1000 1хххххххх 0 |
16 |
512-1023 |
11 1001 1ххххххххх 0 |
17 |
Количество групп в коде возрастает быстро вначале, но далее — очень медленно:
8) Коды Ивэн- Родэ
Данные коды, также как и омега-коды Элиаса, состоят из последовательности групп длинной L1, L2, L3, …, Lm бит [1], которые начинаются с бита 1. В конце последовательности следует 0. Длина каждой следующей (n+1)-й группы задается значением битов предыдущей n-й группы. Значение битов последней группы является итоговым значением всего кода, то есть всей последовательности групп. В сущности, все первые m−1 групп служат лишь для указания длины последней группы.
В Ивэн-Родэ-кодах длина первой группы — 3 бита, а длина каждой последующей группы равна значению предыдущей. Первые три значения заданы особым образом.
При кодировании
формируется сначала последняя
группа, следующая непосредственно
перед нулем, а потом по очереди
восстанавливаются все
При декодировании, наоборот, группы получаются, начиная с первой, одна за другой, то есть по значению битов уже найденной группы определяется длина последующей и так далее, пока не будет найдена итоговая группа, после которой идет ноль.
Рассмотрим несколько примеров кодов Ивэн-Родэ - таблица 1.10:
Таблица 1.10 – Коды Ивэн-Родэ
n |
Код Ивэн-Родэ |
0 |
000 |
1 |
001 |
2 |
010 |
3 |
011 |
4 |
100 0 |
16 |
101 10000 0 |
32 |
110 100000 0 |
100 |
111 1100100 0 |
9) Код Левенштейна
Этот код проще всего объяснить на конкретном примере. Предположим, что нужно передать число n=21. Двоичное представление этого числа имеет вид 10101. Непосредственно использовать при кодировании двоичные представления натуральных чисел нельзя. Самый простой выход состоит в том, чтобы приписать в начале слова префикс, указывающий длину двоичной записи числа (в данном случае это число 5). Если это число закодировать унарным кодом и приписать слева к двоичной записи числа, то код получится однозначно декодируемым. В данном примере для числа 21 получим кодовое слово 11111010101. В общем случае длина двоичного представления будет равна 2[logn].
Шаг за шагом будем улучшать этот способ кодирования. Важно заметить, что первая значащая цифра двоичной записи числа – всегда 1. Её можно не передавать, декодер сам допишет недостающую единицу, если будет знать длину двоичной записи числа. Обозначим через bin’(n) двоичную запись натурального числа n без первой единицы.
Длины кодовых слов равны (1.6):
ln=2[log n]+1 (1.6)
Чтобы сделать запись ещё короче, с длиной двоичной записи числа можно поступить так же, как и с самим числом, т.е. передать его значащие разряды (кроме первой единицы), затем длину двоичной записи числа значащих разрядов и т.д. Итерации продолжаются, пока не останется один значащий разряд. Чтобы декодирование было однозначным, достаточно приписать префикс, содержащий закодированное префиксным кодом (Префиксный код – это код, в котором код одного символа не может быть началом кода другого символа) число итераций. Минимальное число итераций равно 0 (при кодировании числа 1). Поэтому в качестве префиксного кода можно выбрать унарный код увеличенного на 1 числа итераций. Полученное кодовое слово будет кодовым словом кода Левенштейна.
Например, для
числа 21 вычисляется bin'(21)=0101, затем bin'(4)=00,
bin'(2)=0. Число итераций равно 3,
поэтому кодовое слово кода Левенштейна
имеет вид lev(21)=(1110)(0)(00)(0101)=
Ниже приведена
таблица 1.11 – таблица кодов Левенштейна
для некоторых чисел
Таблица 1.11 – примеры кодов Левенштейна
n |
Код Левенштейна | |
Lev(n) |
ln | |
1 |
0 |
1 |
2 |
100 |
3 |
3 |
101 |
3 |
4 |
110000 |
6 |
… |
… |
6 |
7 |
110011 |
6 |
8 |
1101000 |
7 |
… |
… |
7 |
15 |
1101111 |
7 |
16 |
11100000000 |
11 |
… |
… |
11 |
31 |
11100001111 |
11 |
32 |
111000100000 |
12 |
… |
… |
12 |
63 |
111000111111 |
12 |
2 |
1 01111110 |
26 |
2 |
1 010011 0 |
1041 |
Коды Левенштейна и Элиаса практически эквивалентны, выигрыш кода Левенштейна проявляется только при астрономически больших значениях n.
10) Гамма-коды Левенштейна
Данный код для числа n получается путем обращения последовательности битов в двоичной записи этого числа и добавления перед каждым битом, кроме последнего, флагового (flag bit) бита 0. Последним флаговым битом является бит 1, который совпадает с самым старшим битом в исходной двоичной записи числа n.
Рассмотрим несколько примеров кодов Левенштейна в таблице 1.12:
Таблица 1.12 – Коды Левенштейна
n |
Гамма-код Левенштейна |
1 |
1 |
5 |
01001 |
13 |
0100011 |
63 |
01010101011 |
129 |
010000000000001 |
Подчеркиванием показаны флаговые биты. Заметим, что последним таким битом всегда будет единица, которая являлась старшим битом в двоичном представлении кодируемого числа.
11) Старт-шаг-стоп коды (Start-step-stop codes)
Эти коды определяются тремя параметрами {i, j, k}. Код определяет серии блоков кодовых слов возрастающей длины: первый блок с числовой частью длиной i битов, второй — i + j битов, затем — i + 2j битов, и так далее до длины k битов. Группы кодовых слов имеют унарный префикс, дающий номер группы. Таким образом, код {3, 2, 9} имеет кодовые слова с числовой частью 3, 5, 7 и 9 бит и префиксы 0, 10, 110 и 111 (опуская последний 0 в последнем префиксе). Данные коды представлены в таблице 1.13 и выглядят так:
Таблица 1.13 – Старт-шаг-стоп коды
Кодовое слово |
Диапазон |
0xxx |
0-7 |
10xxxxx |
8-39 |
110xxxxxxx |
40-167 |
111xxxxxxxxx |
168-679 |
Далее приводится
общая формула для
Восстановление числа n по заданному {i, j, k}-start-step-stop коду
Пусть дан {i, j, k}-код и пусть количество единиц в унарной части (экспоненты) равно Q. Тогда число n (закодированное число) равно (1.7):
, (1.7)
где β — мантисса записанного кода, Dec(x) — функция, переводящая x в десятичную систему счисления.
Получение {i, j, k}-start-step-stop кода по заданному числу n
Теперь наоборот,
пусть задано число n. Для получения
его кода необходимо найти такое
минимальное положительное