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运行的17个时新手常见错误小结
Aug 07 Python
Python logging模块学习笔记
May 24 Python
Python是编译运行的验证方法
Jan 30 Python
python对html代码进行escape编码的方法
May 04 Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
python使用selenium实现批量文件下载
Mar 11 Python
django celery redis使用具体实践
Apr 08 Python
python实现动态数组的示例代码
Jul 15 Python
Python实现密码薄文件读写操作
Dec 16 Python
python如何写出表白程序
Jun 01 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 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+ACCESS 文章管理程序代码
2010/06/21 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
jQuery示例收集
2010/11/05 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
Python实现分割文件及合并文件的方法
2015/07/10 Python
python 链接和操作 memcache方法
2017/03/04 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
python操作文件的参数整理
2019/06/11 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
管理科学大学生求职信
2013/11/13 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
信用社主任竞聘演讲稿
2014/05/23 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
长城导游词
2015/01/30 职场文书
药店收银员岗位职责
2015/04/07 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
vue router 动态路由清除方式
2022/05/25 Vue.js