Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
Пример 8.10. Рассмотрим алфавиты Α = {a, b, c, d, e}, Β = {0, 1} и
код
ϕ(Α) = {100, 001, 101, 1101, 11011}.
Нетрудно убедиться, что для ϕ(Α) неравенство Макмиллана выполня­ется. Между тем ϕ(Α) не является однозначно декодируемым. На­пример, слово β = 11011101 допускает две расшифровки:
β = (11011) (101) = ϕ(e) ϕ(c) = ϕ(ec), β = (1101) (1101) = ϕ(d) ϕ(d) = ϕ(dd).
Существуют необходимые и одновременно достаточные усло-
вия однозначного декодирования алфавитного кода. Эти условия про­веряются с помощью соответствующих алгоритмов: алгоритма Марко­ва и алгоритма анализа окончаний [8, 25]. Приведем второй из них как наиболее простой и эффективный. Пусть задан исходный алфавитный код ϕ(Α) = {β1, … , βn}, для которого n > 1 и Λ ϕ(Α).
Алгоритм 8.2. Распознавание однозначности кода ϕ(Α) путем анализа окончаний
1. Положить W:= . Рассмотреть все пары элементарных кодов βi, βj ϕ(Α), i j. Если среди них есть равные пары кодов, то процесс завершить ответом: ϕ(Α) не является однозначно декоди­руемым кодом. В противном случае найти пары, в которых один элементарный код является собственным префиксом другого элементарного кода. Для каждой такой пары найти собственное окончание, которое остается после удаления префикса из началь­ной части более длинного элементарного кода. Например, для па­ры β
= 10 и βj = 10010 окончанием будет слово 010. Все най-
i
денные собственные окончания записать в W и перейти на пункт 2. Если таких пар нет в ϕ(А), т. е. W не изменилось и ос­талось пустым, то процесс завершить ответом: ϕ(А) – префикс­ный, а значит, однозначно декодируемый код.
2. Выполнить сравнение всех возможных пар слов, одно из кото­рых принадлежит W, а другое – алфавитному коду ϕ(Α), и вы­делить собственные окончания. Все новые окончания добавить в W.
101
3. Пункт 2 повторять до тех пор, пока будут появляться новые окончания.
4. Выполнить проверку условия: – если
иначе ответ:
Очевидно, что алгоритм 8.2 имеет полиномиальную сложность.
Проиллюстрируем его работу на примерах.
Пример 8.11. Вернемся к коду из примера 8.6:
W ∩ ϕ(Α) = , т. е. ни одно окончание из W не совпадает
ни с одним элементарным кодом из ответом:
ϕ(Α) является однозначно декодируемым кодом;
ϕ(Α), процесс завершить
ϕ(Α) не допускает однозначного декодирования.
ϕ(Α) = {01, 32, 0, 12033, 20}.
Применим к нему алгоритм 8.2. В результате попарного сравнения в пункте 1 элементарных кодов из ϕ(Α) получим W = {1}. После пер­вой итерации пункта 2 имеем W = {1, 2033}. Повторение пункта 2 дает
W = {1, 2033, 33},
после чего W уже не изменяется. Итак, W ϕ(Α) = и ϕ(Α) одно­значно декодируемый код.
Пример 8.12. Для алфавитного кода
ϕ(Α) = {0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001}
из примера 8.9 алгоритм 8.2 работает следующим образом. Выполне­ние пункта 1 дает
W = {0, 1, 00, 01, 10, 11, 000, 001}.
В пункте 2 множество W не пополняется. В итоге
W ∩ ϕ(Α) = {0, 1, 10, 11} ≠ ∅.
Поэтому ϕ(Α) не является однозначно декодируемым кодом, что под­тверждает результат примера 8.9.
Пример 8.13. Вновь рассмотрим алфавитный код
ϕ(Α) = {100, 001, 101, 1101, 11011}.
102
Из примера 8.10 известно, что данный код не допускает одно-
значного декодирования. В самом деле, в процессе выполнения алго­ритма 8.2 множество Имеем неоднозначность алфавитного кода
= {101}
≠ ∅.
W принимает вид W = {1, 00, 01, 101, 1011}.
ϕ), поскольку W ∩ ϕ(Α) =
Алгоритм 8.2 также работает верно, когда один элементарный
код является конкатенацией других.
Пример 8.14. Пусть задан алфавитный код
ϕ(Α) = {01, 11, 011101},
где β1 = 01, β2 = 11, β3 = 011101 = β1 β2 β1. Сравнение элементарных кодов в пункте 1 приводит к W = {1101}. При выполнении пункта 2 множество W пополняется окончанием 01. В итоге
W = {1101, 01}, W ∩ ϕ(Α) = {01} ≠ ∅.
Это свидетельствует о том, что ϕ(Α) не является однозначно декоди­руемым кодом.

