建堆的时间复杂度计算
来源:互联网 发布:淘宝代办出生公证 编辑:程序博客网 时间:2024/06/15 13:22
现在常有两种建堆的方法,而这两种方法又有着不同的时间复杂度。下面分别陈述:
(1)自顶向下的建堆方式
这种建堆的方法具有O(n*log2n)的时间复杂度。从根结点开始,然后一个一个的把结点插入堆中。当把一个新的结点插入堆中时,需要对结点进行调整,以保证插入结点后的堆依然是大根堆。如下图所示,是采用自顶向下的方法建立的大根堆。
其中h = log2(n+1)-1,第k层结点个数为2k个(当然最后一层结点个数可能小于2h)。第k层的一个结点插入之后需要进行的比较(移动)次数为k。于是总的比较(移动)次数为∑k*2k(k = 0,1,2,...,h)。可以求得∑k*2k(k = 0,1,2,...,h)=(log2(n+1)-2)*(n+1)+2 = O(n*log2n)
(2)自下向上的建堆方式
这种建堆的方法具有O(n)的时间复杂度。如下图所示,从第一个非叶子结点开始进行判断该子树是否满足堆的性质。如果满足就继续判断下一个点。否则,如果子树里面某个子结点有最大元素,则交换他们,并依次递归判断其子树是否仍满足堆性质。
因为调整根结点以及其左右孩子的位置的复杂度是O(1),再加上对其子树的递归判断是否满足堆性质需O(h),而在任意高度h上,至多有[n/2^(h+1)]个结点。则总共的时间复杂度为∑h*(n)/(2(h+1)).根据调和级数的积分公式可得,时间复杂度为O(n)。
0 0
- 建堆的时间复杂度计算
- 建堆的时间复杂度
- 堆排序建堆的时间复杂度
- 建堆的时间复杂度O(N)
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算。
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 时间复杂度的计算
- 4号了
- 怎么写项目解决方案
- 一周 项目3 日期结构体
- WebView中使用HTML打开本地应用
- JiaThis加网--分享按钮,稳步提升您的网站流量。
- 建堆的时间复杂度计算
- Python - 判断字符串和类字符串
- c语言内存分配函数之间的区别
- Linux下不同颜色的文件类型和Linux下用字符表示的文件类型
- ubuntu查看占用某端口的程序
- 俞军十二条
- Linux Shell编程入门
- Warning: mysqli::mysqli(): (HY000/2002): No connection could be made because the target machine acti
- JQuery中$.ajax()方法参数详解