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编程实现正则删除命令功能
Aug 30 Python
使用Python+Splinter自动刷新抢12306火车票
Jan 03 Python
解决Mac安装scrapy失败的问题
Jun 13 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
浅谈python编译pyc工程--导包问题解决
Mar 20 Python
详解Django定时任务模块设计与实践
Jul 24 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
Python可以用来做什么
Nov 23 Python
python 离散点图画法的实现
Apr 01 Python
python图像处理 PIL Image操作实例
Apr 09 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 和 HTML
2006/10/09 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
Javascript实现的分页函数
2007/02/07 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
Python Socket编程入门教程
2014/07/11 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
pandas 对group进行聚合的例子
2019/12/27 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
2014工程部年度工作总结
2014/12/17 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
MySQL系列之三 基础篇
2021/07/02 MySQL
Python获取字典中某个key的value
2022/04/13 Python