Performance 例如,在这个插入排序算法中,我将如何证明算法';s的时间复杂度是O(n^2)?
采用以下插入排序算法: 通过检查,我知道O(n^2)相当容易。但就证明它是O(n^2)而言,我该怎么做呢?我可以把所有的运算加起来,但据我所知,“j=2到n的和”并不能真正得到n^2 我真的不知道如何确切地证明这一点。有没有人能解释清楚我是如何证明这一点的,用一种同样适用于O(n^3)算法的方法?这是O(n^2),因为你得到的是乘法,而不是和。 例如,按相反顺序排序的数组:Performance 例如,在这个插入排序算法中,我将如何证明算法';s的时间复杂度是O(n^2)?,performance,algorithm,sorting,big-o,big-theta,Performance,Algorithm,Sorting,Big O,Big Theta,采用以下插入排序算法: 通过检查,我知道O(n^2)相当容易。但就证明它是O(n^2)而言,我该怎么做呢?我可以把所有的运算加起来,但据我所知,“j=2到n的和”并不能真正得到n^2 我真的不知道如何确切地证明这一点。有没有人能解释清楚我是如何证明这一点的,用一种同样适用于O(n^3)算法的方法?这是O(n^2),因为你得到的是乘法,而不是和。 例如,按相反顺序排序的数组: 10 9 8 7 6 5 4 3 2 1 在这些情况下,内部循环的每次迭代都会在插入下一个元素之前扫描并移动数组的整个
10 9 8 7 6 5 4 3 2 1
在这些情况下,内部循环的每次迭代都会在插入下一个元素之前扫描并移动数组的整个已排序部分。这给了插入排序一个二次运行时间(即O(n2))
理解复杂性的最佳方法是尝试找到最坏情况的示例并遵循算法的步骤。假设1:如果一个过程p运行不超过T次,并且p每次都以O(f(N))的形式运行,那么整个运行时间是O(T*f(N))
假设2:如果过程p在O(f(N))时间内运行,而过程Q在O(g(N))时间内运行,那么在Q之后运行p需要O(f(N)+g(N))时间
要学究气,如果您愿意,假设1将遵循假设2
假设3:赋值和算术是O(1)运算
结合这三个假设,你会得到你的结果
第6行和第7行分别以O(1)和O(1)时间运行,因此它们一起以O(1+1)=O(1)时间运行。(根据假设3和假设2)
第5行确定{6,7}的运行时间不超过A.Length-0次,因此{5,6,7}的运行时间是O(A.Length*1)=O(A.Length)(根据假设1)
第2行、第4行和第8行以O(1)时间运行,因此{2,4,5,6,7,8}以O(1+1+A.Length+1)=O(A.Length)时间运行。(再次根据假设3和假设2)
第1行确定{2..8}的运行时间不超过A.Length次,因此第{1..8}行的运行时间为O(A.Length*A.Length)=O(A.Length^2)(根据假设1)。考虑在最坏情况下执行的操作数量,可以证明O的复杂性很大。您已经完成了计数部分,并在图像的右侧列中输入了结果,因此有待证明的是,主导项是
O(n^2)
除了涉及求和的术语外,您的程序还包括执行n-1次的指令,因此这些都是O(n)
术语
现在是关于和的条件。在最坏的情况下,at_j
可以是j
,因为您可能会将设置为j
的i
递减到0。所以在这个最坏的情况下,我们有t_j=j
,然后你有一个从2到n的j
和的项,它是O(n^2)
。这是由于以下数学恒等式:
这可以通过将这两个系列中的两个相加来证明,注意将两个求和到n+1
的项相加,然后将总和除以2。看一看这张照片
最后,由于O((n^2+n)/2)=O(n^2)
您得到了包含和的项在运行时占主导地位,这就是为什么算法是O(n^2)