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的Django框架中从url中捕捉文本的方法
Jul 20 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
python机器学习实战之K均值聚类
Dec 20 Python
Python中Threading用法详解
Dec 27 Python
python在非root权限下的安装方法
Jan 23 Python
Python绘制KS曲线的实现方法
Aug 13 Python
Python 将Matrix、Dict保存到文件的方法
Oct 30 Python
详解python selenium 爬取网易云音乐歌单名
Mar 28 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
python实现文件+参数发送request的实例代码
Jan 05 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
Yii框架表单模型和验证用法
2016/05/20 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
js 数组操作代码集锦
2009/04/28 Javascript
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
Python3基础之条件与循环控制实例解析
2014/08/13 Python
Python内置函数的用法实例教程
2014/09/08 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
this关键字的含义
2015/04/08 面试题
工商技校毕业生自荐信
2013/11/15 职场文书
红色故事演讲稿
2014/05/22 职场文书
施工质量承诺书范文
2014/05/30 职场文书
六查六看六改心得体会
2014/10/14 职场文书
2014年教务工作总结
2014/12/03 职场文书