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中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
python批量获取html内body内容的实例
Jan 02 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
python 实现Harris角点检测算法
Dec 11 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 Python
django使用多个数据库的方法实例
Mar 04 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
使用js画图之画切线
2015/01/12 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
原生JS轮播图插件
2017/02/09 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
Linux中如何用命令创建目录
2016/12/02 面试题
竞选学生会演讲稿
2014/04/25 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
企业宣传口号
2014/06/12 职场文书
学校安全管理责任书
2014/07/23 职场文书
关于长城的导游词
2015/01/30 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
2015年人事科工作总结
2015/04/28 职场文书