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 相关文章推荐
pycharm 使用心得(二)设置字体大小
Jun 05 Python
Python编程之多态用法实例详解
May 19 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
Python解析json代码实例解析
Nov 25 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
python时间日期操作方法实例小结
Feb 06 Python
Django Form常用功能及代码示例
Oct 13 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
Python 中Operator模块的使用
Jan 30 Python
pandas中对文本类型数据的处理小结
Nov 01 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
用Python编写web API的教程
2015/04/30 Python
如何基于python实现脚本加密
2019/12/28 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
教师职称自我鉴定
2014/02/12 职场文书
担保书怎么写
2014/04/01 职场文书
给校长的建议书200字
2014/05/16 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
教师节感谢信
2015/01/22 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
vue router 动态路由清除方式
2022/05/25 Vue.js