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中正则表达式的用法实例汇总
Aug 18 Python
使用优化器来提升Python程序的执行效率的教程
Apr 02 Python
python实现在控制台输入密码不显示的方法
Jul 02 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
Python+树莓派+YOLO打造一款人工智能照相机
Jan 02 Python
对python中的logger模块全面讲解
Apr 28 Python
python使用rpc框架gRPC的方法
Aug 24 Python
Python实现时间序列可视化的方法
Aug 06 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
python实现从ftp服务器下载文件
Mar 03 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 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 xml实例 留言本
2009/03/20 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
基于jQuery的Spin Button自定义文本框数值自增或自减
2010/07/17 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
详解vue跨组件通信的几种方法
2017/06/15 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
python实现上传下载文件功能
2020/11/19 Python
python 定时器,轮询定时器的实例
2019/02/20 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
详解python对象之间的交互
2020/09/29 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
证婚人搞笑证婚词
2014/01/10 职场文书
工程承包协议书范本
2014/09/29 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
Python上下文管理器Content Manager
2021/06/26 Python
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