以下代码的复杂性是什么?它会是N ^ 2 * log(n)吗?
for (int m = 1; m <= n; m++)
{
for (int k = m; k >= 1; k--)
{
for (int i = 1; i <= k; i++)
{
//do something here
}
}
}
感谢任何帮助。
答案 0 :(得分:2)
给定循环体的运行时间O(C)
,最内层循环需要多长时间? O(C*k)
第二个循环需要多长时间? O(C*(1+2+3+...+m)) = O(C*m²)
整个代码snipplet需要多长时间? O(C*(1²+2²+3²+...+n²)) = O(C*n³)
对于求和多项式,请参阅Faulhaber's formula。
答案 1 :(得分:1)
第一个循环执行n次。 第二个循环执行n / 2次。 第三个循环执行k / 2次,相当于n / 4次。
这给你一个O(n ^ 3)的复杂性。
经验测试:
#include <iostream>
using namespace std;
int main () {
int n = 1000;
long first = 0, second = 0, third = 0;
for (int m = 1; m <= n; m++)
{
first++;
for (int k = m; k >= 1; k--)
{
second++;
for (int i = 1; i <= k; i++)
{
third++;
}
}
}
cout << first << " " << second << " " << third << endl;
return 0;
}
结果:
1000 500500 167167000
答案 2 :(得分:0)
如果您使用Sigma表示法,则可以提出以下内容: