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登录QQ邮箱发信的实现代码
Feb 10 Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 Python
Python分析学校四六级过关情况
Nov 22 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
详解Python绘图Turtle库
Oct 12 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
详解Django配置优化方法
Nov 18 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
pytorch 归一化与反归一化实例
Dec 31 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
python字典与json转换的方法总结
Dec 28 Python
Numpy ndarray 多维数组对象的使用
Feb 10 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
简单谈谈favicon
2015/06/10 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
PHP安全下载文件的方法
2016/04/07 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
javascript入门基础之私有变量
2010/02/23 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
大学生实习思想汇报
2014/01/12 职场文书
好家长事迹材料
2014/01/23 职场文书
2015年中个人总结范文
2015/03/10 职场文书
七年级英语教学反思
2016/02/15 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA