Добавил:
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. Варианты
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •АЛФАВИТНЫЙ УКАЗАТЕЛЬ
- •ОГЛАВЛЕНИЕ

кой системе дорог соответствует орграф G, в котором вершины – города, дуги – дороги, веса дуг – длины дорог.
Требуется
– найти транзитивное замыкание орграфа G, т. е. выяснить, вся-
кий ли город достижим из любого другого;
– определить, есть ли город, выезжая из которого можно объе-
хать все или часть городов и
вернуться обратно (наличие
контуров в орграфе);
– определить, есть ли город, куда можно попасть из любого дру-
гого города, проезжая не более K км.
Исходные данные: матрица весов орграфа; K – расстояние.
Результаты: матрица смежности транзитивного замыкания ис-
ходного орграфа; длины контуров орграфа или сообщение о том, что
контуров нет; номер
вершины, указывающей город, куда можно по-
пасть из любого другого города, проезжая не более K км.
Рекомендация. Использовать алгоритм Флойда.
Разработанную программу применить к орграфам, изображенным на рис. 7.15, 7.19.
1
(3)
5
(5)
(4)
4
(10)
(15)
(17)
(9)
2
(4)
3
Рис. 7.19
Числа в скобках, стоящие у дуг, указывают в данном случае
длины дорог между соответствующими городами.
91

=
ГЛАВА 3
АЛФАВИТНОЕ КОДИРОВАНИЕ
ЗАДАНИЕ 8
Однозначность декодирования
Теория кодирования – раздел дискретной математики, имеющий
обширную область приложений. Кодирование буквально пронизывает
сегодняшний мир информационных технологий и является центральным вопросом при решении самых разных практических задач хранения, защиты, передачи и обработки данных. Основы теории кодирования заложил в 1948 г. К. Шеннон. Им были сформулированы и доказаны две фундаментальные теоремы (для канала без помех и канала с
помехами), которые определили развитие теории кодирования в последующие годы. К настоящему времени наиболее полно исследованы
алфавитные коды, им посвящена глава 3 учебного пособия. Здесь рассматриваются две основные задачи алфавитного кодирования: распознавание однозначного декодирования и оптимальное кодирование.
Цель данного задания: изучение, разработка и программирование критериев однозначного декодирования алфавитных кодов.
8.1. Основные понятия и обозначения
Пусть Α = {a1, ..., an} – конечное непустое множество, или ал-
фавит. Элементы алфавита называются буквами. Конечная последова-
тельность
aa ...α
ii
k
1
букв алфавита Α называется словом, а число | α | – его длиной. Пустое
слово (обозначается Λ) – это слово, в котором нет букв, т. е. | Λ | = 0.
92

=
∈
=
и α
Конкатенацией слов α
1
называется слово α1α2. Заметим,
2
что αΛ = Λα = α, т. е. если слову α предшествует или следует за ним
пустое слово, то в результате конкатенации получаем то же самое слово α. Множество всех слов в алфавите Α, включая пустое слово, принято обозначать Α*.
Рассмотрим другой алфавит Β = {b1, ..., bq} c множеством Β*
всех его слов β. Пусть S ⊆ Α*. Всякая функция φ: S → Β*, ставящая
в соответствие каждому слову α ∈ S слово β = ϕ(α) ∈ Β*, называется
кодированием. При этом слова из S называются сообщениями, а их образы – кодами сообщений. Алфавит Α называется исходным алфавитом,
а Β – кодирующим алфавитом. Обратная функция ϕ–1, если она существует, называется декодированием. В зависимости от числа букв в кодирующем алфавите различают двоичное, троичное и в общем случае
q-ичное кодирование. Так, при двоичном кодировании в качестве кодирующего алфавита чаще всего выступает множество Β = {0, 1}.
Кодирование φ может сопоставлять код β всему сообщению
α как единому целому или же строить β из кодов букв, входящих в
сообщение α. В последнем случае речь идет об алфавитном (или побуквенном) кодировании. Это простейший способ кодирования.
Алфавитное кодирование задается схемой
а1 → β1,
ϕ: ...
аn → βn,
где аi ∈ Α, βi ∈ Β*, i = 1, …, n, которая устанавливает соответствие
между буквами алфавита Α и некоторыми словами из Β*.
Множество кодов букв {β1, …, βn} = {ϕ(a1), …, ϕ(an)} обозначается ϕ(Α) и называется множеством элементарных кодов (или ал-
фавитным кодом).
При алфавитном кодировании код сообщения – конкатенация
кодов букв сообщения, т. е. каждому слову
aa ...α
ii
k
1
ставится в соответствие слово
ϕ(α) = ϕ(
) = ϕ(
aa ...
ii
k
1
a
i
) ... ϕ(
1
) =
a
i
k
ii
1
k
.*Bββ...β
93

