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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
Python中atexit模块的基本使用示例
Jul 08 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
Python网络编程 Python套接字编程
Sep 13 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
Python的缺点和劣势分析
Nov 19 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 Python
python 实用工具状态机transitions
Nov 21 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 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
网站当前的在线人数
2006/10/09 PHP
PHP新手上路(十)
2006/10/09 PHP
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
用Python抢过年的火车票附源码
2015/12/07 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
武汉高蓝德国际.net机试
2016/06/24 面试题
副董事长岗位职责
2014/04/02 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
教师工作态度自我评价
2015/03/05 职场文书
初中同学会致辞
2015/08/01 职场文书
详解NodeJS模块化
2021/06/15 NodeJs
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