背景
维基百科和其他我找到的来源都表明,通过从空的二叉堆开始并将n个元素插入其中来构建二叉堆的时间复杂度为O(nlogn),因为二叉堆插入是O(logn),而您要进行n次操作。让我们称之为“插入”算法。
它还提出了一种替代方法,即沉降/向下渗漏/向下过滤/向下堆化/向下冒泡前半部分元素,从中间元素开始,以第一个元素结束,这是O(n)的复杂度,比较好。这种复杂性的证明在于沉降每个元素的复杂性取决于其在二叉堆中的高度:如果它靠近底部,则很小,可能为零; 如果它靠近顶部,则可以很大,可能为logn。关键在于此过程中每个元素的复杂度不是logn,因此总体复杂度远小于O(nlogn),实际上是O(n)。让我们称之为“沉降”算法。
问题
为什么插入算法的复杂度不是出于同样的原因与沉降算法相同?
考虑插入算法中前几个元素实际执行的工作。第一个插入的成本不是logn,而是零,因为二叉堆是空的!第二次插入的成本最多为一次交换,第四次插入的成本最多为两次交换,等等。插入元素的实际复杂度取决于二叉堆的当前深度,因此大多数插入的复杂度都小于O(logn)。甚至在所有n个元素都被插入之后,插入成本也没有达到O(logn) [对于最后一个元素,它是O(log(n-1))]!
这些节省听起来就像沉降算法所得到的节省,那么为什么不对两种算法都计算相同的节省呢?