Избыточность информационных потоков и ее практическое использование.



 

Приведение ДЭФ по модулю и свойства приведения для четного и нечетного N.

Приведем примеры матриц ДЭФ для двух вариантов , четного и нечетного. Рассмотрим четное , например . Матрица значений  напоминает таблицу умножения (см.рис.5.5).

  Рис. 5.5. Матрица ДЭФ при  

Матрица а) представляет перечисление фаз в их абсолютном выражении. В частности, фаза последней функции (правый нижний угол) соответствует шести полным оборотам (и еще немного).

Матрица б) соответствует формуле приведения, согласно которой из фазовой координаты вычитается число, удаляющее кратное число оборотов вектора. В приведенном нами примере, удаляются цифры, кратные 8. Остаток должен лежать в пределах от 0 до . В частности, в элементе, стоящем на пересечении пятого столбца и седьмой строки (это число 20), при  получается .

Приведение по модулю  является базовым преобразованием в ЦОС.

Обратим внимание на вторую матрицу б). Она приведена по модулю . При этом остатки от приведения лежат в пределах заданного множества . Приведение сводится к тому, что остаток находится в пределах от 0 до .

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

Приведение по модулю  является фундаментальной операцией, приводящей к оригинальным последствиям. Рассмотрим матрицу ДЭФ в полном и приведенном варианте при , т. е. нечетном.

 

  Рис. 5.6. Матрица ДЭФ при  

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

Эффективное кодирование. Коды Шеннона-Фано.

Сущность кодов заключается в том, что они неравномерные, то есть с неодинаковым числом разрядов, причем длина кода обратно пропорциональна вероятности его появления. Еще одна замечательная особенность эффективных кодов – они не требуют разделителей, то есть специальных символов, разделяющих соседние кодовые комбинации. Это достигается при соблюдении простого правила: более короткие коды не являются началом более длинных. В этом случае сплошной поток двоичных разрядов однозначно декодируется, поскольку декодер обнаруживает вначале более короткие кодовые комбинации. Эффективные коды долгое время были чисто академическими, но в последнее время успешно используются при формировании баз данных, а также при сжатии информации в современных модемах и в программных архиваторах [39].

Ввиду неравномерности вводят среднюю длину кода. Средняя длина – математическое ожидание длины кода:

. (2.22)

Здесь  – длина -той кодовой комбинации;  – ее вероятность;  – число различных комбинаций. Особенностью эффективных кодов является то, что средняя длина кода приближается к энтропии источника:

 

, (2.23)

 

причем,  стремится к  сверху (то есть ).

Выполнение условия (2.23) усиливается при увеличении .

Существует две разновидности эффективных кодов: Шеннона-Фано и Хафмана. Рассмотрим их получение на примере. Предположим, вероятности символов в последовательности имеют значения, приведенные в таблице 2.1.

Таблица 2.1

Вероятности символов

1 2 3 4 5 6 7 8 9
0,1 0,2 0,1 0,3 0,05 0,15 0,03 0,02 0,05

Символы ранжируются, то есть представляются в ряд по убыванию вероятностей. После этого по методу Шеннона-Фано периодически повторяется следующая процедура: вся группа событий делится на две подгруппы с одинаковыми (или примерно одинаковыми) суммарными вероятностями. Процедура продолжается до тех пор, пока в очередной подгруппе не останется один элемент, после чего этот элемент устраняется, а с оставшимися указанные действия продолжаются. Это происходит до тех пор, пока в последних двух подгруппах не останется по одному элементу. Продолжим рассмотрение нашего примера, которое сведено в таблице 2.2.

Таблица 2.2.

Кодирование по методу Шеннона-Фано

1 2 3 4 5  
4 0,3   I       11
2 0,2 I II       10
6 0,15   I I     011
3 0,1     II     010
1 0,1     I I   0011
9 0,05 II     II   0010
5 0,05   II   I   00001
7 0,03     II II I 000001
8 0,02         II 000000

Как видно из таблицы 2.2, первый символ с вероятностью  участвовал в двух процедурах разбиения на группы и оба раза попадал в группу с номером I . В соответствии с этим он кодируется двухразрядным кодом II. Второй элемент на первом этапе разбиения принадлежал группе I, на втором – группе II. Поэтому его код 10. Коды остальных символов в дополнительных комментариях не нуждаются.

Обычно неравномерные коды изображают в виде кодовых деревьев. Кодовое дерево – это граф, указывающий разрешенные кодовые комбинации [24]. Предварительно задают направления ребер этого графа, как показано на рис.2.10 (выбор направлений произволен).

Рис. 2.10. Кодовое дерево для табл. 2.2

По графу ориентируются следующим образом: составляют маршрут для выделенного символа; количество разрядов для него равно количеству ребер в маршруте, а значение каждого разряда равно направлению соответствующего ребра. Маршрут составляется из исходной точки (на чертеже она помечена буквой А). Например, маршрут в вершину 5 состоит из пяти ребер, из которых все, кроме последнего, имеют направление 0; получаем код 00001.

