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总是选择一个代价最小的合并,此即为贪心。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值