Если | β1 | = … = | βn |, то алфавитный код ϕ(Α) = {β1, …, βn} называется равномерным, в противном случае – неравномерным. Число
ℓ = | β1 | = … = | βn | называется разрядностью равномерного алфавитного кода ϕ(Α) = {β1, …, βn}.
8.2. Формулировка задачи
Одной из типичных задач теории кодирования является задача
распознавания однозначного декодирования, которая формулируется
следующим образом. При заданных алфавитах Α, Β и алфавитном
коде
ϕ(Α) = {βi = ϕ(ai) | ai ∈Α, βi ∈ Β*, i = 1, …, n}
определить, допускает ли ϕ однозначное декодирование, т. е. существует ли для функции ϕ обратная функция ϕ–1.
Однозначное декодирование кода ϕ(Α) означает, что каждый
код сообщения является кодом ровно одного сообщения.
Пример 8.1. Рассмотрим неравномерное кодирование, для которо-
го Α = {a, b}, Β = {0, 1} и схема кодирования имеет вид
а → 0,
ϕ: ...
b → 01.
Здесь сообщению α = abbaab соответствует код сообщения
β = ϕ(abbaab) = ϕ(a) ϕ(b) ϕ(b) ϕ(a) ϕ(a) ϕ(b) = 001010001.
Очевидно, что алфавитный код ϕ(Α) = {0, 01} является однозначно
декодируемым, поскольку в данном случае процесс разделения кода
сообщения на элементарные коды можно организовать следующим
образом: сначала выделить пары (01) и заменить их буквой b, а затем
оставшиеся буквы 0 заменить буквой a. Например, для кода сообщения β = 001010001 имеем
β = 0 (01) (01) 00 (01) = ϕ(a) ϕ(b) ϕ(b) ϕ(a) ϕ(a) ϕ(b) = ϕ(abbaab).
94

ϕ
Пример 8.2. Пусть Α = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, Β = {0, 1}, и ко-
дирование выполняется по схеме
0 → 0000,
1 → 0001,
2 → 0010,
3 → 0011,
4 → 0100,
:
5 → 0101,
6 → 0110,
7 → 0111,
8 → 1000,
9 → 1001.
Это так называемое двоично-десятичное кодирование. В данном
случае сообщениям α1 = 333, α2 = 77 соответствуют коды
ϕ(α1) = ϕ(333) = ϕ(3) ϕ(3) ϕ(3) = 001100110011,
ϕ(α2) = ϕ(77) = ϕ(7) ϕ(7) = 01110111.
Двоично-десятичный код ϕ(Α) является 4-разрядным равномерным
кодом, в котором все элементарные коды попарно различны. Очевидно, что такой код допускает однозначное декодирование, которое сводится к разделению кода сообщения на слова длины 4 и замене каждого из них соответствующей буквой алфавита Α. Например, слово
β = 000010010110
является кодом сообщения α = 096, так как
β = (0000) (1001) (0110) = ϕ(0) ϕ(9) ϕ(6) = ϕ(096).
Очевидны следующие достаточные и необходимые условия однозначного декодирования алфавитного кода:
– если ϕ(Α) является равномерным кодом, в котором все эле-
ментарные коды попарно различны, то он всегда допускает
однозначное декодирование;
– однозначно декодируемый код ϕ(Α) не может содержать равных
элементарных кодов, а также элементарного кода, представимого
в виде конкатенации других его элементарных кодов.
95

