Java 循环三的大O表示法
以下代码的复杂性是什么?会是N^2*log(N)吗Java 循环三的大O表示法,java,big-o,time-complexity,Java,Big O,Time Complexity,以下代码的复杂性是什么?会是N^2*log(N)吗 for(int m=1;m=1;k--) { 对于(int i=1;i第一个循环执行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=1;k--)
{
对于(int i=1;i第一个循环执行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;
}
如果循环体的运行时间为O(C)
?O(C*k)
第二个循环需要多长时间?O(C*(1+2+3+…+m))=O(C*m²)
整个代码片段需要多长时间?O(C*(1²+2²+3²+…+n²))=O(C*n³)
有关求和多项式的信息,请参见。如果使用西格玛表示法,您可以得出以下结论:
为什么你认为这是n^2log(n)
?@ralis-正确的方法是分析代码而不是猜测。(答案是“不是”).@Stephen C-你是什么意思?@StephenC除非你现在正在参加多项选择题考试。@ralis-你的老师没有教你如何从第一原理进行复杂性分析吗???我想你算错了第二和第三个循环的迭代次数。你是如何得到O(C*(1²+2²+3²+…+n²))的
?实际迭代次数为1+(1+2)+(1+2+3)+……(1+2+3+…+n)
——从1到n的总和(n*(n+1))/2.你是说前者是一个精确的计数,还是仅仅把它作为实际计数的一个松散的上限?@Andythonas:精确计数在这里是不相关的,因为O符号。我不是说它是一个精确的计数,但是幂低于2的一切都可以安全地忽略。(Faulhaber公式告诉您,次数x
的多项式的任何和都会导致次数x+1
)
#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