我正在尝试理解关于堆的简单概念。
我知道 BuildHeap 使用 Floyd 算法需要Theta(n)来构建一个大小为n的堆。我们获得这个运行时间的方法是从下到上构建堆 - 这样,更大量的堆可以减少工作量。
我对这个概念有一个不确定但有一个不同的细节,问题如下:
“假设已知的'FixHeap'取代Theta(log(log(n))而不是 西塔(的log(n))。什么是BuildHeap的运行时间 使用新的'FixHeap'构建大小为N的最大堆的算法 算法(现在只采用Theta(log(log(n)))
的算法
我不明白新给定的FixHeap的运行时间如何影响整个算法的运行时间。你能帮我理解一下这些变化吗?
FixHeap是已知算法,它将父级与其左右子级进行比较,并将最大值放在父级中。作为叶子的父节点的顶点上的FixHeap将进行最多一次替换,并且该顶点的父节点可以进行两次替换等等。
编辑:当前的BuildHeap运行时间由以下表达式计算:
(n / 4)* 1 +(n / 2)* 2 +(n / 3)* 3 + ...... + 1 * logn-1
仅仅因为叶子中有n / 4个父亲最多进行1次更改,并且有n / 2个最多进行2次更改等等...
我现在无法看到公式的变化。
谢谢!
答案 0 :(得分:2)
此算法仍将采用Θ(n)时间。为了看到这一点,我们可以证明该算法是O(n)和Ω(n)。
对于O(n)部分,请注意,此算法显然不能比FixHeap每次采用O(log n)时间的版本渐近地慢。由于heapify算法在第二种情况下需要O(n)时间,因此我们也可以获得O(log)n时间情况的O(n)时间限制。
对于Ω(n)部分,请注意,heapify算法的工作原理是对数组前半部分中的每个元素执行一次FixHeap过程。迭代超过n元素阵列的一半需要至少Ω(n)时间,从而为我们提供所需的下限。
希望这有帮助!