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 相关文章推荐
详解python3百度指数抓取实例
Dec 12 Python
Django学习笔记之Class-Based-View
Feb 15 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
对json字符串与python字符串的不同之处详解
Dec 19 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
Python如何将装饰器定义为类
Jul 30 Python
Python实现Canny及Hough算法代码实例解析
Aug 06 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
python利用appium实现手机APP自动化的示例
Jan 26 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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
异步加载script的代码
2011/01/12 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
JS之相等操作符详解
2016/09/13 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
Python实现的爬虫功能代码
2017/06/24 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
html5的localstorage详解
2017/05/09 HTML / CSS
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
会话Bean的种类
2013/11/07 面试题
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
电子商务个人自荐信
2013/12/12 职场文书
公司周年庆典标语
2014/10/07 职场文书
《山中访友》教学反思
2016/02/24 职场文书
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
PyTorch中permute的使用方法
2022/04/26 Python