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修改操作系统时间的方法
May 18 Python
详解详解Python中writelines()方法的使用
May 25 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
手把手教你python实现SVM算法
Dec 27 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
python 如何上传包到pypi
Dec 24 Python
Python如何导出导入所有依赖包详解
Jun 08 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获取一个字符串中间一部分字符的方法
2014/08/19 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
vue.js之vue-cli脚手架的搭建详解
2017/05/05 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python中input和raw_input的一点区别
2014/10/21 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
Keras设置以及获取权重的实现
2020/06/19 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
初中教师业务学习材料
2014/05/12 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
水知道答案观后感
2015/06/08 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
python基础之文件处理知识总结
2021/05/23 Python
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs