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中音频处理库pydub的使用教程
Jun 07 Python
Django与JS交互的示例代码
Aug 23 Python
django rest framework之请求与响应(详解)
Nov 06 Python
python如何实现int函数的方法示例
Feb 19 Python
wxPython实现窗口用图片做背景
Apr 25 Python
对python周期性定时器的示例详解
Feb 19 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
python 实现保存最新的三份文件,其余的都删掉
Dec 22 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 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使用sql server验证连接数据库的方法
2014/12/25 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
jQuery幻灯片带缩略图轮播效果代码分享
2015/08/17 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
详解如何在Vue里建立长按指令
2018/08/20 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
python检测lvs real server状态
2014/01/22 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
转预备党员政审材料
2014/02/06 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
HAM-2000摩机图
2021/04/22 无线电
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python