Алгоритм Хаффмана — различия между версиями
Yulya3102 (обсуждение | вклад) (→Пример: Добавлена картинка) |
Yulya3102 (обсуждение | вклад) м |
||
Строка 5: | Строка 5: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | Пусть <tex>A=\{a_{1},a_{2},...,a_{n}\}</tex> | + | Пусть <tex>A=\{a_{1},a_{2},...,a_{n}\}</tex> — алфавит из n различных символов, <tex>W=\{w_{1},w_{2},...,w_{n}\}</tex> — соответствующий ему набор положительных целых весов. Тогда набор бинарных кодов <tex>C=\{c_{1},c_{2},...,c_{n}\}</tex>, такой, что: |
− | 1.<tex>c_{i}</tex> не является префиксом для <tex>c_{j}</tex>, при <tex>i | + | 1. <tex>c_{i}</tex> не является префиксом для <tex>c_{j}</tex>, при <tex>i \ne j</tex> |
− | 2.<tex>\sum\limits_{i \in [1, n]} w_{i}\cdot c_{i}</tex> минимальна. (<tex>|c_{i}|</tex> | + | 2. Сумма <tex>\sum\limits_{i \in [1, n]} w_{i}\cdot c_{i}</tex> минимальна. (<tex>|c_{i}|</tex> — длина кода <tex>c_{i}</tex>) |
называется '''кодом Хаффмана'''. | называется '''кодом Хаффмана'''. | ||
Строка 25: | Строка 25: | ||
4. Добавим к списку только что сформированный узел. | 4. Добавим к списку только что сформированный узел. | ||
− | 5. Если в списке больше одного узла, то повторить | + | 5. Если в списке больше одного узла, то повторить пункты со второго по пятый. |
== Пример == | == Пример == | ||
+ | |||
+ | [[Файл:Mississippi.png|400px|thumb|right|Дерево Хаффмана для слова ''"Миссисипи"'']] | ||
Для примера возьмём слово ''"Миссисипи"''. Тогда алфавит будет <tex>A= \{</tex> ''и, м, п, с'' <tex>\} </tex>, а набор весов <tex>W=\{4, 1, 1, 3\}</tex>: | Для примера возьмём слово ''"Миссисипи"''. Тогда алфавит будет <tex>A= \{</tex> ''и, м, п, с'' <tex>\} </tex>, а набор весов <tex>W=\{4, 1, 1, 3\}</tex>: | ||
Строка 54: | Строка 56: | ||
И, наконец, объединяем два узла ''и'' и ''мпс''. Итак, мы получили дерево Хаффмана и соответствующую ему таблицу кодов: | И, наконец, объединяем два узла ''и'' и ''мпс''. Итак, мы получили дерево Хаффмана и соответствующую ему таблицу кодов: | ||
− | |||
− | |||
{| class="wikitable" | {| class="wikitable" |
Версия 11:49, 31 декабря 2011
Алгоритм Хаффмана — алгоритм оптимального префиксного кодирования алфавита. Это один из классических алгоритмов, известных с 60-х годов. Использует только частоту появления одинаковых байт в изображении. Сопоставляет символам входного потока, которые встречаются большее число раз, цепочку бит меньшей длины. И, напротив, встречающимся редко — цепочку большей длины.
Определение
Определение: |
Пусть 1. не является префиксом для , при2. Сумма называется кодом Хаффмана. минимальна. ( — длина кода ) | — алфавит из n различных символов, — соответствующий ему набор положительных целых весов. Тогда набор бинарных кодов , такой, что:
Алгоритм
Построение кода Хаффмана сводится к построению соответствующего бинарного дерева по следующему алгоритму:
1. Составим список кодируемых символов, при этом будем рассматривать один символ как дерево, состоящее из одного элемента, весом, равным частоте появления символа в тексте.
2. Из списка выберем два узла с наименьшим весом.
3. Сформируем новый узел с весом, равным сумме весов выбранных узлов, и присоединим к нему два выбранных узла в качестве дочерних.
4. Добавим к списку только что сформированный узел.
5. Если в списке больше одного узла, то повторить пункты со второго по пятый.
Пример
Для примера возьмём слово "Миссисипи". Тогда алфавит будет
и, м, п, с , а набор весов :Узел | и | м | п | с |
---|---|---|---|---|
Вес | 4 | 1 | 1 | 3 |
По алгоритму возьмем два символа с наименьшей частотой - это м и п. Сформируем из них новый узел мп весом 2 и добавим его к списку узлов:
Узел | и | мп | с |
---|---|---|---|
Вес | 4 | 2 | 3 |
Затем объединим в один узел узлы мп и c:
Узел | и | мпс |
---|---|---|
Вес | 4 | 5 |
И, наконец, объединяем два узла и и мпс. Итак, мы получили дерево Хаффмана и соответствующую ему таблицу кодов:
Символ | и | м | п | с |
---|---|---|---|---|
Код | 0 | 100 | 101 | 11 |
Таким образом, закодированное слово "миссисипи" будет выглядеть как "1000111101101010". Длина закодированного слова - 16 бит. Стоит заметить, что если бы мы использовали для кодирования каждого символа из четырёх по 2 бита, длина закодированного слова составила бы 18 бит.
Корректность алгоритма Хаффмана
Чтобы доказать корректность алгоритма Хаффмана, покажем, что в задаче о построении оптимального префиксного кода проявляются свойства жадного выбора и оптимальной подструктуры. В сформулированной ниже лемме показано соблюдение свойства жадного выбора.
Лемма (1): |
Пусть — алфавит, каждый символ которого встречается с частотой . Пусть и — два символа алфавита с самыми низкими частотами.
Тогда для алфавита существует оптимальный префиксный код, кодовые слова символов и в котором имеют одинаковую максимальную длину и отличаются лишь последним битом. |
Доказательство: |
Возьмем дерево , представляющее произвольный оптимальный префиксный код, и преобразуем его в дерево, представляющее другой оптимальный префиксный код, в котором символы и являются листьями с общим родительским узлом, причем в новом дереве эти листья находятся на максимальной глубине.Пусть и — два символа, представленные листьями с общим родительским узлом, которые находятся на максимальной глубине дерева .Предположим без потери общности, что и .Поскольку и — две самые маленькие частоты (в указанном порядке), и — две произвольные частоты, то выполняются соотношения и . В результате перестановки в дереве листьев и получается дерево , а при последующей перестановке в дереве листьев и получается дерево . Разность стоимостей деревьев Т и Т" равна
поскольку величины Таким образом, выполняется неравенство и неотрицательны. Величина неотрицательна, потому что х — лист с минимальной частотой, величина неотрицательна, потому что — лист на максимальной глубине в дереве . Аналогично, перестановка листьев и не приведет к увеличению стоимости, поэтому величина неотрицательна. , и поскольку — оптимальное дерево, то должно также выполняться неравенство , откуда следует, что . Таким образом, — дерево, представляющее оптимальный префиксный код, в котором и — находящиеся на максимальной глубине дочерние листья одного и того же узла, что и доказывает лемму. |
Лемма (2): |
Пусть дан алфавит , в котором для каждого символа определены частоты . Пусть и — два символа из алфавита с минимальными частотами. Пусть — алфавит, полученный из алфавита путем удаления символов и и добавления нового символа , так что . По определению частоты в алфавите совпадают с частотами в алфавите , за исключением частоты . Пусть — произвольное дерево, представляющее оптимальный префиксный код для алфавита Тогда дерево , полученное из дерева путем замены листа внутренним узлом с дочерними элементами и , представляет оптимальный префиксный код для алфавита . |
Доказательство: |
Сначала покажем, что стоимость ИЛИ . Докажем лемму методом от противного. Предположим, дерево |
Теорема: |
Алгоритм Хаффмана дает оптимальный префиксный код. |
Доказательство: |
Справедливость теоремы непосредственно следует из лемм (1) и (2) |
Литература
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — С. 1296. — ISBN 5-8489-0857-4