确定算法的时间复杂度

时间:2012-09-25 05:40:06

标签: algorithm complexity-theory

下面是我写的一些伪代码,给定一个数组A和一个整数值k,如果A中有两个不同的整数,则返回true,否则返回false。我试图确定这个算法的时间复杂度。

我猜这个算法在最坏情况下的复杂性是O(n ^ 2)。这是因为第一个for循环运行n次,并且此循环中的for循环也运行n次。 if语句进行一次比较并返回一个值,如果为true,它们都是常量时间操作。最终的return语句也是一个恒定的时间操作。

我的猜测是否正确?我是算法和复杂性的新手,所以如果我在任何地方出错,请纠正我!

Algorithm ArraySum(A, n, k)
for (i=0, i<n, i++)
    for (j=i+1, j<n, j++)
        if (A[i]+A[j]=k)
            return true
return false

3 个答案:

答案 0 :(得分:5)

Azodious的推理是不正确的。内循环不会简单地运行n-1次。因此,您不应使用(outer iterations)*(inner iterations)来计算复杂性。

需要注意的重要一点是,内循环的运行时随外循环的每次迭代而变化。

这是正确的,第一次循环运行时,它会进行n-1次迭代。但在那之后,迭代量总是减少一个:

  • n - 1
  • n - 2
  • n - 3
  • ...
  • 2
  • 1

我们可以使用Gauss' trick (second formula)对此系列进行求和以得到n(n-1)/2 = (n² - n)/2。这是在最坏的情况下比较总共运行的次数。

由此可以看出,绑定不能比O(n²)更严格。如你所见,没有必要猜测。

请注意,您无法提供有意义的下限,因为算法可能在任何步骤后完成。这意味着算法的最佳情况是O(1)

答案 1 :(得分:1)

是。在最坏的情况下,您的算法是O(n 2 )。

您的算法是O(n 2 ),因为每个输入实例都需要时间复杂度O(n 2 )。
您的算法是Ω(1),因为存在一个输入实例只需要时间复杂度Ω(1)。

以下内容出现在 Cormen Leiserson共同撰写的算法导论的第3章功能增长 Rivest Stein 当我们说算法的运行时间(无修饰符)是Ω(g(n))时,我们的意思是没有为n的每个值选择大小为n的特定输入,运行对于足够大的n ,该输入上的时间至少是恒定时间g(n)

给定其中前两个元素的总和等于k的输入,该算法在返回true之前将仅进行一次加法和一次比较。 因此,此输入需要恒定的时间复杂度,并使该算法的运行时间为Ω(1)

无论输入是什么,该算法在返回值之前最多需要n(n-1)/ 2次加法和n(n-1)/ 2次比较。 因此,该算法的运行时间为O(n 2

总之,我们可以说该算法的运行时间介于Ω(1)和O(n 2 )之间。 我们还可以说这个算法的最坏情况运行是Θ(n 2 )。

答案 2 :(得分:-2)

你说得对,但让我解释一下:

  

这是因为第一个for循环运行n次,并且此循环中的for循环也运行n次。

实际上,第二个循环将运行 (n-i-1) 次,但就复杂性而言,它仅被视为n(根据phant0m的评论更新)

因此,在最糟糕的情况下,它会运行n * (n-i-1) * 1 * 1次。这是O(n^2)

在最佳情况下,它会运行1 * 1 * 1 * 1次,即O(1),即不变。