我认为以下代码O(n ^ 3)的顺序是正确的吗?
for ( i = 1, sum = 0; i <= N; i++ ) {
for ( j = 1; j <= i; j++ ) {
sum++;
}
}
我理解外循环迭代N次。内循环对每个i迭代i次,并且由于我迭代N次,我假设内循环可以说迭代N ^ 2次(1 + 2 + ... + N-1 + N = N( N + 1)/ 2 = N ^ 2 in Big Oh)。所以你得到N * N ^ 2 = N ^ 3,或者至少我怀疑。
我对Big Oh符号的理解是你想找到最坏的情况时间,因为你正在寻找上限。这对我来说很有意义,但是当你真正查看这样的代码时,你只是在我接近N时寻找内循环的行为,或者你是否看到了总行为?换句话说,我是否正确考虑内部循环迭代i次为每个i&lt; = N,或者我应该抛弃内部循环的系列并看到它在i = N时迭代N次?
答案 0 :(得分:2)
没有。它是O(n 2 )。正如您正确指出的那样,内环是N而外环是N - 一起是N 2 。对于N 3 ,你可以添加另一个内环,
for ( i = 1, sum = 0; i <= N; i++ ) {
for ( j = 1; j <= i; j++ ) {
for ( t = 1; t <= j, t++ ) {
sum++;
}
}
}
答案 1 :(得分:1)
你实际上得到了O(n ^ 2)。
简化方式:两个循环,每个循环为N的倍数。因此O(n ^ 2)。
正常方式:两个循环,分别循环n次和n / 2次。那是n ^ 2/2,它在O(n ^ 2)。
答案 2 :(得分:1)
所以你得到N * N ^ 2 = N ^ 3,或者至少我怀疑。
将N乘以N ^ 2没有逻辑基础。
复杂性基本上是关于增加计算步骤的数量;即执行的指令或基本陈述。所以要“按书”来做,你需要:
N
,最后一旦掌握了它,你就可以采取合乎逻辑的捷径。但是你需要了解你在做什么......首先......否则你的捷径可能会无效。
以下是针对您的示例的书籍分析:
N - 1
次(N - 1) * N / 2
次(N - 1) * N / 2
次。添加所有你得到的东西(具体取决于你的数量......)
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
然后我们确定主导...的术语为N^2
...我们得到O(N^2)
。
请注意,如果F(N)
为N^2
或2N^2
,或者较低的订单项较小或较大,则对Big O复杂性没有任何影响。 Big O的复杂性将是相同的。但是,它在算法的可测量性能方面确实很重要,而且具有重要的实际意义。