Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать

9.3. Свойства оптимальных кодов

Оптимальные (P, 2)-коды обладают определенными свойствами,
которые используются при их построении.
Утверждение 9.3. Если ϕ(Α) является оптимальным (Ρ, 2)-
кодом, то для любых его элементарных кодов β щих вероятностям p
и p
, при pi > pj всегда верно ℓi ℓj.
i
j
Другими словами, если буква аi Α встречается в сообщениях
более часто, чем буква аj Α, то она при оптимальном кодировании не может кодироваться более длинным словом, чем аi. Справедли­вость утверждения 9.3 непосредственно вытекает из утверждения 9.1.
Утверждение 9.4. Если ϕ(Α) – оптимальный (Р, 2)-код, то среди
его элементарных кодов, имеющих максимальную длину ℓ, найдутся два элементарных кода с одним и тем же префиксом длины ℓ – 1 и различающиеся только в последнем разряде.
Утверждение 9.5 (теорема редукции). Пусть задан двоичный ал-
фавитный код ϕ = {β1, ..., βn} с набором вероятностей
n
in
=
i
1
Положим δ = p
1
+ pn и рассмотрим упорядоченный набор
n 1
и β
, соответствую-
i
j
.0...,1),...,,(P
>==
pppppp
21
n
P = (p1, …, p
j − 1
, δ, p
j + 1
, …, p
n 2
),
который получен из Р исключением двух последних (наименьших) вероятностей p
, pn и вставкой их суммы δ в оставшийся набор
n 1
так, чтобы в получившемся наборе P′ вероятности не возрастали. Пусть β
= β 0, βn = β 1 – элементарные коды длины ℓ, принадле-
n 1
жащие ϕ и имеющие одинаковый префикс β, где | β | = ℓ – 1.
Тогда алфавитный код
ϕ′ = {β
, ..., β
1
j − 1
, β, β
j + 1
, ..., β
n 2
}
является (P, 2)-оптимальным, если и только если код ϕ = {β1, ..., βn} является (Р, 2)-оптимальным.
111
Доказательство утверждений 9.4, 9.5 можно найти в [19, 25].
Заметим, что в теореме редукции переход от набора вероятностей Р к набору P′ является, по сути, однократным сжатием алфавита А, т. е. заменой двух самых редких букв с вероятностями p вой буквой с вероятностью δ = p
+ pn. Таким образом, теорема ре-
n 1
, pn одной но-
n 1
дукции позволяет свести задачу построения оптимального кода раз­мерности n = | P | = | A | к аналогичной задаче размерности n – 1 = | P |. Данная теорема лежит в основе рекурсивного алгоритма Хаффмена построения оптимального (Р, 2)-кода.

9.4. Алгоритм Хаффмена

Данный алгоритм выполняется в два этапа. Этап 1 – процесс ре-
дукции (сжатия) алфавита А до двух букв – прямой ход алгоритма. Этап 2 – построение оптимального кода – обратный ход алгоритма.
Исходные данные алгоритма:
n ≥ 2, где nчисло букв алфавита А;
– – упорядоченный набор ненулевых вероятностей
n
1
in
=
i
1
21
.0...,1),...,,(P
>==
pppppp
n
В дальнейшем этот набор будем представлять одноименным одномер­ным массивом Р длины n, элементы которого вещественные числа из интервала (0, 1).
Выходные данные алгоритма:
– упорядоченная последовательность элементарных кодов оп-
тимального префиксного (Р, 2)-кода
– набор длин элементарных кодов L = (ℓ
ϕ(Α) = {β
, …, n), где i = | β
1
, ..., βn};
1
i
|,
i = 1, …, n.
Далее условимся набор L длин элементарных кодов представлять одноименным одномерным целочисленным массивом L длины n, а последовательность элементарных кодов ϕ(Α) – двумерным двоич­ным массивом С размерности n × n, каждая i-я строка которого со­держит элементарный код β
∈ ϕ(Α).
i
112
Этап 1. Процесс редукции алфавита сводится к выполнению
n − 2 преобразований массива Р, каждое из которых является одно-
кратной редукцией, уменьшающей длину обрабатываемой части мас­сива
Р на единицу. Однократная редукция массива Р – отбрасывание
двух наименьших вероятностей и вставка их суммы
Р оставался упорядоченным по убыванию в его обрабатываемой
сив части. Заметим, что для построения оптимального кода надо запоми­нать место вставки значения δ.
Пример 9.3. Для n = 8 и набора вероятностей
δ так, чтобы мас-
Ρ = (0,22; 0,20; 0,16; 0,16; 0,16; 0,10; 0,10; 0,04; 0,02)
результаты процесса редукции приведены в табл. 9.1.
Таблица 9.1
Исходный
массив
Р
0,22
0,20
0,16
0,16
0,10
0,10
0,04
0,02
Состояние массива
1 2 3 4 5 6
0,22
0,20
0,16
0,16
0,10
0,10
0,06
0,22
0,20
0,16
0,16
0,16
0,10
Р после однократных редукций
0,26
0,22
0,20
0,16
0,16
0,32
0,26
0,22
0,20
0,42
0,32
0,26
0,58
0,42
k 8 7 6 5 4 3 2
j – 7 5 1 1 1 1
В последних двух строках табл. 9.1 указаны значения длины k об-
рабатываемой части массива Р и индекса j, определяющего место встав­ки суммы вероятностей. Поскольку здесь n = 8, то для сжатия алфавита до двух букв потребовалось выполнить 6 преобразований массива Р.
Этап 2. Построение оптимального кода осуществляется с ис-
пользованием длины k обрабатываемой части массива Р и индекса j,
113
определяющего место вставки суммы вероятностей. Очевидно, что пара букв при любых значениях вероятностей их появления в сообще­ниях оптимальным образом кодируется так: первой букве ставится в соответствие 0, а второй – 1 (или наоборот).
Далее по теореме редукции оптимальный код для k букв созда-
ется на основе оптимального кода для k 1 букв. С этой целью эле­ментарный код β с индексом j исключается из массива С путем сдвига вверх элементарных кодов с индексами больше j. Затем в ко- нец обрабатываемой части массива С добавляется пара кодов β 0 и β 1, имеющих общий префикс β и различающихся только в послед­нем разряде. Другими словами, j-я строка массива С «расщепляется» на две строки, которые помещаются в его конец.
Пример 9.4. Для исходных данных из примера 9.3 результаты по-
этапного построения оптимального кода приведены в табл. 9.2. По по­строению полученный оптимальный код префиксный. Его средняя длина равна
ℓcp = 0,22 · 2 + 0,20 · 2 + 0,16 · 3 + 0,16 · 3 + 0,10 · 3 +
+ 0,10 · 4 + 0,04 · 5 + 0,02 · 5 = 2,8.
Таблица 9.2
Состояние массива
6 5 4 3 2 1
0
1
2 3 4 5 6 7 8 k
1 1 1 1 5 7 – j
1
00
01
С после «расщепления» j-й строки Опти-
маль-
ный код
00
01
10
11
01
10
11
000
001
114
10
11
000
001
010
011
10
11
000
001
011
0100
0101
10
11
000
001
011
0100
01010
01011
Сформулируем алгоритм Хаффмена более точно в виде двух
процедур и функции [25].
Алгоритм 9.1. Рекурсивная процедура HAFFMAN (P, k)
1. В качестве исходных данных рассматривать массив вероятно-
стей Р, упорядоченный по убыванию, и количество букв k ана­лизируемого алфавита. Если k = 2, то закодировать две буквы алфавита, полагая
C[1, 1]:= 0, L[1]:= 1,
C[2, 1]:= 1, L[2]:= 1.
2. Иначе найти сумму двух последних (наименьших) вероятностей
δ:= P[k – 1] + P[k]
и с помощью функции WST (k, δ) вставить δ в массив Р, не нарушая его упорядоченности.
3. Построить оптимальный код для k букв с помощью процедуры DOWN (k, j).
Алгоритм 9.2. Функция WST (k, δ)
1. Положить j:= k – 1, P[j]:= δ, т. е. число δ временно записать в предпоследний элемент массива Р.
2. Найти для δ требуемую позицию в Р: при i = k – 1, …, 2 вы­полнить действия:
если
иначе цикл не продолжать, а перейти на пункт 3.
3. Выполнение функции завершить и вернуть в качестве результа-
та значение j – место вставки числа δ.
Процедура DOWN (k, j) строит оптимальный код для k букв
на основе уже построенного оптимального кода для k – 1 букв. В опи­сании этой процедуры запись C[i, *] означает i-ю строку массива С.
P[i – 1] < P[i], то Q:= P[i – 1], P[i – 1]:= P[i], P[i]:= Q
(элементы помнить текущую позицию числа
P[i – 1], P[i] поменять местами) и j:= i – 1 (за-
δ);
115
Алгоритм 9.3. Процедура DOWN (k, j) «расщепления» j-й буквы
1. Запомнить для j-й буквы код β:= C[j, *] и его длину := L[j].
2. Сдвинуть вверх все строки массива С с номерами j + 1, …, k – 1: для каждого i = j, …, k – 2 положить
C[i, *]:= C[i + 1, *], L[i]:= L[i + 1].
3. Скопировать код j-й буквы в качестве префикса для пары эле­ментарных кодов, соответствующих частям «расщепляемой» буквы:
C[k – 1, *]:= β′, C[k, *]:= β′.
4. Нарастить вновь образованные элементарные коды:
C[k – 1, + 1]:= 0, C[k, ℓ + 1]:= 1.
Определить длину этих кодов:
L[k – 1]:= + 1, L[k]:= ℓ +1.
По теореме редукции код Хаффмена (код, построенный по ал-
горитму Хаффмена) является оптимальным и префиксным. Необходи­мо отметить, что при редукции массива Р возможно появление рав­ных вероятностей, а значит, нескольких возможностей вставки числа δ в массив Р. Это говорит о том, что может существовать несколько оптимальных (Р, 2)-кодов с одним и тем же значением ℓcp.
Из теоремы редукции вытекают следующие свойства двоичных
кодов Хаффмена:
– если
ϕ(Α) = {β
, ..., βn} – оптимальный код, то для него нера-
1
венство Макмиллана обращается в равенство;
для всякого оптимального кода
равенства: | β
| ≤ n – 1 (i = 1, …, n);
i
число оптимальных кодов для
n
превосходит 2
(n – 1)!;
ϕ(Α) = {β
n-буквенного алфавита Α не
, ..., βn} верны не-
1
в оптимальном коде число элементарных кодов максимальной
длины всегда четно.
Докажите эти свойства самостоятельно.
116

9.5. Сжатие текстов

Пусть имеется некоторый текст α, составленный из m букв ал-
фавита Α = {a1, ..., an} и подлежащий хранению в памяти компьютера. Значение m может быть достаточно большим. Общепринятым для хра­нения текстовых данных является равномерный 8-разрядный двоичный код ASCII. Очевидно, что код ASCII не оптимален, так как он никак не учитывает вероятности появления тех или иных букв. Кроме того, в тек­стах обычно встречается существенно меньше, чем 28 = 256 различных букв. Все это при больших значениях m ведет к неэкономному использо­ванию памяти компьютера (ведь для хранения m букв текста α необхо­димо 8m бит памяти). Потребности в памяти можно существенно снизить, если применять оптимальное кодирование текста.
Операция, в результате которой заданному сообщению ставится
в соответствие более короткое сообщение, принято называть сжатием (или упаковкой) данных. Существуют методы сжатия, предназначен­ные для различных типов данных и целей сжатия. Алгоритм Хаффме­на определяет один из методов сжатия текстовых данных.
Для каждого естественного языка определены вероятности по-
явления букв в текстах. С некоторой погрешностью вместо вероятно­стей можно брать частоты появления букв в тексте α, которые для ка­ждой буквы аi Α определяются формулой
m
i
,
=
p
i
m
где mi – число вхождений буквы ai в текст α и
m
+ … + m
1
= m.
n
Если для набора частот Ρ = (p1, …, pn) построить с помощью алгорит­ма Хаффмена оптимальный (Р, 2)-код и закодировать им текст α, то закодированный текст будет иметь длину примерно mℓcp бит. Таким образом, выигрыш по сравнению с кодом ASCII составит
(8mmℓcp) бит = m (8 – ℓcp) бит.
Качество сжатия принято оценивать с помощью коэффициента
сжатия, который измеряется в процентах и показывает, в какой сте-
117
Применительно к текстам, закодированным кодом Хаффмена
ϕ(Α), коэффициент сжатия вычисляется по формуле
K
= [m (8 ℓcp) / 8m] 100 % = [(8 ℓcp) / 8] 100 %,
сж
где ℓcp – средняя длина элементарных кодов для ϕ(Α).
Известно, что для большинства естественных языков ℓcp не-
сколько меньше 6, поэтому Kсж 25 % есть величина выигрыша в памяти, получаемого от применения оптимального алфавитного коди­рования текстов. В основе архивирующих программ с подобным зна­чением Kсж лежат, как правило, различные модификации и усовер­шенствования алгоритма Хаффмена.

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

9.6.1. Изучить свойства оптимальных кодов и алгоритм Хаф-
фмена. Реализовать алгоритм Хаффмена в виде программы, которая строит оптимальный (Р, 2)-код и вычисляет для него ℓcp. Для отладки программы использовать примеры 9.3, 9.4. Построить оптимальные коды для заданных в табл. 9.3 наборов вероятностей.
9.6.2. Разработать программу сжатия заданного текста α с по-
мощью алгоритма Хаффмена. Данная программа должна выполнять:
m = |
ввод текста α и вычисление его длиныформирование алфавита
Α = {a
которых составлен текст α, и набора
, ..., an} – множества букв, из
1
P = (p
|;
α
, …, pn) частот по-
1
явления букв в α. В алфавит А следует включить пробел и знаки препинания;
сортировку набора Р по убыванию частот; – построение оптимального (Р, 2)-кода с помощью алгоритма
Хаффмена;
кодировку текста α оптимальным (Р, 2)-кодом и вычисление
длины закодированного текста;
определение коэффициента сжатия.
Предусмотреть вывод на печать результатов выполнения всех
перечисленных действий. Применить программу к четверостишию стихотворения А. С. Пушкина, заданному в табл. 8.3 задания 8.
118

9.7. Варианты

Таблица 9.3
Номер
варианта
1 (0,4; 0,2; 0,1; 0,05; 0,05; 0,05; 0,05; 0,05; 0,05)
(0,3; 0,2; 0,2; 0,2; 0,1)
2 (0,3; 0,2; 0,1; 0,1; 0,06; 0,06; 0,06; 0,06; 0,06)
(0,4; 0,2; 0,1; 0,1; 0,1; 0,1)
3 (0,3; 0,3; 0,2; 0,04; 0,03; 0,03; 0,03; 0,03; 0,03; 0,01)
(0,3; 0,3; 0,1; 0,1; 0,1; 0,1)
4 (0,4; 0,3; 0,08; 0,06; 0,04; 0,04; 0,04; 0,04)
(0,4; 0,1; 0,1; 0,1; 0,1; 0,08; 0,06; 0,06)
5 (0,3; 0,2; 0,1; 0,1; 0,1; 0,1; 0,1)
(0,20; 0,15; 0,15; 0,13; 0,12; 0,11; 0,11; 0,03)
6 (0,21; 0,20; 0,17; 0,16; 0,12; 0,08; 0,04; 0,02)
(0,5; 0,2; 0,1; 0,09; 0,08; 0,03)
Наборы вероятностей
119

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Абрамов, С. А. Лекции о сложности алгоритмов / С. А. Абра-
мов. – М.: МЦНМО, 2009.
2. Андерсон, Д. Дискретная математика и комбинаторика / Д.
Андерсон. – М.: Вильямс, 2003.
3. Ахо, А. Построение и анализ вычислительных алгоритмов /
А. Ахо, Д. Хопкрофт, Д. Ульман. – М.: Мир, 1979.
4. Ахо, А. Структуры данных и алгоритмы / А. Ахо, Д. Хоп-
крофт, Д. Ульман. – СПб.: Вильямс, 2000.
5. Быкова, В. В. Практикум на ЭВМ по дискретной математике
(вводный курс): учеб. пособие / В. В. Быкова. – Красноярск, ИЦ Крас­ГУ, 2005.
6. Быкова, В. В. Дискретная математика с использованием ЭВМ:
учеб. пособие / В. В. БыковаКрасноярск: РИО КрасГУ, 2006.
7. Быкова, В. В. Теоретические основы анализа параметризиро-
ванных та, 2011.
тике: учеб. пособие / Г. П. Гаврилов, А. А. Сапоженко. – М.: ФИЗМАТЛИТ, 2004.
Д. Грин, Д. Кнут. – М.: Мир, 1987.
чи / М. Гэри, Д. Джонсон. – М.: Мир, 1982.
зуализация и применение / В. Н. Касьянов, В. А. Евстигнеев. – СПб.: БХВ-Петербург, 2003.
ные алгоритмы / Д. Кнут. – М.: Вильямс, 2012.
Ч. Лейзерсон, Р. Риверст. – М.: Вильямс, 2012.
Н. Кристофидес. – М.: Мир, 1978.
алгоритмов / В. В. Быкова. – Красноярск: БИК Сиб. федер. ун-
8. Гаврилов, Г. П. Задачи и упражнения по дискретной матема-
9. Грин, Д. Математические методы анализа алгоритмов /
10. Гэри, М. Вычислительные машины и труднорешаемые зада
11. Касьянов, В. Н. Графы в программировании: обработка, ви-
12. Кнут, Д. Искусство программирования.
13. Кормен, Т. Алгоритмы: построение и анализ / Т. Кормен,
14. Кристофидес, Н. Теория графов. Алгоритмический подход /
Т. 4. Комбинатор-
-
120
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]