8.4. Порядок выполнения задания

8.4.1. Разработать алгоритм и программу проверки достаточных
условий однозначного декодирования алфавитного кода, сформулиро­ванных в утверждении 8.1. Оценить вычислительную сложность раз­работанного алгоритма. При отладке программы использовать приме­ры 8.3–8.7.
8.4.2. Разработать алгоритм и программу проверки необходи-
мых условий однозначного декодирования алфавитного кода, опреде­ленных утверждением 8.2. Оценить вычислительную сложность разра­ботанного алгоритма. Правильность работы программы проверить на примерах 8.8–8.10.
8.4.3. Изучить алгоритмы 8.1 и 8.2 и выполнить оценку их вы-
числительной сложности. Реализовать эти алгоритмы в виде программ. При отладке программ использовать примеры 8.11–8.14.
8.4.4. Программы из пунктов 8.4.1–8.4.3 объединить в единую
программу, которая должна распознавать различными способами од-
103
нозначность алфавитного кода, кодировать и декодировать сообщение префиксным кодом. С помощью этой программы найти однозначно декодируемые коды из табл. 8.1, а найденные префиксные коды при­менить к четверостишию стихотворения А. С. Пушкина из табл. 8.2.

8.5. Варианты

Таблица 8.1
Номер
Алфавитный код
варианта
1 {01, 201, 112, 122, 0112}
{001, 021, 102, 201, 001121, 010121101}
{0, 01, 0010001001}
2 {0, 101010, 01010101}
{01, 011, 100, 2100, 101210, 001210}
{01, 011, 100, 2100, 10110, 00112}
3 {01, 12, 021, 0102, 10112}
{01, 12, 012, 111, 0102, 10112, 01112}
{01, 12, 012, 0102, 020112}
4 {01, 10, 210, 121, 0210, 0112}
{01, 10, 210, 201, 0210, 011022, 2221}
{01, 10, 210, 201, 0210, 011022, 221}
5 {01, 12, 01121, 21201}
{10, 12, 012, 101, 2100}
{01, 12, 011, 01210, 201120, 2011220}
6 {01, 10, 210, 201, 0210, 011022}
{01, 12, 011, 01210, 20120, 2011220}
{10, 01, 12, 012, 2100, 12011, 12010}
ϕ(А) = {β
, …, βn}
1
104
Таблица 8.2
Номер
варианта
1
2
3
4
5
Текст α
я_помню_чудное_мгновенье:_ передо_мной_явилась_ты,_ как_мимолетное_виденье,_ как_гений_чистой_красоты.
в_томленьях_грусти_безнадежной,_ в_тревогах_шумной_суеты_ звучал_мне_долго_голос_нежный_ и_снились_милые_черты.
шли_годы._бурь_порыв_мятежный_ рассеял_прежние_мечты,_ и_я_забыл_твой_голос_нежный,_ твои_небесные_черты.
в_глуши,_во_мраке_заточенья_ тянулись_тихо_дни_мои_ без_божества,_без_вдохновенья,_ без_слез,_без_жизни,_без_любви.
душе_настало_пробужденье:_ и_вот_опять_явилась_ты,_ как_мимолетное_виденье,_ как_гений_чистой_красоты.
6
и_сердце_бьется_в_упоенье,_ и_для_него_воскресли_вновь_ и_божество,_и_вдохновенье,_ и_жизнь,_и _слезы,_и_любовь.
105
ЗАДАНИЕ 9
Оптимальное кодирование и сжатие текстов
Часто необходимо сжимать данные, чтобы минимизировать
объем памяти для их хранения или время передачи данных. Для сжа­тия текстовых данных преимущественно используют оптимальные алфавитные коды. Все они основаны на двух принципах: выполнение свойства префикса; кодирование более короткими элементарными ко­дами тех букв, которые чаще встречаются в тексте. Наиболее извест­ный из этих кодов – код Хаффмена [2, 25]. Цель данного задания – изучение и программирование алгоритмов построения кода Хаффмена, практика анализа алгоритмов.

