Python数据结构之哈夫曼树定义与使用方法示例


Posted in Python onApril 22, 2018

本文实例讲述了Python数据结构之哈夫曼树定义与使用方法。分享给大家供大家参考,具体如下:

HaffMan.py

#coding=utf-8
#考虑权值的haff曼树查找效率并非最高,但可以用于编码等使用场景下
class TreeNode:
  def __init__(self,data):
    self.data=data
    self.left=None
    self.right=None
    self.parent=None
class HaffTree:
  def __init__(self):
    self.root=None
  def set_root(self,rootNode):
    self.root=rootNode
  def run(self,lis):
    i=0
    lis=[[lis[j][0],lis[j][1],TreeNode(lis[j][1])]for j in range(len(lis))]
    while len(lis)>1:
      i+=1
      lis=sorted(lis)
      name='N'+str(i)
      temp=TreeNode(name)
      #结果与大话数据结构书上略有不同 因为lis[0][2]=lis[1][2] 无影响
      #这里使用parent 替代深度优先/广度优先 算法
      temp.left=lis[0][2]
      temp.right=lis[1][2]
      lis[0][2].parent=temp
      lis[1][2].parent=temp
      #print lis[0][0],lis[1][0],len(lis)
      value=lis[0][0]+lis[1][0]
      lis=lis[1:]
      lis[0]=[value,name,temp]
    #print temp.data,temp.left.data,temp.right.data
    self.set_root(temp)
  def code(self,lis):
    self.codeList=[]
    stack=[]
    Node=self.root
    stack.append(Node)
    res=[]
    while(stack):
      node=stack.pop()
      res.append(node)
      if node.right:
        stack.append(node.right)
      if node.left:
        stack.append(node.left)
    for li in lis:
      codeL=[]
      for re in res:
        if re.data==li[1]:
          parent=re
          print '\n',parent.data,
          codeL.append(parent)
          while parent.parent:
            parent=parent.parent
            print parent.data,
            codeL.append(parent)
          codeLL=[int(codeL[len(codeL)-2-i]==codeL[len(codeL)-1-i].right) for i in range(len(codeL)-1)]
          self.codeList.append([li[1],codeLL])
    return self.codeList
  def list_all(self,method):
    lis=[]
    res=[]
    if method=='before':
      Node=self.root
      lis.append(Node)
      while(lis):
        node=lis[-1]
        lis=lis[:-1]
        if node:
          res.append(node.data)
        if node.right:
          lis.append(node.right)
        if node.left:
          lis.append(node.left)
    elif method=='mid':
      node = self.root
      while lis or node:
        while node:
          lis.append(node)
          node = node.left
        if len(lis)>0:
          node = lis[-1]
          lis=lis[:-1]
          if node:
            res.append(node.data)
          node= node.right
    else:
      pass
    return res

HaffMantest.py

#coding=utf-8
from HaffMan import HaffTree
tree=HaffTree()
lis=[
    [5,'A'],
    [15,'B'],
    [40,'C'],
    [30,'D'],
    [10,'E'],
   ]
print lis[2:]
print sorted(lis)
tree.run(lis)
print tree.list_all('before')
#应用 HaffMan编码,比如字母分布不均匀的情况下比较适合,可减少传输的信息量(二进制),不会出现干涉。:
tree=HaffTree()
lis2=[
    [27,'A'],
    [8,'B'],
    [15,'C'],
    [15,'D'],
    [30,'E'],
    [5,'F'],
   ]
tree.run(lis2)
print tree.code(lis2)

运行结果:

Python数据结构之哈夫曼树定义与使用方法示例

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python连接oracle数据库实例
Oct 17 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 Python
Pytorch: 自定义网络层实例
Jan 07 Python
Python根据指定文件生成XML的方法
Jun 29 Python
Python Request类源码实现方法及原理解析
Aug 17 Python
Python requests HTTP验证登录实现流程
Nov 05 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 #Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 #Python
Python贪心算法实例小结
Apr 22 #Python
python 判断网络连通的实现方法
Apr 22 #Python
Python3之读取连接过的网络并定位的方法
Apr 22 #Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 #Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 #Python
You might like
递归列出所有文件和目录
2006/10/09 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
javascript 新浪背投广告实现代码
2009/07/07 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
jquery增加和删除元素的方法
2015/01/14 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
经典c++面试题四
2015/05/14 面试题
村委会贫困证明
2014/01/14 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
Mysql基础之常见函数
2021/04/22 MySQL
python基础详解之if循环语句
2021/04/24 Python
深入解析MySQL索引数据结构
2021/10/16 MySQL
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android