Пример 8.3. Пусть Α = {a, b, c}, Β = {0, 1} и ϕ(Α) = {0, 10, 100}.
Здесь β1 = 0, β2 = 10, β3 = 100 = β2 β1, поэтому код ϕ(Α) не является
однозначно декодируемым. Например, слово β = 0010100010 – образ
следующих сообщений α1 = aabcab и α2 = aabbaab, так как
ϕ(α1) = ϕ(aabcab) = (0) (0) (10) (100) (0) (10) = 0010100010,
ϕ(α2) = ϕ(aabbaab) = (0) (0) (10) (10) (0) (0) (10) = 0010100010.
Приведенные необходимые и достаточные условия носят частный характер. Известны более общие эффективно вычисляемые критерии распознавания однозначного декодирования алфавитного кода
[8, 25]. Наиболее важные из них обсуждаются далее.
8.3. Критерии однозначного декодирования
Пусть слово β ∈ Β* имеет вид
β = β′ β′′,
где β′, β′′∈ Β*. Тогда слово β′ называется префиксом (или началом),
а β′′ – постфиксом (или окончанием) слова β. При этом пустое слово
Λ и само β считаются префиксами и постфиксами слова β. Все префиксы и постфиксы слова β, отличные от Λ и β, называются собственными. Например, для слова β = 011 собственными префиксами
выступают слова 0 и 01, а собственными постфиксами – 1 и 11.
Алфавитный код ϕ(Α) называется префиксным, если ни один
элементарный код из ϕ(Α) не является префиксом другого элементарного кода из ϕ(Α). О таких кодах говорят, что они обладают свой-
ством префикса.
Очевидно, что если в ϕ(Α) имеется хотя бы одна пара совпадающих элементарных кодов βi, βj, т. е. βi = βj, то префиксность ϕ(Α)
нарушается, поскольку βi = βj Λ и βj – префикс для βi, βj = βi Λ и βi –
префикс для βj. То же самое имеет место и в случае, когда ϕ(Α) имеет
элементарный код, представимый в виде конкатенации других элементарных кодов из ϕ(Α). Очевидно, что пустое слово Λ не может быть
составляющей алфавита префиксного кода, поскольку Λ является
префиксом любого слова. В дальнейшем будем полагать, что Λ ∉ ϕ(Α).
96

Пусть задан алфавитный код ϕ(Α) = {β
β слово, получающееся из β
рез
i
βi = β
... β
i
1
∈ ϕ(Α) «обращением»:
i
,
β = β
i
i
k
, …, βn}. Обозначим че-
1
... β
i
.
i
k
1
Под ϕ(Α) будем понимать алфавитный код
(Α) = {
ϕ
β , …, nβ }.
1
Справедливо следующее достаточное условие однозначного декодирования алфавитного кода, которое нетрудно доказать методом
от противного.
Утверждение 8.1. Если ϕ(Α) или
(Α) является префиксным
ϕ
кодом, то ϕ(Α) допускает однозначное декодирование.
Пример 8.4. Вернемся к алфавитному коду ϕ(Α) = {0, 01} из
примера 8.1. Этот код не является префиксным, так как β1 = 0 – префикс для β2 = 01. Однако ϕ(Α) = {0, 10} обладает свойством префикса.
По утверждению 8.1 код ϕ(Α) допускает однозначное декодирование,
что подтверждает результат примера 8.1.
Пример 8.5. Равномерный двоично-десятичный код
ϕ(Α) = {0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001}
из примера 8.2 обладает свойством префикса, поэтому он является однозначно декодируемым.
Кома-код − это разновидность префиксного кода. При его исполь-
зовании каждая буква алфавита Α кодируется элементарным двоичным
кодом из единиц, в конце которого стоит нуль. Так, при |
| = 5 кома-код
Α
имеет вид ϕ(Α) = {0, 10, 110, 1110, 11110}. Кома-код легко строится, но
он обладает явным недостатком: его элементарные коды могут быть
очень длинными и занимать большой объем памяти. Поэтому на практике
используются более экономные префиксные коды.
Важно отметить, что свойство префикса является достаточным,
но не является необходимым условием однозначного декодирования
алфавитного кода. Это иллюстрирует следующий пример.
97

Пример 8.6. Пусть заданы Α = {a, b, c, d, e}, Β = {0, 1, 2, 3} и код
ϕ(Α) = {01, 32, 0, 12033, 20}.
Здесь коды ϕ(Α) и ϕ(Α) = {10, 23, 0, 33021, 02} не обладают свойством префикса. Однако в примере 8.11 показано, что код ϕ(Α) допус-
кает однозначное декодирование.
Из-за простоты декодирования префиксные коды иногда называют
мгновенными кодами. Рассмотрим процесс декодирования префиксного
кода. Пусть Α = {a1, … , an} – исходный алфавит, Β = {b1, … , bq} – кодирующий алфавит, при этом n > q > 1. Предположим, что кодирование
выполняется побуквенно на основе схемы
а
→ β1,
1
ϕ: ...
а
→ βn,
n
где ai ∈ Α, βi ∈ Β*, i = 1, …, n. Задан код β = ϕ(α) ≠ Λ некоторого сообщения α. Декодирование слова β ∈ B*, т. е. определение α = ϕ−1(β)
можно выполнить с помощью следующего алгоритма.
Алгоритм 8.1. Декодирование слова β = ϕ(α) по префиксно-
му коду ϕ(Α)
1. Просматривать слово β по одной букве, начиная с первой. Как
только прочитанный префикс (не обязательно собственный)
совпадает с некоторым элементарным кодом из
этот префикс заменить соответствующей буквой из
ϕ(Α), следует
Α, а затем
исключить из слова β.
2.
Пункт 1 повторять до тех пор, пока β ≠ Λ.
Очевидно, что время работы данного алгоритма составляет O (mn),
где m = | β |, n = |
Α
|.
Алгоритм 8.1 легко модифицировать на случай, когда
(Α) явля-
ϕ
ется префиксным кодом. Для этого необходимо просмотр слова β вести с последней буквы, т. е. справа налево, и выделять не префиксы,
98

