Python数据结构与算法之完全树与最小堆实例

 更新时间:2017年12月13日 11:13:41   作者:hanahimi  
这篇文章主要介绍了Python数据结构与算法之完全树与最小堆,结合实例形式分析了Python完全树定义及堆排序功能实现相关操作技巧,需要的朋友可以参考下

本文实例讲述了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加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • 使用python存储网页上的图片实例

    使用python存储网页上的图片实例

    今天小编就为大家分享一篇使用python存储网页上的图片实例,具有很好的参考价值。希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 关于python scrapy中添加cookie踩坑记录

    关于python scrapy中添加cookie踩坑记录

    这篇文章主要介绍了关于python scrapy中添加cookie踩坑记录,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Python实现动态添加类的属性或成员函数的解决方法

    Python实现动态添加类的属性或成员函数的解决方法

    这篇文章主要介绍了Python实现动态添加类的属性或成员函数的解决方法,在类似插件开发的时候会比较有用,需要的朋友可以参考下
    2014-07-07
  • Python利用ElementTree模块处理XML的方法详解

    Python利用ElementTree模块处理XML的方法详解

    ElementTree是python的XML处理模块,它提供了一个轻量级的对象模,下面这篇文章就来给大家介绍了关于Python利用ElementTree模块处理XML的方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-08-08
  • 详解使用python的logging模块在stdout输出的两种方法

    详解使用python的logging模块在stdout输出的两种方法

    这篇文章主要介绍了详解使用python的logging模块在stdout输出的相关资料,需要的朋友可以参考下
    2017-05-05
  • 使用python进行文本预处理和提取特征的实例

    使用python进行文本预处理和提取特征的实例

    今天小编就为大家分享一篇使用python进行文本预处理和提取特征的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 再也不用花钱买漫画!Python爬取某漫画的脚本及源码

    再也不用花钱买漫画!Python爬取某漫画的脚本及源码

    今天带大家学习Python的相关知识,文章围绕着怎么用Python下载漫画展开,文中有非常详细的代码示例及介绍,需要的朋友可以参考下
    2021-06-06
  • Python使用django获取用户IP地址的方法

    Python使用django获取用户IP地址的方法

    这篇文章主要介绍了Python使用django获取用户IP地址的方法,实例分析了django获取用户IP地址过程中出现的问题与对应的解决方法,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • Python实现向PPT中插入表格与图片的方法详解

    Python实现向PPT中插入表格与图片的方法详解

    这篇文章将带大家学习一下如何在PPT中插入表格与图片以及在表格中插入内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05
  • Python struct模块解析

    Python struct模块解析

    我们知道python只定义了6种数据类型,字符串,整数,浮点数,列表,元组,字典。但是C语言中有些字节型的变量,在python中该如何实现呢?这点颇为重要,特别是要在网络上进行数据传输的话。
    2014-06-06

最新评论