下面是我写的一些伪代码,给定一个数组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
答案 0 :(得分:5)
Azodious的推理是不正确的。内循环不会简单地运行n-1
次。因此,您不应使用(outer iterations)*(inner iterations)
来计算复杂性。
需要注意的重要一点是,内循环的运行时随外循环的每次迭代而变化。
这是正确的,第一次循环运行时,它会进行n-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)
,即不变。