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中的深拷贝和浅拷贝详解
Jun 03 Python
Python抽象类的新写法
Jun 18 Python
python机器学习库常用汇总
Nov 15 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
对python抓取需要登录网站数据的方法详解
May 21 Python
利用python循环创建多个文件的方法
Oct 25 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
python破解同事的压缩包密码
Oct 14 Python
总结python 三种常见的内存泄漏场景
Nov 20 Python
Pandas数据分析的一些常用小技巧
Feb 07 Python
在python中实现导入一个需要传参的模块
May 12 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
初识Laravel
2014/10/30 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
python常见排序算法基础教程
2017/04/13 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
高级运动鞋:GREATS
2019/07/19 全球购物
护士求职推荐信范文
2013/11/23 职场文书
婚前协议书
2014/04/15 职场文书
小学三年级学生评语
2014/04/22 职场文书
会计求职自荐信
2014/06/20 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
假释思想汇报范文
2014/10/11 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
入党转正介绍人意见
2015/06/03 职场文书
感恩主题班会教案
2015/08/12 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS