贪心算法和哈夫曼算法

来源:互联网 发布:js获取div class 编辑:程序博客网 时间:2024/04/25 09:53
贪心算法的特征:
将每一个配对集看成一个局部解决方案
1.先列出可能的配对方案,并将其合拍度按降序排列。
2.从该列表中,选出第一个没有被使用过的配对方案
3.检查该配对方案中的人是否已经被占用了,是的话放弃,否则就予以采纳
4.检查列表中是否还有更多的配对方案,如果是,返回2
哈夫曼算法
哈弗曼算法属于贪心法的一种,其基本思路是:编码以字符出现的频率作为权重,每次选权重最小的两个节点作为生成最优二叉树的左右孩子,并将权重之和作为根节点的权重(概率),自底向上生成一颗带权路径长度最短的最优二叉树。
所以哈夫曼算法三重制度——概率,编号,树
In [1]: from heapq import heapify,heappush,heappop

In [2]: from itertools import count

In [3]: def huffman(seq,frq):
...: num = count()
...: trees=list(zip(frq,num,seq))
...: heapify(trees)
...: while len(trees)>1:
...: fa,_,a = heappop(trees)
...: fb,_,b = heappop(trees)
...: n = next(num)
...: heappush(trees,(fa+fb,n,[a,b]))
...: return trees[0][1]
...:

In [4]: seq = "abcdefghi"

In [5]: frq=[4,5,6,9,11,12,15,16,20]

In [6]: huffman(seq,frq)
Out[6]: 16
从哈夫曼树中提取出哈夫曼编码
In [9]: def codes(tree,prefix=''):
...: if len(tree) ==1:
...: yield (tree,prefix)
...: return
...: for bit,child in zip('01',tree):
...: for pair in codes(child,prefix+bit):
...: yield pair
...:

In [10]: treess=huffman(seq,frq)

In [11]: codes(treess)
Out[11]: <generator object codes at 0x1b1b5f0>

在该案例中,codes函数会产生一系列适用于构造字典的配对结构(字符,编码)。如果我们想用这种字典来压缩编码的话,就只需要对文本进行便利,并查出每个字符。而如果是解压缩文本的话,我们也可以用哈夫曼树来处理,按照其遍历方向(决定向左还是向右遍历)输入每一个比特位。