如何确定算法的最坏情况复杂度?

时间:2013-02-14 15:54:23

标签: algorithm heap

我正在为堆编写siftup算法,而我在问题结束时陷入困境。问题的最后一部分说算法应该具有对数最坏情况时间复杂度,即O(log(n)。我编写了下面的算法,其中i是堆中元素的索引,v是堆数组。根的索引是最低的,而它是堆的最低子节点的最大值。我正在考虑阵列从1到n

算法

Siftup (v, i) {
While(v[i] > v[i/2] and i != 0) {
    Temp = v[i] // Temp is of the same type as v[i]
    v[i] = v[i/2]
    v[i/2] = temp
    i = i / 2
    }
}

由于该过程涉及while loop中的四个赋值语句,每个语句具有恒定的最坏情况时序,因此该算法应具有对数最坏情况时间复杂度。任何人都可以显示确定其O(n)的方法,其中n是堆中元素的数量吗?

P.S。另请告诉我算法中的错误。

1 个答案:

答案 0 :(得分:1)

是的,看起来您的算法具有对数复杂度。

我同意你的观察,即每次迭代似乎都有不变的复杂性。

之后的步骤是确定对于给定的N值将执行多少次迭代。虽然我不打算直接回答这个问题,但这里的关键是i = i / 2。这可能更容易反过来看:对于某些给定的N,你必须在它到达那个N之前加倍i(从1开始)多少次?更具体地说,N的大小与你需要加倍i之前至少与N一样大的次数之间的关系是什么?