Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

576 Глава 12. Последовательности и динамическое программирование

(a)

(b)

Иллюстрация 1 2.8: пример кодекс Хафмана для строки ввода

X = «быстрый бегун никогда не должен бояться темноты»: (a) fre-

quency каждого характера X; (b) дерево Хафмана T для последовательности X. Кодекс для характера c получен, проследив путь от корня T к внешнему узлу, где c сохранен, и соединение покинутого ребенка с 0 и правильного ребенка с 1. Например, кодекс для «a» равняется 010, и кодекс для «f» - 1100.

12.4.1 Hufman-кодирующий алгоритм

Huffman-кодирующий алгоритм начинается с каждого из d отличных знаков последовательности X, чтобы закодировать быть узлом корня двоичного дерева единственного узла. Алгоритм продолжается в серии раундов. В каждом раунде алгоритм берет эти два двоичных дерева с наименьшими частотами и сливает их в единственное двоичное дерево. Это повторяет этот процесс, пока только одно дерево не оставляют. (См. Кодовый Фрагмент 12.9.)

Каждое повторение, в то время как петля в алгоритме Хафмана может быть осуществлена в O (регистрируют d), время, используя приоритетную очередь, представленную с кучей. Кроме того, каждый

повторение вынимает два узла из Q и включает один, процесс, который повторен d- 1

времена прежде точно один узел оставляют в Q. Таким образом этот алгоритм бежит в O (n +

d регистрируют d) время. Хотя полное оправдание правильности этого алгоритма вне нашего объема, мы отмечаем, что его интуиция прибывает из простой идеи - любой оптимальный кодекс может быть преобразован в оптимальный кодекс, в котором кодовые слова для самых низких двух - знаки частоты, a и b, отличаются только по их последнему биту. Повторяя аргумент в пользу последовательности с a и b, замененным характером c, дает следующий.

Суждение 12.7: алгоритм Хафмана строит оптимальный кодекс префикса для последовательности длины n с d отличными знаками в O (n + d, регистрируют d), время.

12.4. Текстовое сжатие и жадный метод

Алгоритм Хуфмен (X):

Вход: Натяните X из длины n с d отличной Продукцией знаков: Кодирование дерева для X Вычисляет частоту f (c) каждого характера c X. Инициализируйте приоритетную очередь, которую делают Q. для каждого характера c в X

Создайте двоичное дерево единственного узла T хранящий c. Вставьте T в Q с ключом f (c).

в то время как Q.size ()> 1 делают

f1 ¬ Q.min () T1 ¬ Q.removeMin () f2 ¬ Q.min () T2 ¬ Q.removeMin ()

Создайте новое двоичное дерево T с левым поддеревом T1 и правильное поддерево T2.

Вставьте T в Q с ключом f1 + f2.

возвратите дерево Q.removeMin ()

Кодовый Фрагмент 12.9: Huffman-кодирование алгоритма.

12.4.2 Жадный метод

577

Алгоритм Хафмана для строительства оптимального кодирования является примером заявления алгоритмического шаблона, названного жадным методом. Этот шаблон применен к проблемам оптимизации, где мы пытаемся построить некоторую структуру, минимизируя или максимизируя некоторую собственность той структуры.

Общая формула для жадного образца метода почти так проста

для метода «в лоб». Чтобы решить данную проблему оптимизации, используя жадный метод, мы продолжаем двигаться последовательностью выбора. Последовательность начинается с некоторого хорошо понятого стартового условия и вычисляет стоимость для этого ini-tial условие. Образец тогда просит, чтобы мы многократно сделали дополнительный выбор, определив решение, которое достигает лучшего улучшения стоимости от всего выбора, который в настоящее время возможен. Этот подход не всегда приводит к оптимальному решению.

Но есть несколько проблем, что это действительно работает на, и такие проблемы сказаны

обладать собственностью жадного выбора. Это - собственность, что глобальное оптимальное условие может быть достигнуто рядом в местном масштабе оптимального выбора (то есть, выбор, который является каждым ток лучше всего из среди возможностей, доступных в это время), начинающийся с четко определенного стартового условия. Проблемой вычисления opti-mal кодекс префикса переменной длины является всего один пример проблемы, которая обладает собственностью жадного выбора.