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入门篇之条件、循环
Oct 17 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
对Pytorch 中的contiguous理解说明
Mar 03 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 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关闭调试模式时报错的问题汇总
2015/04/22 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
jQuery自动或手动图片切换效果
2017/10/11 jQuery
简单的Vue异步组件实例Demo
2017/12/27 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
JS随机密码生成算法
2019/09/23 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
Python中断言Assertion的一些改进方案
2016/10/27 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
对python 自定义协议的方法详解
2019/02/13 Python
python写一个随机点名软件的实例
2019/11/28 Python
python绘制雪景图
2019/12/16 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
大学专科生推荐信范文
2013/11/23 职场文书
单位未婚证明范本
2014/01/18 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
2015中秋祝酒词
2015/08/12 职场文书