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 自动安装 Rising 杀毒软件
Apr 24 Python
Python读大数据txt
Mar 28 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
Python socket 套接字实现通信详解
Aug 27 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
python右对齐的实例方法
Jul 05 Python
Django如何重置migration的几种情景
Feb 24 Python
matlab xlabel位置的设置方式
May 21 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
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
Javascript图像处理思路及实现代码
2012/12/25 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
详解Python的Django框架中的templates设置
2015/05/11 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
django创建简单的页面响应实例教程
2019/09/06 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
销售业务实习自我鉴定
2013/09/23 职场文书
社区庆中秋节活动方案
2014/02/07 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
快餐公司创业计划书
2014/04/29 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
网络营销计划
2015/01/17 职场文书
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA