码迷,mamicode.com
首页 > 其他好文 > 详细

自下而上建堆(heap)的时间复杂度证明

时间:2019-04-13 17:37:20      阅读:370      评论:0      收藏:0      [点我收藏+]

标签:其它   python   堆排序   行操作   数据结构   .com   作用   排序   二叉堆   

作者:Tobin
日期:2019/04/13
缘由:看python cookbook时,用到了heapq的库,书中提到,如果仅仅是返回一个数组的最大值,用max就可以了,但是如果返回多个较大或者较小元素用堆,如果返回的个数接近于数组本身的元素个数时,直接用排序即可。那么我在想,为啥返回几个元素的时候用堆效果比较好呢?于是我翻开了尘封许久的《算法导论》。

什么是堆

堆是一种数据结构。二叉堆是一个数组,近似于一个完全二叉树。树上的每个结点对应于数组的一个元素,除了最底层外树是充满的。下面的图是一个小根堆。即父节点的值要小于子结点,大根堆要相反。

技术图片

堆有哪些操作?复杂度如何证明。

建堆操作,调整操作,利用前两个进行的堆排序操作(建完堆后,不断将第一个元素与最后一个元素进行交换,然后调整,复杂度O(nlogn)。
主要是想记录下复杂度的证明,具体的堆如何操作就不细讲了,可以参考其它博客。
见图。
技术图片

复杂度上界是O(2n),在这之后,每次取一个最大元素并剔除后,进行调整的复杂度是O(logn),也就是说在建完堆后,每次需要到最大值得复杂度是O(logn)。显然在返回多个较大元素的情况下,建堆进行操作的速度比遍历要快,遍历每次需要O(n)的时间。

堆有什么作用呢?

优先队列的底层是用堆来实现的。

自下而上建堆(heap)的时间复杂度证明

标签:其它   python   堆排序   行操作   数据结构   .com   作用   排序   二叉堆   

原文地址:https://www.cnblogs.com/zuotongbin/p/10702001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!