Вычислим для этого примера энтропию и среднюю длину слова:

 

 

Как видно, средняя длина слова близка к энтропии.

 

Коды Хафмана.

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

На втором этапе происходит собственно кодирование, которое начинается с последнего этапа: первому из двух символов присваивают код 1, второму – 0. После этого переходят на предыдущий этап. К символам, которые не участвовали в сжатии на этом этапе, приписывают коды с последующего этапа, а к двум последним символам дважды приписывают код символа, полученного после склеивания, и дописывают к коду верхнего символа 1, нижнего – 0. Если символ дальше в склеивании не участвует, его код остается неизменным. Процедура продолжается до конца (то есть до первого этапа).

Таблица 2.3.

Кодирование по алгоритму Хафмана

N код I II III IV V VI VII
4 0.3 11 0.3        11 0.3     11 0.3   11 0.3   11 0.3 11 0.4 0 0.6 1
2 0.2 01 0.2        01 0.2     01 0.2   01 0.2   01 0.3 10 0.3 11 0.4 0
6 0.15 101 0.15    101 0.15 101 0.15 101 0.2   00 0.2 01 0.3 10  
3 0.1 001 0.1      001 0.1   001 0.15 100 0.15 101 0.2 00    
1 0.1 000 0.1      000 0.1   000 0.1 001 0.15 100      
9 0.05 1000 0.05  1000 0.1 1001 0.1 000        
5 0.05 10011 0.05 10011 0.05 1000          
7 0.03 100101 0.05 10010            
8 0.02 100100              

В таблице 2.3 показано кодирование по алгоритму Хафмана. Как видно из таблицы, кодирование осуществлялось за семь этапов. Слева указаны вероятности символов, справа – промежуточные коды. Стрелками показаны перемещения вновь образованных символов. На каждом этапе два последних символа отличаются только младшим разрядом, что соответствует методике кодирования. Вычислим среднюю длину слова:

 

Недостатком кода Хафмана можно считать то, что нулевая кодовая комбинация не всегда соответствует наименее вероятному символу. Это может привести к потере этого символа при передаче нулей низкими уровнями.

Оба кода удовлетворяют требованию однозначности декодирования: как видно из таблиц, более короткие комбинации не являются началом более длинных кодов.

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

Эффект от внедрения таких кодов определяется в сравнении их с равномерным кодом:

(2.24)

 

где  – количество разрядов равномерного кода, который заменяется эффективным.

Классический алгоритм Хафмана относится к двухпроходным, т. е. требует вначале набора статистики по символам и сообщениям, а потом описанных выше процедур. Это неудобно на практике, поскольку увеличивает время обработки сообщений и накопления словаря. Чаще используются однопроходные методы, в которых процедуры накопления и кодирования совмещаются. Такие методы называются ещё адаптивным сжатием по Хафману [48].

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

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

Одновременно вершины нумеруются. Нумерация начинается с нижних (висячих, т. е. не имеющих детей) вершин слева направо, потом переносится на верхний уровень и т.д. до нумерации последней, исходной вершины. При этом достигается следующий результат: чем меньше вес вершины, тем меньше её номер.

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

После прохождения последовательности (она называется также контрольной или тестовой) всем висячим вершинам присваиваются кодовые комбинации. Правило присвоения кодов аналогично вышеизложенному: количество разрядов кода равно количеству вершин, через которые проходит маршрут от исходной до данной висячей вершины, а значение конкретного разряда соответствует направлению от родителя к «ребёнку» (скажем, переход влево от родителя соответствует значению 1, вправо – 0).

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

Для повышения эффективности метода желательно увеличивать размер словаря; в этом случае коэффициент сжатия повышается. Практически размер словаря составляет 4 – 16 килобайт памяти.

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

Рис. 2.12. Исходное дерево кода Хафмана Рис. 2.13. Изменение весов

Предположим теперь, что символ, соответствующий вершине 1, в тестовой последовательности встретился вторично. Вес вершины изменился, как показано на рис. 2.13, вследствие чего правило нумерации вершин нарушено. На следующем этапе меняем расположение висячих вершин, для чего меняем местами вершины 1 и 4 и перенумеровываем все вершины дерева. Полученный граф приведён на рис. 2.14. Далее процедура продолжается аналогично.

Рис. 2.14. Перестановки в дереве Хафмана

Следует помнить, что каждая висячая вершина в дереве Хафмана соответствует определённому символу или их группе. Родитель отличается от детей тем, что группа символов, ему соответствующая, на один символ короче, чем у его детей, а эти дети различаются последним символом. Например, родителю соответствуют символы «кар»; тогда у детей могут быть последовательности «кара» и «карп».


Дата добавления: 2018-02-18; просмотров: 636; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!