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中最难理解的点-装饰器
Apr 03 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
python的等深分箱实例
Nov 22 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
详解python破解zip文件密码的方法
Jan 13 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
Pycharm及python安装详细教程(图解)
Jul 31 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 Python
详解Python调用系统命令的六种方法
Jan 28 Python
Python实现我的世界小游戏源代码
Mar 02 Python
只用Python就可以制作的简单词云
Jun 07 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 和 XML: 使用expat函数(一)
2006/10/09 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
Python三级目录展示的实现方法
2016/09/28 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
Python最小二乘法矩阵
2019/01/02 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
Python中如何添加自定义模块
2020/06/09 Python
python数据抓取3种方法总结
2021/02/07 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
学习十八大精神心得体会
2013/12/31 职场文书
医学专业职业生涯规划范文
2014/02/05 职场文书
2014年新教师工作总结
2014/11/08 职场文书
清洁员岗位职责
2015/02/15 职场文书
开展警示教育活动总结
2015/05/09 职场文书
行政处罚决定书
2015/06/24 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
Python基本数据类型之字符串str
2021/07/21 Python
Python制作春联的示例代码
2022/01/22 Python