9.1. Средняя длина элементарного кода

Предположим, что некоторый источник генерирует сообщения
в алфавите Α = {a1, ..., an}. Для кодирования сообщений используется алфавит Β = {b1, ..., bq}, при этом n > q > 1. Кодирование выполняется побуквенно на основе схемы
а
β1,
1
ϕ: ...
а
βn,
n
(аi Α, β
ϕ(Α) = {β
∈ Β*, i = 1, …, n). Схема ϕ определяет алфавитный код
i
, ..., βn} как некоторую совокупность элементарных кодов.
1
Будем далее полагать, что элементарные коды в ϕ(Α) перечисляются в том же порядке, что и соответствующие им буквы алфавита Α.
Очевидно, что если ϕ(Α) является однозначно декодируемым
кодом, то алфавитный код ϕ*(Α), получаемый из ϕ(Α) перестановкой элементарных кодов, также является однозначно декодируемым. Когда длины элементарных кодов равны (ϕ(Α) – равномерный код), то пере­становка β
в ϕ(Α) не влияет на длину кода сообщения. Но если дли-
i
ны элементарных кодов различны, то длина кода сообщения зависит от состава букв в сообщении и от того, какие элементарные коды ка­ким буквам назначены.
106
Интуитивно ясно, что для минимизации длины кодов сообще-
ний надо часто встречающиеся буквы кодировать короткими элемен­тарными кодами, оставив более длинные слова буквам, появляющимся в сообщениях гораздо реже.
В математике мерой частоты появления того или иного события
(в нашем случае появления буквы аi Α в сообщении α) является вероятность. Не останавливаясь на строгом определении, заметим, что
вероятность некоторого события определяет долю случаев, в которых
это событие произошло, к общему числу случаев. В дальнейшем веро­ятность события аi будем обозначать pi.
Пример 9.1. Пусть Α = {a
, a2, a3, a4} – исходный алфавит. Извест-
1
ны вероятности
1
,
2
1
,
4
1
,
8
1
.
==== pppp
4321
8
Это означает, что в сообщении α Α* длиной 1000 букв около 500 раз появится буква a1, около 250 раз – буква a2 и примерно 125 раз – ка­ждая из букв a3 и a4.
Важно отметить, что
р
+ р2 + р3+ р4 = 1,
1
т. е. появление в непустом сообщении α буквы a1, или a2, или a3, или a4 является достоверным событием – событием с вероятностью 1. В таком случае говорят о полной группе событий.
Если использовать 2-разрядный равномерный код
ϕ
(Α) = {00, 01, 10, 11},
1
то сообщению α длины 1000 будет всегда отвечать код сообщения
ϕ
(α) длины 2000. Применение неравномерного префиксного кода
1
ϕ
(Α) = {0, 10, 110, 111}
2
приводит к коду сообщения ϕ2(α), длина которого примерно равна
500 | β1| + 250 | β2| + 125 | β3| + 125 | β4| =
= 500 + 250 · 2 + 125 · 3 +125 · 3 = 1750,
так что |
ϕ2
(α) | < |
ϕ1
(α) |.
107
Примечательно, что в примере 9.1 буквы в алфавите Α перечисле-
ны в порядке убывания вероятностей их появления, а элементарные коды в ϕ2(Α) – в порядке возрастания длин этих кодов. Таким образом, применение неравномерного кода и учет вероятностных характеристик источника сообщений позволяет уменьшить длину кодов сообщений.
Основной характеристикой алфавитного кода является средняя
длина его элементарных кодов. Определим это понятие.
Пусть заданы алфавиты
Α = {a
, ..., an}, Β = {b1, ..., bq}, n > q > 1.
1
Кроме того, известен набор вероятностей
1
in
1
=ni
,1),...,,(P
==
ppp
где pi – вероятность появления буквы аi Α в словах, генерируемых источником сообщений. Не ограничивая общности, будем считать, что
p
p
≥ ... ≥ p
1
2
pn > 0,
n 1
т. е. из Α сразу исключим буквы, которые не могут появляться в со­общениях, а остальные упорядочим по убыванию вероятностей их по­явления. Пусть ϕ(Α) = {β1, ..., βn} – алфавитный код, в котором слово βi является кодом буквы аi Α и ℓi – длина β
Β* (i = 1, …, n). Тогда
i
число
ℓcp = p1ℓ1 + ... + pnℓn =
piℓi
=ni 1
называется средней длиной элементарного кода для ϕ(Α) относи-
тельно Ρ. Значение
это среднее число букв кодирующего алфа-
cp
вита Β, приходящихся на одну букву исходного алфавита Α.
Пример 9.2. Рассмотрим для
Α = {a
, a2, a3, a4}, Β = {0, 1}, Ρ =
1
1
,
,
4
2
,
8
8
1
1
1
два алфавитных кода
ϕ
(Α) = {0, 10, 110, 111}, ϕ2(Α) = {111, 110, 10, 0},
1
108
где ϕ2(Α) получается из ϕ1(Α) перестановкой элементарных кодов. Вычислим среднюю длину элементарного кода для ϕ1(Α) и ϕ2(Α):
ℓcp (ϕ1, Ρ) =
ℓcp (ϕ2, Ρ) =
1
2
1
2
· 1 +
· 3 +
1
· 2 +
4
1
· 3 +
4
1
8
1
8
· 3 +
· 2 +
1
· 3 = 1
8
1
· 1 = 2,625.
8
3
= 1,75;
4
Следовательно, значение ℓcp зависит от порядка назначения элемен­тарных кодов буквам алфавита Α.
Обозначим через L = (ℓ1, ..., ℓn) набор длин элементарных ко-
дов для ϕ(Α) = {β1, ..., βn}, где ℓi = | β
|, i = 1, …, n. Заметим, что если
i
наборы Ρ = (p1, …, pn), L = (ℓ1, …, ℓn) рассматривать как векторы, то ℓcp – скалярное произведение этих векторов. Нетрудно убедиться в справедливости следующего утверждения.
Утверждение 9.1. При p
p2 ... pn наименьшее значение
1
скалярного произведения векторов Ρ = (p1, …, pn), L = (ℓ1, …, ℓn) дос­тигается, когда ℓ1 ℓ2 ... ℓn.
Ясно, что равномерные коды можно считать частным случаем
неравномерных кодов, когда ℓ1 = ℓ
ℓcp =
=ni 1
= ... = n. В этих условиях
2
piℓ
i
=
1
=ni 1
pi = 1,
т. е. значение ℓcp совпадает с разрядностью равномерного кода и не зависит от порядка назначения элементарных кодов буквам алфавита
Α.
В случае равновероятности появления букв алфавита Α в пере-
даваемых сообщениях, когда
1
...
1
,
===
pp
n
n
ℓcp также не зависит от того, какие элементарные коды каким буквам назначены, и
ℓcp =
pi ℓ
=ni 1
1
=
(1 + ... + n).
i
n
109

9.2. Формулировка задачи

Α = {a
Пусть заданы алфавиты
и набор вероятностей
n
1
i
=
1
Предположим, что буквы алфавита Α появляются в сообщениях неза­висимо друг от друга. Тогда стремление уменьшить длины кодов со­общений сводится к минимизации величины ℓcp.
Имеем следующую оптимизационную задачу: для заданных Α,
Β, Ρ требуется найти такой набор L = (ℓ
бы минимум ℓcp и удовлетворял неравенству Макмиллана
n
1
q
i
1
=
Используемое в формулировке задачи неравенство Макмиллана гаран­тирует возможность построения префиксного, а значит, однозначно декодируемого кода по найденному набору длин L = (ℓ1, …, ℓn). Об этом свидетельствует следующее утверждение.
, ..., an}, Β = {b1, ..., bq}, n > q > 1,
1
>==
pppppp
in
q
i
21
, …, n), который доставлял
1
.|B|,1
=
n
.0...,1),...,,(P
Утверждение 9.2 [25]. Если числа
, …, n удовлетворяют нера-
1
венству Макмиллана, то существует алфавитный префиксный код
для которогоi = | β
ϕ(Α) = {β
|, i = 1, …, n.
i
, ..., βn},
1
Префиксный алфавитный код, для которого набор L = (ℓ1, …, ℓn)
длин его элементарных кодов является решением сформулированной задачи, называется оптимальным (Ρ, q)-кодом. Элегантный алгоритм точного решения этой задачи предложил Д. Хаффмен.
Не умаляя общности, в дальнейшем ограничимся рассмотрени-
ем оптимальных (P, 2)-кодов.
110
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]