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操作SQLite简明教程
Jul 10 Python
Python正则表达式匹配ip地址实例
Oct 09 Python
git进行版本控制心得详谈
Dec 10 Python
python实现简单的单变量线性回归方法
Nov 08 Python
django主动抛出403异常的方法详解
Jan 04 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
通过实例简单了解python yield使用方法
Aug 06 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 Python
Python 数据可视化之Seaborn详解
Nov 02 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
php addslashes 函数详细分析说明
2009/06/23 PHP
php读取javascript设置的cookies的代码
2010/04/12 PHP
php的一些小问题
2010/07/03 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
xtree.js 代码
2007/03/13 Javascript
javascript 自动转到命名锚记
2009/01/10 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python标准库os.path包、glob包使用实例
2014/11/25 Python
python中reader的next用法
2018/07/24 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Python 存取npy格式数据实例
2020/07/01 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
创业计划书的写作技巧及要点
2014/01/31 职场文书
运动会邀请函范文
2014/01/31 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang