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 字典(Dictionary)操作详解
Mar 11 Python
整理Python中的赋值运算符
May 13 Python
Python中的默认参数详解
Jun 24 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
python如何统计序列中元素
Jul 31 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 Python
Python排序算法之插入排序及其优化方案详解
Jun 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计数器的实现代码
2013/06/08 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
IE下js调试工具Companion.JS
2010/10/15 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
javascript判断office版本示例
2014/04/11 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
python pygame实现球球大作战
2019/11/25 Python
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
中餐厅主管的职责范文
2014/02/04 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