【发布时间】:2015-08-28 22:15:41
【问题描述】:
考虑以下 C 函数:
int fun1 (int n)
{
int i, j, k, p, q = 0;
for (i = 1; i<n; ++i)
{
p = 0;
for (j=n; j>1; j=j/2)
++p;
for (k=1; k<p; k=k*2)
++q;
}
return q;
}
问题是决定以下哪个最接近函数fun1的返回值?
(A) n^3
(B) n (logn)^2
(C) nlogn
(D) nlog(logn)
这是给出的解释:
int fun1 (int n)
{
int i, j, k, p, q = 0;
// This loop runs T(n) time
for (i = 1; i < n; ++i)
{
p = 0;
// This loop runs T(Log Log n) time
for (j=n; j > 1; j=j/2)
++p;
// This loop runs T(Log Log n) time
for (k=1; k < p; k=k*2)
++q;
}
return q;
}
但如果循环变量除以/乘以一个常数,则循环的时间复杂度被认为是 O(Logn)。
for (int i = 1; i <=n; i *= c) {
// some O(1) expressions
}
for (int i = n; i > 0; i /= c) {
// some O(1) expressions
}
但有人提到内部循环每个都需要 Θ(Log Log n) 时间,谁能解释一下为什么 ar 的答案是错误的?
【问题讨论】:
标签: loops for-loop time-complexity nested-loops asymptotic-complexity