Алгоритм Ху-Таккера — различия между версиями
Kris (обсуждение | вклад) м (→Обоснование алгоритма Ху-Таккера) |
Kris (обсуждение | вклад) м (→Пример) |
||
Строка 43: | Строка 43: | ||
Для примера возьмем алфавит <tex>A= \{</tex> ''a,b,c,d,e,f,t,g,h,i,j'' <tex>\} </tex>, а набор весов <tex>W= \{</tex> ''8,6,2,3,4,7,11,9,8,1,3'' <tex>\} </tex>. | Для примера возьмем алфавит <tex>A= \{</tex> ''a,b,c,d,e,f,t,g,h,i,j'' <tex>\} </tex>, а набор весов <tex>W= \{</tex> ''8,6,2,3,4,7,11,9,8,1,3'' <tex>\} </tex>. | ||
− | Выполним | + | Выполним второй шаг алгоритма. |
Объединим сначала <tex>w(i)=1</tex> и <tex>w(j)=3</tex>, получим вершину с весом <tex>w(ij)=4</tex>, затем <tex>w(c)=2</tex> и <tex>w(d)=3</tex> на вершину веса <tex>w(cd)=5</tex>, и т.д. пока не останется одна вершина. | Объединим сначала <tex>w(i)=1</tex> и <tex>w(j)=3</tex>, получим вершину с весом <tex>w(ij)=4</tex>, затем <tex>w(c)=2</tex> и <tex>w(d)=3</tex> на вершину веса <tex>w(cd)=5</tex>, и т.д. пока не останется одна вершина. | ||
Строка 49: | Строка 49: | ||
[[Файл:Hu-Taker_eps1.gif|300px]] | [[Файл:Hu-Taker_eps1.gif|300px]] | ||
− | Выполним | + | Выполним третий шаг. |
Определим уровни для каждого листа <tex>L= \{</tex> ''3,3,5,5,4,3,3,3,3,4,4'' <tex>\} </tex>. | Определим уровни для каждого листа <tex>L= \{</tex> ''3,3,5,5,4,3,3,3,3,4,4'' <tex>\} </tex>. | ||
[[Файл:Hu-Taker Layer2.png|300px]] | [[Файл:Hu-Taker Layer2.png|300px]] | ||
− | Выполним | + | Выполним четвертый шаг, воспользовавшись стековым алгоритмом, и получим необходимое дерево. |
[[Файл:Hu-Taker_eps3.gif|300px]][[Файл:Hu Takker eps3.png |300px]] | [[Файл:Hu-Taker_eps3.gif|300px]][[Файл:Hu Takker eps3.png |300px]] |
Версия 02:29, 18 декабря 2012
Алгоритм Ху-Таккера - алгоритм построения оптимального алфавитного дерева.
Алфавитное дерево - дерево в котором при просмотре листьев слева направо символы идут в алфавитном порядке, и код последующего лексикографически больше предыдущего.
Содержание
Определение
Определение: |
Пусть 1. не является префиксом для , при2. для всех , выполнено3. при удовлетворенности условия 2, называется алгоритмом Ху-Таккера. минимальна ( — длина кода ) | — алфавит из n различных символов, — соответствующий ему набор весов. Тогда алгоритм выбора набора бинарных кодов , такой, что:
Алгоритм
Алгоритм Ху-Таккера
- Начало.
- Шаг 0. Введем следующие понятия.
- Две вершины называются совместимой парой, если они соседние или если между ними нет вершин алфавита.
- Две вершины называются минимальной парой, когда их суммарный вес наименьший из всех. При равенстве весов выбирается пара с самой левой вершиной, из всех таких та, у которой правый узел расположен левее.
- Минимальной совместимой парой называется наименьшая пара из всех совместимых.
- Шаг 1. Изначально мы имеем только алфавит (и соответствующие веса), отсортированный лексикографически.
- Шаг 2. Комбинирование. По данной последовательности из n вершин строим последовательность из вершины, комбинируя минимальную совместимую пару и заменяя ее левую вершину вершиной с весом и удаляя правую. Эта процедура повторяется до тех пор, пока не останется одна вершина.
- Шаг 3. Определение уровней. Находим номер уровня каждого листа относительно корня.
- Шаг 4. Перестройка. После того, как номера уровней всех листьев определены, просматриваем последовательность слева направо и находим самый левый номер максимального уровня, скажем, . Тогда и (в последовательности максимальные номера уровней всегда располагаются рядом). Создаем вершину уровня вместо вершин уровня . Другими словами, последовательность уровней заменяется на . Повторяем этот процесс до тех пор пока не останется одна вершина с уровнем 0.
- Конец.
Заметим, что перестройку легко можно организовать с помощью следующего стекового алгоритма.
Стековый алгоритм перестройки
- Начало.
- Шаг 0. Стек пуст.
- Шаг 1. Если значение двух верхних элементов различно или в стеке всего один элемент перейти к шагу 2, иначе к шагу 3.
- Шаг 2. Поместить следующий элемент на вершину стека. Перейти к шагу 1.
- Шаг 3. Удалить 2 верхних элемента стека, поместить в стек элемент со значением меньшим на единицу, чем удаленные. Если значение нового элемента равно нулю — остановиться, иначе перейти к шагу 1.
- Конец.
Пример
Для примера возьмем алфавит
a,b,c,d,e,f,t,g,h,i,j , а набор весов 8,6,2,3,4,7,11,9,8,1,3 .Выполним второй шаг алгоритма.
Объединим сначала
и , получим вершину с весом , затем и на вершину веса , и т.д. пока не останется одна вершина.Выполним третий шаг. Определим уровни для каждого листа
3,3,5,5,4,3,3,3,3,4,4 .Выполним четвертый шаг, воспользовавшись стековым алгоритмом, и получим необходимое дерево.
Осталось только назначить код для каждого символа. Это делается аналогично коду Хаффмана: левым ребрам назначается 0, а правым 1.
Обоснование алгоритма Ху-Таккера
Для обоснования воспользуемся несколькими леммами.
Лемма (1): |
Если последовательность весов монотонно не убывает или монотонно убывает, то стоимости деревьев Хаффмена и Ху-Таккера совпадают. Более того, существует дерево Хаффмена, удовлетворяющее требованию алфавитности (см. упражнения к разделу 2.3.4-5 вт.1 книги Д. Кнута Искусство программирования для ЭВМ). |
Лемма (2): |
Если последовательность весов является впадиной, то стоимости деревьев Хаффмена и Ху-Таккера равны. Более того, существует дерево Хаффмена, удовлетворяющее требованию алфавитности (см. книгу Т.Ч.Ху и М.Т.Шинг Комбинаторные алгоритмы — леммы 7 и 8 в разделе 5.8). |
Лемма (3): |
Если последовательность весов является впадиной, то новые вершины, создаваемые в фазе 1 алгоритма Ху-Таккера, образуют очередь с монотонно возрастающими весами. Потомки каждой из этих новых вершин могут быть соединены в алфавитное бинарное дерево, удовлетворяющее условию: если , то . |
Заметим, что в последовательности-впадине две наименьших вершины всегда совместимы. Поэтому в алгоритме Хаффмена будут комбинироваться те же пары, что и в фазе 1 алгоритма Ху-Таккера. Для удобства введем две вершины алфавита
и веса , расположенных соответственно в начале и в конце последовательности. Тогда последовательность весов можно рассматривать как последовательность состоящую из двух впадин: .Вершину
назовем горой между двумя впадинами.Из леммы 3 следует, что можно образовать две отдельных очереди — одну для каждой впадины. Из-за горы вершины из разных впадин не совместимы между собой. Когда наименьшие новые вершины(полученные в результате слияния) во впадинах станут достаточно большими, гора будет наконец скомбинирована. С этого момента все новые вершины станут совместимыми. Получается слияние двух очередей. По существу, фаза 1 в алгоритме Ху-Таккера подобна слиянию нескольких очередей, а произвольную последовательность весов можно рассматривать как соединение нескольких впадин.
Чтобы понять, почему последовательность уровней может быть соединена в алфавитное дерево, достаточно рассмотреть два случая:
- Комбинируются две вершины из одной впадины.
- Комбинируются две вершины и из разных впадин. Пусть при этом между и расположены новые вершины — каждая из них имеет двух сыновей, скажем, и , и , и — когда комбинируются и , мы в действительности создаем общего отца для и . После этого общего отца получают и , затем и . Наконец, общего отца получают и .
Заметим, что это лишь обоснование, а не строгое доказательство, его задача дать понимание правдивости алгоритма.
Корректность алгоритма Ху-Таккера
Как пишет Д. Кнут короткого доказательства алгоритма не известно, и вероятно оно никогда не будет найдено. Для доказательства своего алгоритма Ху и Таккеру потребовалось 3 теоремы и 2 леммы (См. книгу Т.Ч.Ху и М.Т.Шинг Комбинаторные алгоритмы — стр.172).
Сложность алгоритма
Для реализации данного алгоритма потребуется
памяти и времени на построение дерева.Разберем оценку. Для доказательства такой оценки времени введем понятие локально минимальной совместимой пары (л.м.с.п), пара
является л.м.с.п, когда выполнены следующие условия для всех вершин совместимых с и для всех вершин совместимых с . Также докажем следующую лемму:Лемма (1): |
Пусть — любая вершина в последовательности, состоящей из вершин алфавита и вершин, образованных в результате комбинации, — вес наименьшей вершины , совместимой с . Если в результате комбинирования некоторой л.м.с.п. какая-нибудь новая вершина становится совместимой c , то . В частности, в последовательности вершин будет оставаться л.м.с.п., пока комбинируются другие л.м.с.п.
|
Доказательство: |
Рассмотрим произвольную вершину и предположим, что вес наименьшей вершины, совместимой с , равен .Пусть комбинируется л.м.с.п. , причем ближе к . Тогда между и нет вершин алфавита и хотя бы одна из , должна быть вершиной алфавита, иначе при слиянии не появилось бы новых вершин (кроме ), совместимых с .Заметим, что может находиться в любой стороне от . Если вершина лежит справа от , то она не вершина алфавита. Пусть — вершина, которая становится совместимой с после слияния (она может быть как алфавитной так и слитой). Тогда должна быть совместима с в исходной последовательности и в силу локальной минимальности пары имеем .Но Мы доказали, что вес наименьшей вершины, совместимой с любой вершиной, не может уменьшиться. Отсюда следует, что любая л.м.с.п. , так как совместима с в исходной последовательности, а является наименьшим совместимым с весом. Поэтому . останется л.м.с.п. после слияния другой л.м.с.п., потому что останется наименьшей вершиной, совместимой с , и наоборот. |
Теперь согласно этой лемме нам не придется искать минимально совместимую пару, что весьма долго. Достаточно лишь находить л.м.с.п., при этом не важно, в каком порядке комбинировать л.м.с.п. По этому нам необходимо иметь массив размера , из которого мы будем удалять л.м.с.п и создавать новую вершину. На нем легко будет осуществлять поиск л.м.с.п. А так же необходим массив размера для реализации следующего шага, хранящий дерево. Второй шаг легко осуществить проходом по дереву, имея сохраненное дерево. Третий шаг, реализованный стековым алгоритмом, работает за времени и требует памяти на стек, на хранения уровней вершин и на хранение итогового дерева. Итак, общая оценка как раз получается памяти и времени.
Смотри также
Литература
- Т.Ч.Ху и М.Т.Шинг Комбинаторные алгоритмы — стр. 166 — ISBN 5-85746-761-6
- Дональд Кнут Искусство программирования, том 3. Сортировка и поиск = The Art of Computer Programming, vol.3. Sorting and Searching. — 2-е изд. — М.: «Вильямс», 2007. — 824 с. — ISBN 5-8459-0082-4