for i = 0 to size(arr)
for o = i + 1 to size(arr)
do stuff here
这是最糟糕的时间复杂性?它不是N ^ 2,因为第二个每i循环减少一个。它不是N,它应该更大。 N-1 + N-2 + N-3 + ... + N-N + 1。
答案 0 :(得分:9)
是 N ^ 2
,因为它是两种线性复杂性的产物。
(渐近复杂性被称为渐近而不是相同 ......)
答案 1 :(得分:2)
将其想象为使用n x n矩阵。您正在处理矩阵中一半的元素,但O(n ^ 2/2)与O(n ^ 2)相同。
答案 2 :(得分:1)
n*(n-1)/2
等于O(n^2)
。
答案 3 :(得分:1)
当您想要确定算法的复杂性类时,您只需要在算法的复杂度函数中找到增长最快的术语。例如,如果您有复杂度函数f(n)=n^2-10000*n+400
,要查找O(f(n))
,您只需在函数中找到“最强”的术语。为什么?因为n
足够大,只有那个术语决定了整个函数的行为。话虽如此,很容易看出f1(n)=n^2-n-4
和f2(n)=n^2
都在O(n^2)
。但是,对于相同的输入大小n
,它们不会运行相同的时间。
在您的算法中,如果n=size(arr)
,do stuff here
代码将运行f(n)=n+(n-1)+(n-2)+...+2+1
次。很容易看出f(n)
代表算术系列的总和,即f(n)=n*(n+1)/2
,即f(n)=0.5*n^2+0.5*n
。如果我们假设do stuff here
为O(1)
,那么您的算法的复杂度为O(n^2)
。
表示i = 0到大小(arr)
我认为当i
变得大于size(arr)
时,循环结束,不等于。但是,如果是后者,则为f(n)=0.5*n^2-0.5*n
,并且它仍在O(n^2)
中。请记住,O(1),O(n),0(n^2)
,...是复杂性类,算法的复杂性函数是对于输入大小n描述算法中有多少步骤的函数。