我有以下算法:
for(int i = n; i > 0; i--){
for(int j = 1; j < n; j *= 2){
for(int k = 0; k < j; k++){
... // constant number C of operations
}
}
}
我需要计算算法的运行时复杂度,
我很确定外循环运行O(n)
次,中间循环运行O(log(n))
次,内循环运行O(log(n))
次,但我不是这样确定无疑。
运行时复杂度的最终结果是O(n^2)
,但我不知道如何。
希望有人可以给我一个简短的解释,谢谢!
答案 0 :(得分:5)
对于每个i
,第二个循环通过2的幂运行j
,直到它超过n
:1,2,4,8,...,2 h ,其中h = int(log 2 n)。因此,最内部环路的主体运行2 0 + 2 1 + ... + 2 h = 2 h + 1 -1次。并且2 h + 1 -1 = 2 int(log 2 n)+1 -1,即O(n)。
现在,外循环执行n
次。这给出了整个事物O(n * n)的复杂性。