Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
кой системе дорог соответствует орграф 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
Под ϕ(Α) будем понимать алфавитный код
(Α) = {
ϕ
β , …, }.
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]