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保存MongoDB上的文件到本地的方法
Mar 16 Python
Python简单实现enum功能的方法
Apr 25 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
python的格式化输出(format,%)实例详解
Jun 01 Python
python微信公众号之关键词自动回复
Jun 15 Python
Win10下python 2.7.13 安装配置方法图文教程
Sep 18 Python
Python脚本操作Excel实现批量替换功能
Nov 20 Python
Python底层封装实现方法详解
Jan 22 Python
python定义类self用法实例解析
Jan 22 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
python实现手势识别的示例(入门)
Apr 15 Python
实战Python爬虫爬取酷我音乐
Apr 11 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 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
详解Python中的__new__()方法的使用
2015/04/09 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
基于python log取对数详解
2018/06/08 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
用python解压分析jar包实例
2020/01/16 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
新闻专业个人自我评价
2013/09/21 职场文书
药店主任岗位责任制
2014/02/10 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android