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轻松查到删除自己的微信好友
Jan 10 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
Python实现的根据文件名查找数据文件功能示例
May 02 Python
python中文编码与json中文输出问题详解
Aug 24 Python
python实现停车管理系统
Nov 30 Python
python列表list保留顺序去重的实例
Dec 14 Python
python验证身份证信息实例代码
May 06 Python
django-allauth入门学习和使用详解
Jul 03 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
python计算auc的方法
Sep 09 Python
Python实现扫码工具的示例代码
Oct 09 Python
python热力图实现的完整实例
Jun 25 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
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
javascript表单验证大全
2015/08/12 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
COSETTE官网:奢华,每天
2020/03/22 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
Solaris操作系统的线程机制
2015/07/28 面试题
如何用JQuery进行表单验证
2013/05/29 面试题
环保宣传标语
2014/06/12 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
社区端午节活动总结
2015/02/11 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
创业计划书之家教中心
2019/09/25 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技