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实现一个简单的能够上传下载的HTTP服务器
May 05 Python
Python利用前序和中序遍历结果重建二叉树的方法
Apr 27 Python
Python中协程用法代码详解
Feb 10 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
Django Celery异步任务队列的实现
Jul 24 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
python验证码图片处理(二值化)
Nov 01 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
在CentOS7下安装Python3教程解析
Jul 09 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
ThinkPHP之A方法实例讲解
2014/06/20 PHP
php静态文件生成类实例分析
2015/01/03 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
webpack 静态资源集中输出的方法示例
2018/11/09 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
Python 将pdf转成图片的方法
2018/04/23 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Python帮你识破双11的套路
2019/11/11 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
django 模版关闭转义方式
2020/05/14 Python
python 实现批量图片识别并翻译
2020/11/02 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
客户接待方案
2014/02/26 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
捐助感谢信
2015/01/22 职场文书
银行资信证明
2015/06/17 职场文书
2019消防宣传标语!
2019/07/10 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
讲解MySQL增删改操作
2022/05/06 MySQL