贪心算法和哈夫曼算法
来源:互联网 发布: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函数会产生一系列适用于构造字典的配对结构(字符,编码)。如果我们想用这种字典来压缩编码的话,就只需要对文本进行便利,并查出每个字符。而如果是解压缩文本的话,我们也可以用哈夫曼树来处理,按照其遍历方向(决定向左还是向右遍历)输入每一个比特位。
阅读全文
0 0
- 贪心算法和哈夫曼算法
- 贪心算法---哈夫曼编码
- 贪心算法-哈夫曼编码
- 哈夫曼编码--贪心算法
- 贪心算法和最大团
- 贪心算法和动态规划
- 动态规划和贪心算法
- 贪心算法和动态规划
- 贪心算法和动态规划
- 动态规划和贪心算法
- 算法-03 贪心和分治
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- C可变参数的应用和内存对齐
- 测试学习点
- 使用Python开发木马程序
- 新建有返回值的线程的窗口(修改的窗口有问题不懂解决)
- 改造ext form表单提交时遇到的问题
- 贪心算法和哈夫曼算法
- CentOS上升级Pyhton到2.7
- UVA
- IntelliJ idea 一些名字的理解和Web项目的运行
- Android edittext 属性inputtype详解
- 深入学习Java反射之道-field
- Spring和SpringMVC父子的容器之道
- XML——元素
- NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/Class;)Z