27
Жадные алгоритмы: кодирование Хаффмана Александр Куликов Онлайн-курс Алгоритмы: теория и практика. Методы http://stepic.org/217

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

  • Upload
    devtype

  • View
    459

  • Download
    0

Embed Size (px)

Citation preview

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

Жадные алгоритмы:кодирование Хаффмана

Александр Куликов

Онлайн-курс «Алгоритмы: теория и практика. Методы»http://stepic.org/217

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

Сжатие данных

Вход: строка s.Выход: бинарный код символов строки s,

обеспечивающий кратчайшее представление s.

Примерs = abacabadкоды символов: a: 00, b: 01, c: 10, d: 11закодированная строка: 0001001000010011 (16 битов)

2 / 10

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

Коды переменной длины

Естественная идея: присвоить более короткие кодыболее частым символам.

s = abacabadкоды символов: a: 0, b: 10, c: 110, d: 111закодированная строка: 01001100100111 (14 битов)Код называется беспрефиксным, если никакой кодсимвола не является префиксом другого кодасимвола.

3 / 10

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

Коды переменной длины

Естественная идея: присвоить более короткие кодыболее частым символам.s = abacabadкоды символов: a: 0, b: 10, c: 110, d: 111закодированная строка: 01001100100111 (14 битов)

Код называется беспрефиксным, если никакой кодсимвола не является префиксом другого кодасимвола.

3 / 10

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

Коды переменной длины

Естественная идея: присвоить более короткие кодыболее частым символам.s = abacabadкоды символов: a: 0, b: 10, c: 110, d: 111закодированная строка: 01001100100111 (14 битов)Код называется беспрефиксным, если никакой кодсимвола не является префиксом другого кодасимвола.

3 / 10

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

Декодирование на примереПример

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

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

Декодирование на примереПример

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

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

Декодирование на примереПример

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

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

Декодирование на примереПример

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

Page 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

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

Декодирование на примереПример

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

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

Декодирование на примереПример

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

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

Код Хаффмана

Код Хаффмана

Вход: частоты символов f1, . . . , fn ∈ N.Выход: строго двоичное дерево (у каждой вершины

либо ноль, либо два сына), листья которогопомечены частотами f1, . . . , fn,минимизирующее

n∑︁i=1

fi · (глубина листа fi) .

5 / 10

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

Частоты для внутренних вершин

5+3+10=18

5+3=8

a21

b10

c5 d 3

Частотой (некорневой) вершины назовём количество раз,которое вершина будет посещена в процессекодировки/декодировки.

6 / 10

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

Частоты для внутренних вершин

5+3+10=18

5+3=8

a21

b10

c5 d 3

Частотой (некорневой) вершины назовём количество раз,которое вершина будет посещена в процессекодировки/декодировки.

6 / 10

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

Частоты для внутренних вершин

5+3+10=18

5+3=8

a21

b10

c5 d 3

Частотой (некорневой) вершины назовём количество раз,которое вершина будет посещена в процессекодировки/декодировки.

6 / 10

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

Частоты для внутренних вершин

5+3+10=18

5+3=8

a21

b10

c5 d 3

Частотой (некорневой) вершины назовём количество раз,которое вершина будет посещена в процессекодировки/декодировки.

6 / 10

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

Надёжный шаг

Таким образом, мы ищем строго двоичное дерево сминимальной суммой пометок в вершинах, в которомлистья помечены входными частотами, а внутренниевершины — суммами пометок их детей.

Двумя наименьшими частотами помечены листья нанижнем уровне.Надёжный жадный шаг: выбрать две минимальныечастоты fi и fj , сделать их детьми новой вершины спометкой fi + fj ; выкинуть частоты fi и fj , добавитьfi + fj .

7 / 10

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

Надёжный шаг

Таким образом, мы ищем строго двоичное дерево сминимальной суммой пометок в вершинах, в которомлистья помечены входными частотами, а внутренниевершины — суммами пометок их детей.Двумя наименьшими частотами помечены листья нанижнем уровне.

Надёжный жадный шаг: выбрать две минимальныечастоты fi и fj , сделать их детьми новой вершины спометкой fi + fj ; выкинуть частоты fi и fj , добавитьfi + fj .

7 / 10

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

Надёжный шаг

Таким образом, мы ищем строго двоичное дерево сминимальной суммой пометок в вершинах, в которомлистья помечены входными частотами, а внутренниевершины — суммами пометок их детей.Двумя наименьшими частотами помечены листья нанижнем уровне.Надёжный жадный шаг: выбрать две минимальныечастоты fi и fj , сделать их детьми новой вершины спометкой fi + fj ; выкинуть частоты fi и fj , добавитьfi + fj .

7 / 10

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

Пример

10 3 5 21

10 3 5 21

8

10 3 5 21

8

18

10 3 5 21

8

18

8 / 10

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

Пример

10 3 5 21

10 3 5 21

8

10 3 5 21

8

18

10 3 5 21

8

18

8 / 10

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

Пример

10 3 5 2110 3 5 21

8

10 3 5 21

8

18

10 3 5 21

8

18

8 / 10

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

Пример

10 3 5 2110 3 5 21

8

10 3 5 21

8

18

10 3 5 21

8

18

8 / 10

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

Очередь с приоритетами

Insert(p) добавляет новый элемент с приоритетом p

ExtractMin() извлекает из очереди элемент сминимальным приоритетом

9 / 10

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

Алгоритмпроцедура 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

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

Алгоритмпроцедура 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