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调用cmd命令行制作刷博器
Jan 13 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
Python获取邮件地址的方法
Jul 10 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
Python搜索引擎实现原理和方法
Nov 27 Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 Python
python正则表达式之对号入座篇
Jul 24 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 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
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
python中的内置函数getattr()介绍及示例
2014/07/20 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
Python基础之文件读取的讲解
2019/02/16 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
您的网上新华书店:文轩网
2016/08/24 全球购物
税务职业生涯规划书范文
2014/09/16 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
党校党性分析材料
2014/12/19 职场文书
给老师的一封感谢信
2015/01/20 职场文书
运动会新闻稿
2015/07/17 职场文书
2016年学校禁毒宣传活动工作总结
2016/04/05 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL