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用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
Python如何调用外部系统命令
Aug 07 Python
Python中__repr__和__str__区别详解
Nov 07 Python
python装饰器代替set get方法实例
Dec 19 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
php session_decode函数用法讲解
2019/05/26 PHP
设定php简写功能的方法
2019/11/28 PHP
$()JS小技巧
2007/07/21 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
python抽象基类用法实例分析
2015/06/04 Python
python实现发送邮件功能代码
2017/12/14 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
The North Face北面德国官网:美国著名户外品牌
2018/12/12 全球购物
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
syb养殖创业计划书
2014/01/09 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
司机岗位职责说明书
2014/07/29 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
酒店人事主管岗位职责
2015/04/11 职场文书
导游词之湖北武当山
2019/09/23 职场文书