Java 算法时间要求
我相信下面代码O(n^3)的顺序正确吗Java 算法时间要求,java,algorithm,Java,Algorithm,我相信下面代码O(n^3)的顺序正确吗 for ( i = 1, sum = 0; i <= N; i++ ) { for ( j = 1; j <= i; j++ ) { sum++; } } for(i=1,sum=0;iNo。它是O(n2)。正如你正确地注意到的,内环是N,外环是N-加起来就是n2。也就是说,对于N3,你可以添加另一个内环 for ( i = 1, sum = 0; i <= N; i++ ) { for ( j = 1;
for ( i = 1, sum = 0; i <= N; i++ ) {
for ( j = 1; j <= i; j++ ) {
sum++;
}
}
for(i=1,sum=0;iNo。它是O(n2)。正如你正确地注意到的,内环是N,外环是N-加起来就是n2。也就是说,对于N3,你可以添加另一个内环
for ( i = 1, sum = 0; i <= N; i++ ) {
for ( j = 1; j <= i; j++ ) {
for ( t = 1; t <= j, t++ ) {
sum++;
}
}
}
对于(i=1,sum=0;i你实际上会得到O(n^2)
简化方法:两个循环,每个循环的倍数为N。因此为O(N^2)
正常方式:两个循环,分别循环n次和n/2次。这就是O(n^2)中的n^2/2
所以你得到N*N^2=N^3,或者至少我怀疑
N乘以N^2没有逻辑依据
复杂性基本上是计算步骤的数量的总和,即执行的指令或基本语句。因此,要“按书”进行计算,您需要:
- 分析每条语句,给出执行的次数
- 把它们全部加起来,在
N
上给你一个函数,最后
- 通过识别当N趋于无穷大时占主导地位的项,将其转换为大O符号
一旦你掌握了窍门,你可以走合乎逻辑的捷径。但是你需要先了解你在做什么……否则你的捷径很可能是无效的
以下是对您的示例的逐书分析:
- 在语句#1中,循环执行
N-1次
- 这意味着在语句#2中,循环被执行
(N-1)*N/2次
- 这意味着语句#3被执行
(N-1)*N/2次
把这些加起来,你会得到这样的结果(具体取决于你数多少…)
然后我们确定占主导地位的术语…为N^2
…我们得到O(N^2)
请注意,如果F(N),则对大O复杂度没有任何影响
是N^2
或2N^2
…或者如果低阶项是小的或大的。大O复杂度将是相同的。但是,它确实关系到算法的可测量性能,这非常重要。在“大Oh”之后停止在你的第一段中,你说对了。你的和中的N项来自外循环的N次迭代,所以不要将和乘以N。祝你好运!@PaulF Ah,我现在明白了。非常感谢!谢谢,我想我只是误解了你在使用Big-Oh时所寻找的东西。这澄清了书中的许多其他例子,谢谢!
F(N) = N - 1 + ((N - 1) * N) / 2 + ((N - 1) * N) / 2
= N - 1 + ((N - 1) * N)
= N - 1 + N^2 - N
= N^2 - 1