СВОЙСТВО ПРЕФИКСА, ИЛИ КУДА ИДТИ РОБОТУ

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

Таблица 11

clip_image002

Но пусть, к примеру, данные сообщения — это команды) выдаваемые электронному роботу: Ах — идти прямо, Аа —i повернуть назад, As — свернуть влево, At — свернута вправо. Предположим, что программа поведения робота! задается следующей последовательностью:

clip_image004

В результате кодирования эта последовательность пре< {образуется в такой двоичный текст:

clip_image006

Легко вообразить себе, в какое недоумение привели 6б мы робота, снабдив его подобной инструкцией. Куда же ему идти? Ясно, что сначала надо идти прямо. А дальше - свернуть влево или повернуть назад, потом еще раз назад? Впереди же еще большая путаница...

Естественно возразить, что следовало бы отделить одно кодовое слово от другого. Разумеется, это можно сделать, но лишь используя либо паузу между словами, либо спе­циальный разделительный знак, для которого необходимо особое кодовое обозначение. И тот и другой путь приведем к значительному удлинению кодового текста, сводя на не! наше предыдущее «усовершенствование».

Другое дело, если мы будем пользоваться прежними кодовыми обозначениями для сообщений At. Тогда после­довательность (1) будет закодирована так:

clip_image008

Здесь уже не может быть разночтений. Первое слово 0 — идти прямо, второе слово 110 — свернуть влево, так как в списке кодовых слов не значатся слова 1 и 11. В этом сплош­ном тексте одно за другим однозначно выделяются кодовые слова, и нет сомнений, что робот найдет правильную до­рогу.

Итак, суть проблемы в том, что нужно уметь в любом кодовом тексте выделять отдельные кодовые слова без использования специальных разделительных знаков. Иначе говоря, мы хотим, чтобы код удовлетворял следующему требованию: всякая последовательность кодовых символов может быть единственным образом разбита на кодовые сло­ва. Коды, для которых последнее требование выполнено, называются однозначно декодируемыми (иногда их называ­ют кодами без запятой).

clip_image010

Наиболее простыми и употребимыми кодами без запятой являются так называемые префиксные коды, обладающие тем ствойством, что никакое кодовое слово не является началом (префиксом) другого кодового слова. Если код префиксный, то, читая кодовую запись подряд от начала, мы всегда смо­жем разобраться, где кончается одно кодовое слово и начи­нается следующее. Если, например, в кодовой записи встре­тилось кодовое обозначение 110, то раз­ночтений быть не может, так как в силу префиксности наш код не содержит кодо­вых обозначений 1, 11 или, скажем, 1101. Именно так обстояло дело для рассмотрен­ного выше кода, который очевидно явля­ется префиксным.

Нетрудно понять, как отражается свой­ство префиксности или его отсутствие на кодовом дереве. На рис. 6 представлено дерево для кода из таблицы 11 (круж­ками, как и раньше, помечены те вершины, которые соот­ветствуют кодовым словам). Таким образом, если свойство префикса не выполняется, то некоторые промежуточные вер­шины дерева могут соответствовать кодовым словам. Для кода Фано это невозможно, так как по самому алгоритму кодирования построение кодового слова заканчивается од­новременно с достижением концевой вершины. Следова­тельно, код Фано является префиксным кодом.

Предлагаю ознакомиться с аналогичными статьями: