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 动态获取当前运行的类名和函数名的方法
Apr 15 Python
python任务调度实例分析
May 19 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
python使用super()出现错误解决办法
Aug 14 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
numpy求平均值的维度设定的例子
Aug 24 Python
python实现梯度法 python最速下降法
Mar 24 Python
Python Json数据文件操作原理解析
May 09 Python
Python 实现微信自动回复的方法
Sep 11 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的URL重写
2014/11/25 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
jquery 事件对象属性小结
2010/04/27 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
Python中subprocess模块用法实例详解
2015/05/20 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
jupyter 导入csv文件方式
2020/04/21 Python
酒店公关部经理岗位职责
2013/11/24 职场文书
最热门的自我评价
2013/12/30 职场文书
会议接待欢迎词
2014/01/12 职场文书
小学生安全保证书
2014/02/01 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
工作经验交流材料
2014/12/30 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android