SlideShare a Scribd company logo
Жадные алгоритмы:
кодирование Хаффмана
Александр Куликов
Онлайн-курс «Алгоритмы: теория и практика. Методы»
http://stepic.org/217
Сжатие данных
Вход: строка s.
Выход: бинарный код символов строки s,
обеспечивающий кратчайшее представление s.
Пример
s = abacabad
коды символов: a: 00, b: 01, c: 10, d: 11
закодированная строка: 0001001000010011 (16 битов)
2 / 10
Коды переменной длины
Естественная идея: присвоить более короткие коды
более частым символам.
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 =
4 / 10
Декодирование на примере
Пример
s =
a
b
c d
0
0
0
1
1
1
01001100100111
4 / 10
Декодирование на примере
Пример
s = a
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примере
Пример
s = a
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примере
Пример
s = a
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примере
Пример
s = ab
01001100100111a
b
c d
0
0
0
1
1
1
4 / 10
Декодирование на примере
Пример
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
Частоты для внутренних вершин
a21
b10
c5 d 3
6 / 10
Частоты для внутренних вершин
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
Надёжный шаг
Таким образом, мы ищем строго двоичное дерево с
минимальной суммой пометок в вершинах, в котором
листья помечены входными частотами, а внутренние
вершины — суммами пометок их детей.
7 / 10
Надёжный шаг
Таким образом, мы ищем строго двоичное дерево с
минимальной суммой пометок в вершинах, в котором
листья помечены входными частотами, а внутренние
вершины — суммами пометок их детей.
Двумя наименьшими частотами помечены листья на
нижнем уровне.
7 / 10
Надёжный шаг
Таким образом, мы ищем строго двоичное дерево с
минимальной суммой пометок в вершинах, в котором
листья помечены входными частотами, а внутренние
вершины — суммами пометок их детей.
Двумя наименьшими частотами помечены листья на
нижнем уровне.
Надёжный жадный шаг: выбрать две минимальные
частоты fi и fj , сделать их детьми новой вершины с
пометкой fi + fj ; выкинуть частоты fi и fj , добавить
fi + fj .
7 / 10
Пример
10 3 5 21
8 / 10
Пример
10 3 5 21
8
8 / 10
Пример
10 3 5 21
8
18
8 / 10
Пример
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, j
F[k] = F[i] + F[j]
Insert(H, (k, F[k]))
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, j
F[k] = F[i] + F[j]
Insert(H, (k, F[k]))
Время работы: O(n2
), если очередь с приоритетами
реализована на базе массива, O(n log n) — если на базе
кучи (разберём в следующей лекции).
10 / 10

More Related Content

More from DEVTYPE

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
DEVTYPE
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
DEVTYPE
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
DEVTYPE
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
DEVTYPE
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
DEVTYPE
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
DEVTYPE
 
Recurrences
RecurrencesRecurrences
Recurrences
DEVTYPE
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
DEVTYPE
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
DEVTYPE
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
DEVTYPE
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
DEVTYPE
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
DEVTYPE
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
DEVTYPE
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
DEVTYPE
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
DEVTYPE
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
DEVTYPE
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
DEVTYPE
 
О-символика
О-символикаО-символика
О-символика
DEVTYPE
 
Зачем изучать алгоритмы?
Зачем изучать алгоритмы?Зачем изучать алгоритмы?
Зачем изучать алгоритмы?
DEVTYPE
 
Разбор задач пятого модуля
Разбор задач пятого модуляРазбор задач пятого модуля
Разбор задач пятого модуля
DEVTYPE
 

More from DEVTYPE (20)

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
 
Recurrences
RecurrencesRecurrences
Recurrences
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
 
О-символика
О-символикаО-символика
О-символика
 
Зачем изучать алгоритмы?
Зачем изучать алгоритмы?Зачем изучать алгоритмы?
Зачем изучать алгоритмы?
 
Разбор задач пятого модуля
Разбор задач пятого модуляРазбор задач пятого модуля
Разбор задач пятого модуля
 

Кодирование Хаффмана