а постфиксы. Ясно, что алгоритм декодирования однозначных, но не
обязательно префиксных кодов является гораздо более сложным, чем
алгоритм 8.1. По этой причине на практике используются в основном
префиксные коды.
Пример 8.7. Рассмотрим алфавит Α = {a, b, c}. Для кодирования
используем кома-код
ϕ(Α) = {0, 10, 110},
который является префиксным, а значит, однозначно декодируемым.
Слову α = abbc в этом коде соответствует слово β = ϕ(α) = 01010110.
Применим к слову β алгоритм 8.1.
Считываем первую букву 0 из β. Ей соответствует буква
a ∈ Α. Производим декодирование и исключаем 0 из дальнейшего
рассмотрения. В результате имеем: α = а, β = 1010110.
Считываем следующую букву 1. Такого элементарного кода
нет. После считывания следующей буквы 0 получаем префикс 10,
которому соответствует элементарный код буквы b ∈ Α. После декодирования и исключения префикса 10 из β имеем: α = ab, β = 10110.
Аналогично на третьей итерации алгоритма можно декодиро-
вать еще один префикс 10. В результате получим: α = abb, β = 110.
На четвертой итерации декодируется вся оставшаяся часть сло-
ва β, поскольку в ϕ(Α) нет элементарных кодов 1 и 11. В итоге имеем: α = abbc и β = Λ. Процесс декодирования завершается.
Для распознавания однозначного декодирования можно приме-
нять следующее необходимое условие [25].
Утверждение 8.2 (неравенство Макмиллана). Для всякого одно-
значно декодируемого кода в q-буквенном алфавите с набором длин элементарных кодов ℓ1, …, ℓn всегда выполняется неравенство
1
.
1
∑
≤
i
q
1
=ni
Для двоичного кодирования неравенство Макмиллана принима-
ет вид
n
1
.1
∑
i
≤
i
2
1
=
99

По утверждению 8.2, если для алфавитного кода
ϕ(А) = {β
, …, βn}
1
неравенство Макмиллана не выполняется, т. е.
1
,1
>
i
q
1
где ℓ
∑
=ni
= |
|, i = 1, …, n, то ϕ(Α) не допускает однозначного декодиро-
i
βi
вания. При выполнении неравенства Макмиллана об однозначности
кода ϕ(Α) ничего сказать нельзя.
Пример 8.8. Возьмем из примера 8.6 однозначно декодируемый
код
ϕ(А) = {01, 32, 0, 12033, 20}.
Для него q = 4, ℓ1 = ℓ2 = 2, ℓ3 = 1, ℓ4 = 5, ℓ5 = 2. Вычислим сумму
∑
5
i
q
1
=i
1
11
4
4
1
1
4
4
449
1
=++++=
25122
4
1024
.
Неравенство Макмиллана выполняется.
Пример 8.9. Пусть заданы алфавиты Α = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
Β = {0, 1} и код
ϕ(А) = {0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001}.
Заметим, что ϕ(Α) не обладает свойством префикса. Для ϕ(Α) имеем
q = 2, ℓ
= ℓ2 = 1, ℓ3 = ℓ4 = 2, ℓ5 = ℓ6 = ℓ7 = ℓ8 = 3, ℓ9 = ℓ10 = 4. Выпол-
1
ним вычисление левой части неравенства Макмиллана:
10
∑
1
i
2
1
=i
1
2
2
1
2
2
1
4
2
2
1
1
2
.
2
=⋅+⋅+⋅+⋅=
4321
8
Неравенство не выполняется, поэтому код
ϕ(Α) не является однозначно
декодируемым. Действительно, слово β = 111111 разделяется на элементарные коды двумя способами: β = (11) (11) (11), β = (111) (111).
Отсюда β =
ϕ(333) и β = ϕ(77) одновременно.
Следующий пример показывает, что неравенство Макмиллана
не может служить достаточным условием распознавания однозначного
декодирования кода.
100
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
