算法时间要求

时间:2014-06-07 02:14:24

标签: java algorithm

我认为以下代码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次?

3 个答案:

答案 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变为无穷大时占主导地位的术语,将其转换为Big O符号。

一旦掌握了它,你就可以采取合乎逻辑的捷径。但是你需要了解你在做什么......首先......否则你的捷径可能会无效。


以下是针对您的示例的书籍分析:

  • 在语句#1中,循环执行N - 1
  • 这意味着在语句#2中,循环执行(N - 1) * N / 2
  • 这意味着语句#3执行(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^22N^2,或者较低的订单项较小或较大,则对Big O复杂性没有任何影响。 Big O的复杂性将是相同的。但是,它在算法的可测量性能方面确实很重要,而且具有重要的实际意义。