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使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
python2.7到3.x迁移指南
Feb 01 Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
简单实现Python爬取网络图片
Apr 01 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
Python爬取成语接龙类网站
Oct 19 Python
Python利用递归实现文件的复制方法
Oct 27 Python
Python3实现二叉树的最大深度
Sep 30 Python
下载官网python并安装的步骤详解
Oct 12 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 Python
python 中的jieba分词库
Nov 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
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
讲解Python中运算符使用时的优先级
2015/05/14 Python
Python 的描述符 descriptor详解
2016/02/27 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
Python语言描述随机梯度下降法
2018/01/04 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
python异常处理try except过程解析
2020/02/03 Python
postman和python mock测试过程图解
2020/02/22 Python
python将unicode和str互相转化的实现
2020/05/11 Python
Python实现一个论文下载器的过程
2021/01/18 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
Html5新增标签有哪些
2017/04/13 HTML / CSS
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
解除劳动合同协议书
2014/04/14 职场文书
小班上学期评语
2014/05/05 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书