Изменения

Перейти к: навигация, поиск

Алгоритм Хаффмана для n ичной системы счисления

1658 байт убрано, 19:27, 4 сентября 2022
м
rollbackEdits.php mass rollback
==Построение кода Хаффмана==
€В приведенном ниже псевдокоде предполагается,что <tex>C</tex> - множество,состоящее из <tex>n</tex> символов,и что каждый из символов <tex>c \in C</tex> - объект с определенной частотой <tex>f(c)</tex>.В алгоритме строится оптимальное дерево <tex>T</tex>,соответствующее оптимальному коду,причем построение идет в восходящем направлении.Процесс построения начинается с множества,состоящего из <tex>|C|</tex> листьев,после чего последовательно выполняется <tex>|C|-1</tex> операций "слияния",в результате,которых образуется конечное дерево.Для идентификации двух наименее часто встречающихся объектов,подлежащих слиянию,используется очередь с приоритетами HUFFMAN(<tex>QC</tex>,ключами в которой являются частоты <tex>f<) struct Node //tex>.В результате слияния двух объектов образуется новый объект,частота появления которого является суммой частот объединенных объектов:Звено дерева int HUFFMAN(<texmath>C\mathrm{key}</texmath>) 1 queue <, char> <math>\mathrm{Qvalue}</math> //пара ключ и значение Node *left,*right 2 <math>\mathrm{n}</math> = <math>\mathrm{|C|}</math> 3 queue <char> <math>\mathrm{Q}</math> =( char <math>\mathrm{fc}</math>[<math>\mathrm{Cn}</math>],int <math>\mathrm{Cf}</math>[<math>\mathrm{n}</math>) ] //пары в очередимассив c содержит алфавит из n различных символов,где массив f-частота соответствующего символа(ключ),C-множество символов(то есть значение)соответствующий ему набор положительных целых весов. 4 '''for''' <math>\mathrm{i}</math> = 1 '''to''' <math>\mathrm{n}</math> - 1 0 выделить память для узла Z <math>\mathrm{Q}</math>.insert(<math>\mathrm{f}</чтобы не было претензий по его определению 5 math>[<math>\mathrm{i}</math>],<math>\mathrm{xc}</math> = [<math>\mathrm{Qi}</math>.extract_min(]) 6 '''for''' <math>\mathrm{zi}</math>.left = 1 '''to''' <math>\mathrm{xn}</math> //z.left-ребенок дерева же1 7 (<math>\mathrm{ymin1}</math> = ,<math>\mathrm{Qx}</math>.extract_min() 8 = <math>\mathrm{zQ}</math>.right = extract_min() <math>\mathrm{yz}</math> 9 (.left = <math>\mathrm{fx}</math>[ (<math>\mathrm{zmin2}</math>],<math>\mathrm{zy}</math>) = (<math>\mathrm{fQ}</math>[.extract_min() <math>\mathrm{xz}</math>] + .right = <math>\mathrm{fy}</math>[ <math>\mathrm{ysum}</math>],= <math>\mathrm{xmin1}</math> + <math>\mathrm{ymin2}</math>) 10 <math>\mathrm{Q}</math>.insert(<math>\mathrm{fsum}</math>,<math>\mathrm{z}</math>) 11 '''return''' <math>\mathrm{z}</math> //теперь переменная определена
Цикл '''for''' в строках '''4 - 10''' поочередно извлекает по два узла,<tex>x</tex> и <tex>y</tex>,которые характеризуются в очереди с наименьшими частотами,и заменяет их в очереди с новым узлом <tex>z</tex>,представляющим объединение упомянутых выше элементов.Частота появления <tex>z</tex> вычисляется в строке '''9''' как сумма частот <tex>x</tex> и <tex>y</tex>.Узел <tex>x</tex> является левым дочерним узлом <tex>z</tex>, а <tex>y</tex> - его правым дочерним узлом.(Этот порядок является произвольным;перестановка левого и правого дочерних узлов приводит к созданию другого кода с той же стоимостью.) После <tex>n-1</tex> объединений в очереди остается один узел - корень дерева кодов,который возвращается в строке '''11'''.
Алгоритм работает за <tex> {O(n\log{n}}) </tex> для алфавита из <math>\mathrm{n}</math> символов.
1632
правки

Навигация