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进程管理工具supervisor使用实例
Sep 17 Python
python中实现定制类的特殊方法总结
Sep 28 Python
详解python中xlrd包的安装与处理Excel表格
Dec 16 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
从运行效率与开发效率比较Python和C++
Dec 14 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
解决python调用自己文件函数/执行函数找不到包问题
Jun 01 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
python判断元素是否存在的实例方法
Sep 24 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 Python
详解Python为什么不用设计模式
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
php xml 入门学习资料
2011/01/01 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
Python中datetime常用时间处理方法
2015/06/15 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
材料加工工程求职信
2014/02/19 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
2015年工程部工作总结
2015/04/30 职场文书
调解书格式范本
2015/05/20 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android
python实现双链表
2022/05/25 Python