Upload
devtype
View
459
Download
0
Embed Size (px)
Citation preview
Жадные алгоритмы:кодирование Хаффмана
Александр Куликов
Онлайн-курс «Алгоритмы: теория и практика. Методы»http://stepic.org/217
Сжатие данных
Вход: строка s.Выход: бинарный код символов строки s,
обеспечивающий кратчайшее представление s.
Примерs = abacabadкоды символов: a: 00, b: 01, c: 10, d: 11закодированная строка: 0001001000010011 (16 битов)
2 / 10
Коды переменной длины
Естественная идея: присвоить более короткие кодыболее частым символам.
s = abacabadкоды символов: a: 0, b: 10, c: 110, d: 111закодированная строка: 01001100100111 (14 битов)Код называется беспрефиксным, если никакой кодсимвола не является префиксом другого кодасимвола.
3 / 10
Коды переменной длины
Естественная идея: присвоить более короткие кодыболее частым символам.s = abacabadкоды символов: a: 0, b: 10, c: 110, d: 111закодированная строка: 01001100100111 (14 битов)
Код называется беспрефиксным, если никакой кодсимвола не является префиксом другого кодасимвола.
3 / 10
Коды переменной длины
Естественная идея: присвоить более короткие кодыболее частым символам.s = abacabadкоды символов: a: 0, b: 10, c: 110, d: 111закодированная строка: 01001100100111 (14 битов)Код называется беспрефиксным, если никакой кодсимвола не является префиксом другого кодасимвола.
3 / 10
Декодирование на примереПример
a
b
c d
0
0
0
1
1
1
01001100100111
s =
s =
a
b
c d
0
0
0
1
1
1
01001100100111
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примереПример
a
b
c d
0
0
0
1
1
1
01001100100111
s =
s =
a
b
c d
0
0
0
1
1
1
01001100100111
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примереПример
a
b
c d
0
0
0
1
1
1
01001100100111
s =s =
a
b
c d
0
0
0
1
1
1
01001100100111
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примереПример
a
b
c d
0
0
0
1
1
1
01001100100111
s =s =
a
b
c d
0
0
0
1
1
1
01001100100111
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примереПример
a
b
c d
0
0
0
1
1
1
01001100100111
s =s =
a
b
c d
0
0
0
1
1
1
01001100100111
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примереПример
a
b
c d
0
0
0
1
1
1
01001100100111
s =s =
a
b
c d
0
0
0
1
1
1
01001100100111
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примереПример
a
b
c d
0
0
0
1
1
1
01001100100111
s =s =
a
b
c d
0
0
0
1
1
1
01001100100111
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = a
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Код Хаффмана
Код Хаффмана
Вход: частоты символов f1, . . . , fn ∈ N.Выход: строго двоичное дерево (у каждой вершины
либо ноль, либо два сына), листья которогопомечены частотами f1, . . . , fn,минимизирующее
n∑︁i=1
fi · (глубина листа fi) .
5 / 10
Частоты для внутренних вершин
5+3+10=18
5+3=8
a21
b10
c5 d 3
Частотой (некорневой) вершины назовём количество раз,которое вершина будет посещена в процессекодировки/декодировки.
6 / 10
Частоты для внутренних вершин
5+3+10=18
5+3=8
a21
b10
c5 d 3
Частотой (некорневой) вершины назовём количество раз,которое вершина будет посещена в процессекодировки/декодировки.
6 / 10
Частоты для внутренних вершин
5+3+10=18
5+3=8
a21
b10
c5 d 3
Частотой (некорневой) вершины назовём количество раз,которое вершина будет посещена в процессекодировки/декодировки.
6 / 10
Частоты для внутренних вершин
5+3+10=18
5+3=8
a21
b10
c5 d 3
Частотой (некорневой) вершины назовём количество раз,которое вершина будет посещена в процессекодировки/декодировки.
6 / 10
Надёжный шаг
Таким образом, мы ищем строго двоичное дерево сминимальной суммой пометок в вершинах, в которомлистья помечены входными частотами, а внутренниевершины — суммами пометок их детей.
Двумя наименьшими частотами помечены листья нанижнем уровне.Надёжный жадный шаг: выбрать две минимальныечастоты fi и fj , сделать их детьми новой вершины спометкой fi + fj ; выкинуть частоты fi и fj , добавитьfi + fj .
7 / 10
Надёжный шаг
Таким образом, мы ищем строго двоичное дерево сминимальной суммой пометок в вершинах, в которомлистья помечены входными частотами, а внутренниевершины — суммами пометок их детей.Двумя наименьшими частотами помечены листья нанижнем уровне.
Надёжный жадный шаг: выбрать две минимальныечастоты fi и fj , сделать их детьми новой вершины спометкой fi + fj ; выкинуть частоты fi и fj , добавитьfi + fj .
7 / 10
Надёжный шаг
Таким образом, мы ищем строго двоичное дерево сминимальной суммой пометок в вершинах, в которомлистья помечены входными частотами, а внутренниевершины — суммами пометок их детей.Двумя наименьшими частотами помечены листья нанижнем уровне.Надёжный жадный шаг: выбрать две минимальныечастоты fi и fj , сделать их детьми новой вершины спометкой fi + fj ; выкинуть частоты fi и fj , добавитьfi + fj .
7 / 10
Пример
10 3 5 21
10 3 5 21
8
10 3 5 21
8
18
10 3 5 21
8
18
8 / 10
Пример
10 3 5 21
10 3 5 21
8
10 3 5 21
8
18
10 3 5 21
8
18
8 / 10
Пример
10 3 5 2110 3 5 21
8
10 3 5 21
8
18
10 3 5 21
8
18
8 / 10
Пример
10 3 5 2110 3 5 21
8
10 3 5 21
8
18
10 3 5 21
8
18
8 / 10
Очередь с приоритетами
Insert(p) добавляет новый элемент с приоритетом p
ExtractMin() извлекает из очереди элемент сминимальным приоритетом
9 / 10
Алгоритмпроцедура Huffman(F [1 . . . n])
H ← очередь с приоритетамидля i от 1 до n:
Insert(H , (i ,F [i ]))для k от n + 1 до 2n − 1:
(i ,F [i ])← ExtractMin(H)(j ,F [j ])← ExtractMin(H)создать вершину k с детьми i , jF [k] = F [i ] + F [j ]Insert(H , (k ,F [k]))
Время работы: O(n2), если очередь с приоритетамиреализована на базе массива, O(n log n) — если на базекучи (разберём в следующей лекции).
10 / 10
Алгоритмпроцедура Huffman(F [1 . . . n])
H ← очередь с приоритетамидля i от 1 до n:
Insert(H , (i ,F [i ]))для k от n + 1 до 2n − 1:
(i ,F [i ])← ExtractMin(H)(j ,F [j ])← ExtractMin(H)создать вершину k с детьми i , jF [k] = F [i ] + F [j ]Insert(H , (k ,F [k]))
Время работы: O(n2), если очередь с приоритетамиреализована на базе массива, O(n log n) — если на базекучи (разберём в следующей лекции).
10 / 10