【发布时间】:2013-08-28 11:25:17
【问题描述】:
我在 StackOverflow 上进行了一些搜索,并了解了 j-loop 的复杂性,即O(n<sup>2</sup>)。然而,随着 k-loop 的嵌套添加,我很困惑为什么复杂性变成O(n<sup>3</sup>)。有人可以帮我理解这一点吗?
据我了解,i-loop 有 n 次迭代,j-loop 有 1+2+3+...+n 次迭代 n*(n+1)/2 即 O(n<sup>2</sup>)。
for(i = 1; i < n; i++) {
for(j = i+1; j <= n; j++) {
for(k = i; k <= j; k++) {
// Do something here...
}
}
}
编辑:感谢您的所有帮助 :) Balthazar,我已经编写了一段代码,它将根据计数器所在的循环递增计数器,这是一种粗略的分步方式-步骤:
#include <iostream>
int main(int argc, const char * argv[])
{
int n = 9;
int index_I = 0;
int index_J = 0;
int index_K = 0;
for (int i = 1; i < n; i++) {
for (int j = i+1; j <= n; j++) {
for (int k = i; k <= j; k++) {
index_K++;
}
index_J++;
}
index_I++;
}
std::cout << index_I << std::endl;
std::cout << index_J << std::endl;
std::cout << index_K << std::endl;
return 0;
}
我将这段代码从 n=2 运行到 n=9,增量为 1,得到以下序列:
因此,从计数器可以看出:
i = n-1 给出了 O(n) 的复杂度,而 j = ((n-1)*n)/2 给出了复杂度 O(n<sup>2</sup>)。 K 的模式很难发现,但已知 K 取决于 J,因此:
k = ((n+4)/3)*j = (n*(n-1)*(n+4))/6 的复杂度为O(n<sup>3</sup>)
我希望这对未来的人们有所帮助。
EDIT2:感谢Dukeling 的格式化 :) 在最后一行也发现了一个错误,现在更正
【问题讨论】:
标签: algorithm complexity-theory big-o time-complexity