Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
X
- •ПРЕДИСЛОВИЕ
- •1.1. Основные понятия и обозначения
- •1.2. Битовая шкала множества
- •2.3. Бинарные коды Грея
- •2.4. Порядок выполнения задания
- •1.4. Отношения над множествами
- •1.5. Расстояние между множествами
- •1.6. Порядок выполнения задания
- •1.7. Варианты
- •2.1. Формулировка задачи
- •2.2. Счет в двоичной системе счисления
- •2.5. Варианты
- •3.1. Определение комбинаторных объектов
- •3.2. Генерация сочетаний
- •3.3. Генерация перестановок
- •3.4. Порядок выполнения задания
- •3.5. Варианты
- •ГЛАВА 2. АЛГОРИТМЫ НА ГРАФАХ
- •4.1. Основные понятия и обозначения
- •4.2. Отношения и операции
- •4.3. Родственные графам объекты
- •4.4. Способы машинного представления
- •4.5. Порядок выполнения задания
- •4.6. Варианты
- •5.1. Обход вершин графа в глубину или ширину
- •5.2. Базовые задачи на графах
- •5.3. Порядок выполнения задания
- •5.4. Варианты
- •6.1. Формулировка задачи
- •6.2. Алгоритм Краскала
- •6.3. Алгоритм Прима
- •6.4. Некоторые замечания
- •6.5. Порядок выполнения задания
- •6.6. Варианты
- •7.1. Формулировка задачи
- •7.5. Кратчайшие контуры и транзитивное замыкание
- •7.6. Порядок выполнения задания
- •7.7. Варианты
- •ГЛАВА 3. АЛФАВИТНОЕ КОДИРОВАНИЕ
- •8.1. Основные понятия и обозначения
- •8.2. Формулировка задачи
- •8.3. Критерии однозначного декодирования
- •8.4. Порядок выполнения задания
- •8.5. Варианты
- •9.1. Средняя длина элементарного кода
- •9.2. Формулировка задачи
- •9.3. Свойства оптимальных кодов
- •9.4. Алгоритм Хаффмена
- •9.5. Сжатие текстов
- •9.6. Порядок выполнения задания
- •9.7. Варианты
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •АЛФАВИТНЫЙ УКАЗАТЕЛЬ
- •ОГЛАВЛЕНИЕ

Пример 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
