Huffman算法

Huffman算法是一种用来构造最优前缀码(Huffman编码)的贪心算法。Huffman编码是一种被广泛应用而且有效的数据压缩技术,它主要针对字符文件的压缩。

Huffman算法可能产生具有不同编码的最优前缀码,这句话需要这么理解:最优前缀码之所以称为最优是因为它的代价是最小的,但是具有最小代价的编码可能不止一种,而Huffman算法恰恰可以产生多种形式的最优前缀码(代价是相同的)。

Huffman(C)
/* C是待编码的字符集合,|C|=n,对于任意c∈C,c在文件中的出现频度为f(c)。Q是一个最小优先级队列。Q在具体实现时可以考虑采用最小二叉堆。
该算法自底向上地构造一棵最优前缀码所对应的树T*/

n ← |C|
Q ← C
for i ← 1 to n-1
     do 
            allocate a new node z
            left[z] ← x ← Extract-Min(Q)
            right[z] ← y ← Extract-Min(Q)
            f[z] ← f[x] + f[y]
            Insert(Q, z)
return Extract-Min(Q)  // return the root of the tree
            

上面过程所产生的树称为Huffman树,它是一棵满树(树中的每个非叶结点都有两个子结点),满树也是最优编码的充分条件。非叶结点的左枝上编码0,右枝编码1,每个叶子结点的编码是从根结点到该叶子结点的枝上的0、1串构成。

新节点z以x和y分别作为其左右子结点,由于左右的次序是任意的,因而Huffman算法得到的最优前缀码不唯一。Huffman算法的时间复杂度为O(n)。


Huffman算法为什么属于贪心算法?

Huffman树的构建过程实际上是对最小频度的字符的贪心选择上进行的,具有|C|个字符的字符集需要执行|C-1|次合并得到Huffman树,每次合并的时候选择最小频度的两个叶结点(包括合并后新产生的结点),而若用频度表示代价,则在每一步所有可能的合并中,Huffman总是选择一个代价最小的合并,此即为贪心。




你可能感兴趣的:(c,算法,tree,insert)