【数据结构】 -- 深究“向下建堆法”的时间复杂度为何是O(N)?

在正常排序的二叉树中,有满二叉树与完全二叉树两种,他们之间相差X个结点。

如果我们要继续排序,就要用到大小堆的方法。

这里我问一个问题:要建立顺序数组,应该用到哪个堆呢?答案是大堆,而不是小堆!为什么?因为大堆可以把最大值找出来,赋值给新的数组后与最后一个值交换隐藏即可,第二次排序即次大。用小堆的话很难找到最大值,因为左孩子有孩子之间无法排序(按本题思路为前提)。

而排序的过程就是建堆,为什么建堆的复杂度是0(N)呢?现在我们来计算一下:

我们可以先想象一下最坏的情况,就是满二叉树,每一个结点,除了叶子,都可能进行一次建堆,为什么是一次?因为找出孩子与父亲之间谁大只需要一次。

假设h为深度,即层数,N为结点数,时间复杂度为 t(N) :

 我们知道,一个满二叉树的结点数是:N = 2^h - 1 ,

所以 2^h - 1 - h 可以转换为 N - h ,   而二叉树深度h的公式为 h = log N,2为底,

所以再转换为 N - logN,按时间复杂度的方式来算,省略掉 logN,

最终的时间复杂度为 O(N) ;

你学会了吗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值