Huffman算法基本步骤(离散数学p336):
        给定实数w1,w2,.....,wt.

1.作t片树叶,分别以w1,w2,...,wt为权。
        2.在所有入度为0的顶点(不一定是树叶)中选出两个权最小的顶点,添加一个新分支点,它以这2个顶点为儿子,其权等于这2个儿子的权之和.
        3.重复2,直到只有1个入度为0的顶点为止。
        W(T)等于所有分支点的权之和。

Huffman算法是求最优二叉树的一种算法,利用求得的最优二叉树可以获得2元前缀码。

算法原理不是很难,利用python中的networkx库可以轻松解决。

一·通过给定的权值生成最优二叉树

利用networkx中的各种函数翻译出来即可。就是要注意一下用合适的pos进行画图,不然画出来的根本看不懂。使用multipartite_layout参数可以将节点按subset属性自动对齐。

import networkx as nx
import matplotlib.pyplot as pltdef Huffman(w):     #w为权值列表g = nx.DiGraph()l = 0for i in w:g.add_node(l, weight=i,checker=0,parent=0)l = l + 1#生成所有树叶,权值为所给权值listw = wlistw.sort()while len(listw) >= 2:w0 = listw[0]w1 = listw[1]ww = w0 + w1g.add_node(l, weight=ww,checker=1,parent=0)#获取权值最小的两个节点,并添加新的节点,权值为二者之和for i in g.nodes():if g.nodes[i]["weight"] == w0 and g.nodes[i]['parent']==0:g.add_edge(l, i)g.nodes[i]['parent']=lbreakfor i in g.nodes():if g.nodes[i]["weight"] == w1 and g.nodes[i]['parent']==0:g.add_edge(l, i)g.nodes[i]['parent'] = lbreak#生成连接子节点和父节点的边listw = listw[2:]listw.append(ww)listw.sort()    #对权值列表进行更新和排序l = l + 1wsum=0for i in g:g.nodes[i]['subset'] = len(nx.shortest_path(g, l - 1, i))if g.nodes[i]['checker']==0:wsum += (g.nodes[i]["weight"] * (g.nodes[i]['subset']-1))#为求得的树设置subset参数以使用multipartite_layout参数进行绘图,并计算权值和label = nx.get_node_attributes(g, 'weight')pos = nx.multipartite_layout(g, align='horizontal')nx.draw_networkx_labels(g, pos, labels=label)nx.draw(g, pos)str1="sum of w is "+str(wsum)plt.text(0.667,-0.632,str1)    plt.show()      #导出生成的最优二叉树return g

二·运行测试

        利用的是离散数学书上p336给的数据:2,2,3,3,5进行测试。

w=[2,2,3,3,5]
g=Huffman(w)

代码运行结果如下:

生成的最优二叉树:

Python实现Huffman算法求最优二叉树相关推荐

  1. 【LKH算法体验】Python调用LKH算法求TSP问题

    [LKH算法体验]Python调用LKH算法求TSP问题 一.LKH算法简介 Keld Helsgaun 是丹麦 罗斯基勒大学计算机科学专业的名誉副教授. 他于 1973 年在 哥本哈根大学获得DIK ...

  2. 算法设计——最优二叉树搜索问题

    ​​​​​​1.问题描述 假定我们正在设计一个程序,实现英语文本到法语的翻译.对英语文本中出现的每个单词,我们需要查找对应的法语单词.为了实现这些查找操作,可以创建一棵二叉搜索树,将n个英语单词作为关 ...

  3. 哈夫曼算法(最优二叉树)

    算法思想 每次从集合中选取两个最小和次小权值的结点作为新构造二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和,直到只有一颗二叉树 构成初始集合 对给定的n个权值{W1,W2,W3 ...

  4. 【Python】蒙特卡罗算法求圆面积

    蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法.是 ...

  5. 最优二叉树算法java_最优二叉树II

    package main import "fmt" const MAX = int(^uint(0) >> 1) func main() { var t int fmt ...

  6. java 实现最优二叉树_哈夫曼树(最优二叉树) - Java实现

    简介 哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树.从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称 ...

  7. 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)

    目录 赫夫曼树概述 定义 构造赫夫曼树步骤 代码实现 赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树.霍夫曼树.哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二 ...

  8. 哈夫曼树【最优二叉树】【Huffman】

    [转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序 ...

  9. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

最新文章

  1. 如何判断软件功能特性的依赖?
  2. 《实例化需求》读书笔记
  3. 如何创建并发布Google Earth KML 地标文件?
  4. 中文任务型对话系统中的领域分类
  5. UNP Chapter 25 - 原始套接口
  6. hibernate(五)之继承关系
  7. 企业启动计划预算管理的原因解析
  8. 直面不确定性 看致远互联如何帮助组织自生长
  9. Android下图片清晰度识别
  10. 【letex编辑输出】pdf文件嵌入字体embedded fonts的问题
  11. windows图片和传真查看器
  12. [不变初心数(15分] 用数组存储不变的数最后对照即可
  13. strchr()函数与strrchr()函数的实现
  14. 数据库的原理,一篇文章搞定(三)
  15. java参考中文站(在原有1094个中文示例)下的近期更新!
  16. 关于Android中TextView的setText方法报错
  17. 卿斯汉:重视云安全 发展云计算
  18. 安装oracle-- redhat-- ins_ctx.mk问题
  19. 不服丨月薪10k程序员vs月薪40K的程序员
  20. 解决win7“点击图片出现预览窗格”的问题

热门文章

  1. 基于eCognition的面向对象地貌类型分类教程
  2. USACO 2009 FEB Fair Shuttle 庙会班车 贪心
  3. [VB.NET源码]图书管理系统
  4. 爬取12306余票信息返回“网络可能存在问题,请您重试一下!”
  5. 外贸英文SEO推广tips 7:外贸电子商务常见的五种邮件
  6. 爱,为何只在一瞬间破灭
  7. golong实现邮件发送
  8. PowerPoint 2007基础入门视频教程(笔记)
  9. 美国银行、摩根大通禁止使用信用卡购买加密货币
  10. SQL查询语句——访问不同电脑上的数据库(远程只要联好网就一样)