【发布时间】:2020-03-14 08:44:39
【问题描述】:
void func(int n){
int i=1, k=n;
while (i<=k){
k=k/2;
i = i*2;
}
}
我如何计算这个函数的时间复杂度?我知道 i=1, k=n 的赋值需要两个基本步骤,将 k 的值除以 i 的值也需要两个基本步骤,但是因为 i 和 k 的值呈指数增长和下降,时间复杂度是O(log base 4 N)还是O(log base 2 sqrt(N))?
【问题讨论】:
-
我认为它是 O(log2(n)/2)。如果您忽略
k=k/2,那么它是 log2(n),因为i本质上是2^m,其中 m 是从 0 开始的迭代次数。 -
您必须考虑它必须执行多少步骤。您可以放心地忽略分配变量所需的恒定时间。您从 i = 1 和 k = n 开始,并且在每个循环中,您将 i 加倍并使 k 减半,本质上您会发现 x 其中函数 n/(2^x) 和 1 * (2^x) “满足在中间”。对此持保留态度,但我觉得它应该是 O(log4(n)) (我建议你在纸上写几个迭代)
-
或者换句话说,它是 O(log n),因为上面的两个 cmets 是用不同的方式编写的。
标签: time-complexity big-o complexity-theory