Семинар №3 Кодирование информации. Код Шеннона-Фено. Понятие о кодировании Составляя информационную модель объекта или явления, мы должны договориться о том, как понимать те или иные обозначения, то есть договориться о виде представления информации. Человек выражает свои мысли в виде предложений, составленных из слов. Они являются алфавитным представлением информации. Основу любого языка составляет алфавит - конечный набор различных знаков (символов), из которых складывается сообщение. Одна и та же запись может нести разную смысловую нагрузку. Например, набор цифр 230312 может обозначать: массу объекта; длину объекта; расстояние между объектами; запись даты 23 марта 2012 г. Для представления информации могут использоваться разные коды и, соответственно, надо знать определенные правила - законы записи этих кодов, т.е. уметь кодировать. Код - набор условных обозначений для представления информации. Кодирование - процесс представления информации в виде кода. Для общения друг с другом мы используем код - русский язык. При разговоре этот код передается звуками, при письме - буквами. Водитель передает сигнал с помощью гудка или миганием фар. Вы встречаетесь с кодированием информации при переходе дороги в виде сигналов светофора. Таким образом, кодирование сводиться к использованию совокупности символов по определенным правилам. Кодировать информацию можно различными способами: устно; письменно; жестами или сигналами любой другой природы. 1 Кодирование данных двоичным кодом По мере развития техники появлялись разные способы кодирования информации. Во второй половине XIX века американский изобретатель Сэмюэль Морзе изобрел удивительный код, который служит человечеству до сих пор. Информация кодируется тремя символами: длинный сигнал (тире), короткий сигнал (точка), нет сигнала (пауза) для разделения букв. Своя система существует и в вычислительной технике - она называется двоичным кодированием и основана на представлении данных последовательностью всего двух знаков: 0 и 1. Эти знаки называются двоичными цифрами (binary digit) или сокращенно bit (бит). Одним битом могут быть выражены два понятия: 0 или 1 (да или нет, черное или белое, истина или ложь и т.п.). Если количество битов увеличить до двух, то уже можно выразить четыре различных понятия: 00 01 10 11 Тремя битами можно закодировать восемь различных значений: 000 001 010 011 100 101 110 111 Увеличивая на единицу количество разрядов в системе двоичного кодирования, мы увеличиваем в два раза количество значений, которое может быть выражено в данной системе, то есть общая формула имеет вид: N=2m, где N - количество независимых кодируемых значений; m - разрядность двоичного кодирования, принятая в данной системе. 2 Кодирование методом Шеннона-Фено Представим себе, что одни сообщения приходится передавать довольно часто, другие – редко, третьи – совсем в исключительных случаях. Понятно, что первые лучше закодировать тогда короткими словами, оставив более длинные слова для кодирования сообщений, появляющихся реже. В результате кодовый текст станет в среднем короче, и на его передачу потребуется меньше времени. Впервые эта простая идея была реализована упоминавшимся ранее американским инженером Морзе в предложенном им коде. В математике мерой частоты появления того или иного события является его вероятность. Вероятность события А обозначают обычно символом Р(А) или просто буквой Р. Вероятность некоторого события (сообщения) можно представлять себе как долю тех случаев, в которых оно появляется, от общего числа появившихся событий. Так, если заданы четыре сообщения А1, А2, А3, А4 с вероятностями Р(А1)=½, Р(А2)=¼, Р(А3)=Р(А4)=⅛, то это означает, что среди, например, 1000 переданных сообщений около 500 раз появляется сообщение А1, около 250 – сообщение А2 и примерно по 125 раз – каждое из сообщений А3 и А4. Эти сообщения нетрудно закодировать двоичными словами длины 2, которые представлены в таблице. А1 А2 А3 А4 00 01 10 11 Однако при таком кодировании вероятность появления сообщений никак не учитывается. Можно разбить сообщения на две равновероятные группы: в первую попадает сообщение А1, во вторую – сообщение А2, А3, А4. Сопоставим первой группе символ 0, второй – 1. 3 А1 ½ А2 ¼ А3 ⅛ А4 ⅛ 0 0 1 0 1 1 Далее множество сообщений А2, А3, А4 снова делим на две равновероятные группы. Первой, состоящей из одного сообщения А2, сопоставить символ 0, а второй, в которую входят сообщения А3 и А4, – 1. Наконец, оставшуюся группу из двух сообщений, разобьем на две группы, содержащие сообщения А3 и А4, сопоставив первой из них 0, а второй – 1. Сообщение А1 образовало «самостоятельную» группу на первом шаге, ему будет сопоставлен символ 0. Сообщение А2 образовало «самостоятельную» группу за два шага, поэтому будем кодировать сообщение А2 словом 10. Аналогично, для А3 и А4 выбираем соответственно коды 110 и 111. Указанный способ кодирования был предложен математиком Фено. Алгоритм Шеннона-Фено – один из первых алгоритмов сжатия, который впервые сформулировали американские ученые Шеннон и Фено. Данный метод сжатия имеет большое сходство с алгоритмом Хаффмана, которое появилось на несколько лет позже. Алгоритм использует коды переменной длины: часто встречающийся символ кодируется кодом меньшей длины, редко встречающийся – кодом большей длины. Коды Шеннона-Фено префиксные, то есть, никакое кодовое слово не является префиксом (началом) любого другого. Это свойство позволяет однозначно декодировать любую последовательность кодовых слов. 4 Алгоритм вычисления кодов Шеннона-Фено: Шаг 1. Символы исходного алфавита упорядочиваются по убыванию вероятностей. В результате получаем последовательность ai1,...,aiN (для всех j = 1 ,.., N - 1 выполняется соотношение aij ≥ aij+1). Шаг 2. Переменной-счётчику t присваивается значение 1 (t = 1). Шаг 3. Рассматриваемую последовательность разбиваем на M групп, не меняя порядка следования символов, так чтобы суммарные вероятности символов в каждой группе были примерно одинаковы и максимально близки к 1/M. Получаем совокупность подпоследовательностей G1, G2,..., GM: G1 = (ai1, ai2, .. ,ai k1), G2 = (ai k1+1, ai k1+2, .. ,ai k2), Шаг 4. Формируем t-й символ кодовых слов. Всем символам из подпоследовательности GS приписываем символ bS, s = 1, 2, .. , M. Шаг 5. Переменная-счётчик увеличивается на 1 (t:= t + 1). Шаг 6. Просматриваем все группы-подпоследовательности. Если некоторая группа GS состоит из одного символа aj то для этого aj процесс построения кодового слова считается законченным. Для каждой из этих групп, содержащих по 2 и более символов, выполняем действия, соответствующие Шагу 3 и Шагу 4. В результате чего получаем очередные t-е символы кодовых слов. После просмотра всех групп, осуществляется переход к Шагу 5. Процесс работы алгоритма заканчивается, когда все группы будут содержать ровно по одному символу исходного алфавита. 5 Обратим внимание на ряд особенностей, которые нужно иметь в виду при практическом применении этого метода. Первое. При разбиении на группы не разрешается переставлять элементы с целью выравнивания сумм вероятностей. Порядок, полученный на Шаге 1, сохраняется в течение всего времени работы алгоритма. Второе. Разбиение на группы не всегда выполняется однозначным образом. Это связано с тем, что иногда некоторый "пограничный" символ ai может быть присоединён к любой из двух подгрупп GS или GS+1 равноценным образом. Подобная ситуация может возникнуть не один раз, следовательно, результат кодирования однозначно не определяется. Можно получить несколько равноценных между собой кодов для одного и того же алфавита. Иногда с целью получения однозначности вводят дополнительные условия. Например, можно потребовать, чтобы большее значение суммы было в группе с меньшим номером. Однако такое требование не является обязательным. Третье. Следует на всех шагах придерживаться одинаковой последовательности приписывания символов кодового алфавита группам символов исходного алфавита. Эту последовательность приписывания следует зафиксировать до начала работы алгоритма. Возможны различные способы, но обычно придерживаются следующего правила: символам из группы с номером S приписывают S-й символ кодового алфавита. Это правило присутствует и в приведённом выше алгоритме. 6 Пример кодового дерева показан на рис. 1. Исходные символы: А (частота встречаемости 50), В (частота встречаемости 39), С (частота встречаемости 18), D (частота встречаемости 49), Е (частота встречаемости 35), F (частота встречаемости 24). Полученный код: А – 11, В – 101, С – 100, D – 00, Е – 011, F – 010. Рис. 1. Пример кодового дерева (алгоритм Шеннона-Фено). 7 Пример: Пусть дан ансамбль сообщений, показанный в таблице. Необходимо построить двоичный оптимальный код. Оптимальный код правилами. строится в соответствии с приведенными Наиболее вероятное сообщение кодируется самым коротким сигналом. Полученный оптимальный код является неравномерным. Возникает проблема распознавания сообщений в сигнале. В этом случае для упрощения процедуры декодирования сообщений по принятой последовательности символов необходимо выполнить условие однозначной различимости кодовых комбинаций. Один из способов выполнения этого условия заключается в таком построении кодовых слов, чтобы никакая кодовая комбинация не являлась началом другой. Альтернативой этому служит введение специальных разделительных знаков, которые должны выдаваться в конце каждого кодового слова. Для передачи таких префиксов понадобится еще какой-то символ, помимо 1 и 0, что приведет к увеличению основания кода. Различимость кодов Шеннона-Фено достигается первым методом. Таким образом, при кодировании методом Шеннона-Фено любой последовательности символов можно поставить в соответствие ряд сообщений, что легко проверить. 8 Декодирование эффективных кодов Особенностью эффективных кодов является переменное число двоичных разрядов в получаемых кодовых комбинациях. Это затрудняет процесс декодирования. Рассмотрим вначале, как происходит декодирование сообщения, если использовать коды постоянной длины. Пусть дана кодовая 001000011101. таблица и закодированное Исходные символы Двоичные коды A 00 B 01 C 10 D 11 сообщение Поскольку длина кода равна двум символам, в этом сообщении слева направо выделяются по два двоичных символа и сопоставляются с кодовой таблицей, тогда получим: 00 10 00 01 11 01 A C A B D B Таким образом, в исходном сообщении содержится текст ACABDB. Для декодирования кодов переменной длины рассмотренный подход не подходит. Тем не менее, закодированные сообщения могут декодироваться благодаря свойству префиксности эффективных кодов: ни одна более короткая кодовая комбинация не является началом более длинной кодовой комбинации. 9 Для раскрытия данного тезиса воспользуемся эффективными кодами: а - 1, b - 01, c - 001, d - 000. следующими Здесь самым коротким кодом является код для символа а со значением 1. Как видно, ни один другой код (более длинный) не имеет в начале символ 1. Второй по длине код для символа b имеет значение 01 и, как показывает анализ, не является началом ни для кода 001, ни для кода 000. Таким образом, данный код является префиксным. Пусть получено сообщение перечисленных кодов. 1010010001, составленное из В сообщении слева направо выделяется по одному двоичному символу и делается попытка декодирования. Если попытка успешна, двоичный символ (или символы) исключается из исходной цепочки и заменяется соответствующим исходным символом. Если попытка не удается, во входной цепочке выделяется следующий двоичный символ и уже с двумя двоичными символами делается попытка их декодирования. Если попытка и тогда неудачна, выделяют следующий третий и т.д. Приведем схему декодирования (направление просмотра цепочки слева направо): 1→ а 0→ b 1→ 0→ c 0→ 1→ 0→ d 0→ 0→ 1→ a Знак «-» означает, что попытка декодирования не удалась. Таким образом, при декодировании получили строку abcda. 10