Python数据结构与算法之完全树与最小堆实例


Posted in Python onDecember 13, 2017

本文实例讲述了Python数据结构与算法之完全树与最小堆。分享给大家供大家参考,具体如下:

# 完全树 最小堆
class CompleteTree(list):
  def siftdown(self,i):
    """ 对一颗完全树进行向下调整,传入需要向下调整的节点编号i
    当删除了最小的元素后,当新增加一个数被放置到堆顶时,
    如果此时不符合最小堆的特性,则需要将这个数向下调整,直到找到合适的位置为止"""
    n = len(self)
    # 当 i 节点有儿子(至少是左儿子时),并且有需要调整时,循环执行
    t = 0
    while i*2+1<n:
      # step 1:从当前结点,其左儿子,其右儿子中找到最小的一个,将其编号传给t
      if self[i] > self[i*2+1]:
        t = i*2+1
      else: t = i
      # 如果有右儿子,则再对右儿子进行讨论
      if i*2+2<n:
        if self[t] > self[i*2+2]: t = i*2+2
      # step 2:把最小的结点中的元素和结点i的元素交换
      if t != i:
        self[t],self[i] = self[i],self[t]
        i = t  # 更新i为刚才与它交换的儿子结点的编号,以便接下来继续向下调整
      else:
        break  # 说明当前父结点已经比两个子结点要小,结束调整
  def siftup(self,i):
    """ 对一棵完全树进行向上调整,传入一个需要向上调整的结点编号i
      当要添加一个新元素后,对堆底(最后一个)元素进行调整 """
    if i==0: return
    n = len(self)
    if i < 0: i += n
    # 注意,由于堆的特性,不需要考虑左儿子结点的情况
    # 由于父结点绝对比子结点小所以只需要比较一次
    while i!=0:
      if self[i]<self[(i-1)/2]:
        self[i],self[(i-1)/2] = self[(i-1)/2],self[i]
      else:
        break
      i = (i-1)/2   # 更新i为其父结点编号,从而便于下一次继续向上调整
  def shufflePile(self):
    """ 在当前状态下,对树调整使其成为一个堆 """
    # 从"堆底"往"堆顶"进行向下调整,使得最小的元素不断上升
    # 这样可以使得i结点以下的堆是局部最小堆
    for i in range((len(self)-2)/2,-1,-1):  # n/2,...,0
      self.siftdown(i)
  def deleteMin(self):
    """ 删除最小元素 """
    t = self[0]   # 用一个临时变量记录堆顶点的
    self[0] = self[-1] # 将堆的最后一个点赋值到堆顶
    self.pop()   # 删除最后一个元素
    self.siftdown(0)  # 向下调整
    return t
  def heapsort(self):
    """ 对堆中元素进行堆排序操作 """
    n = len(self)
    s = []
    while n>0:
      s.append(self.deleteMin())
      n -= 1
    # 由于堆中的元素已全部弹出,将排序好的元素拼接到原来的堆中
    self.extend(s)
if __name__=="__main__":
  a = [99,5,36,7,22,17,92,12,2,19,25,28,1,46]
  ct = CompleteTree(a)
  print ct
>>> [99, 5, 36, 7, 22, 17, 92, 12, 2, 19, 25, 28, 1, 46]
  ct.shufflePile()
  print ct
>>> [1, 2, 17, 5, 19, 28, 46, 12, 7, 22, 25, 99, 36, 92]
  s = ct.heapsort()
  print ct
>>> [1, 2, 5, 7, 12, 17, 19, 22, 25, 28, 36, 46, 92, 99]

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
Jun 11 Python
python requests 测试代理ip是否生效
Jul 25 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
用Python配平化学方程式的方法
Jul 20 Python
Python拼接字符串的7种方式详解
Mar 19 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
Python爬取梨视频的示例
Jan 29 Python
教你使用Python pypinyin库实现汉字转拼音
May 27 Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 #Python
VTK与Python实现机械臂三维模型可视化详解
Dec 13 #Python
python+pygame简单画板实现代码实例
Dec 13 #Python
Python实现简单的语音识别系统
Dec 13 #Python
关于反爬虫的一些简单总结
Dec 13 #Python
Python自动化运维_文件内容差异对比分析
Dec 13 #Python
Python实现自动发送邮件功能
Mar 02 #Python
You might like
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
小程序关于请求同步的总结
2019/05/05 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
Python Web框架Tornado运行和部署
2020/10/19 Python
python如何爬取个性签名
2018/06/19 Python
python版飞机大战代码分享
2018/11/20 Python
python中sys模块是做什么用的
2020/08/16 Python
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
质检部部长职责
2013/12/16 职场文书
30岁生日感言
2014/01/25 职场文书
班主任自我评价范文
2015/03/11 职场文书
指导教师推荐意见
2015/06/05 职场文书
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python