我正在为堆编写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。另请告诉我算法中的错误。
答案 0 :(得分:1)
是的,看起来您的算法具有对数复杂度。
我同意你的观察,即每次迭代似乎都有不变的复杂性。
之后的步骤是确定对于给定的N值将执行多少次迭代。虽然我不打算直接回答这个问题,但这里的关键是i = i / 2
。这可能更容易反过来看:对于某些给定的N,你必须在它到达那个N之前加倍i
(从1开始)多少次?更具体地说,N的大小与你需要加倍i
之前至少与N一样大的次数之间的关系是什么?