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实现把utf-8格式的文件转换成gbk格式的文件
Jan 22 Python
详解Python验证码识别
Jan 25 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
Python对多属性的重复数据去重实例
Apr 18 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
Django如何使用redis作为缓存
May 21 Python
python读取hdfs上的parquet文件方式
Jun 06 Python
python是怎么被发明的
Jun 15 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
python3中for循环踩过的坑记录
Dec 14 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 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示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
php中session定期自动清理的方法
2015/11/12 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
js星星评分效果
2014/07/24 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
理解JS绑定事件
2016/01/19 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
python数据结构之二叉树的遍历实例
2014/04/29 Python
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python中几种导入模块的方式总结
2017/04/27 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
python函数与方法的区别总结
2019/06/23 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
python实现logistic分类算法代码
2020/02/28 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
地理科学专业毕业生求职信
2013/10/15 职场文书
财务经理的岗位职责
2013/12/17 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
土地租赁协议书
2015/01/29 职场文书
董事会决议范本
2015/07/01 职场文书
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python