Performance 比较的理论分析

Performance 比较的理论分析,performance,algorithm,sorting,Performance,Algorithm,Sorting,我首先被要求开发一个简单的排序算法,将整数数组按升序排序,并将其编码: int i, j; for ( i = 0; i < n - 1; i++) { if(A[i] > A[i+1]) swap(A, i+1, i); for (j = n - 2; j >0 ; j--) if(A[j] < A[j-1]) swap(A, j-1, j

我首先被要求开发一个简单的排序算法,将整数数组按升序排序,并将其编码:

int i, j;

    for ( i = 0; i < n - 1; i++)
    {
        if(A[i] > A[i+1])
            swap(A, i+1, i);

        for (j = n - 2; j >0 ; j--)
            if(A[j] < A[j-1])
                swap(A, j-1, j);
    }
如果有人能一步一步地指导我,我将不胜感激。

在进行“真正的”大型O时间复杂性分析时,您可以选择一个可以计算的操作,显然是控制运行时间的操作。在您的情况下,您可以选择比较或交换,因为最坏的情况下会有很多交换,对吗

然后,计算这将被调用多少次,并缩放到输入。因此,在您的案例中,您的分析非常正确,您只需执行以下操作:

C = O((n - 1)(n - 2)) = O(n^2 -3n + 2) = O(n^2)
我通过对代码中数据流的推理得出了这些数字。你有一个外部循环,对吗?在这个for循环中,有另一个for循环迭代。第一个for循环迭代n-1次,第二个for循环迭代n-2次。因为它们是嵌套的,所以实际的迭代次数实际上是这两个的乘积,因为对于外部循环中的每个迭代,整个内部循环都会运行,进行n-2次迭代

正如您可能知道的,在进行时间复杂度分析时,您总是删除除主要术语之外的所有术语

关于最坏情况复杂度和平均情况下的下界,还有很多需要补充的地方,但这将有希望让您掌握如何对大O时间复杂度分析进行推理


我见过很多不同的方法来分析表达式,比如你的递归关系。然而,我个人更倾向于只对代码进行推理。很少有算法具有难以计算的上界,另一方面,下界通常很难计算。

您的分析是正确的:外循环进行n-1次迭代。内部循环使
n-2

因此,对于外部循环的每个迭代,您在内部循环上都有
n-2
迭代。因此,步骤总数为
(n-1)(n-2)=n^2-3n+2

主要术语(这在big-O分析中很重要)是
n^2
,因此您可以得到
O(n^2)
运行时


我个人不会在这种情况下使用递归方法。编写递归方程通常对递归函数很有帮助,但在像这样更简单的算法中,有时看代码和做一些简单的数学比较容易。

你能给我更多关于C(n)=O(n-1)*(n-2)的知识吗?我不太明白你为什么要把这两个比较相乘。是的。但我忘了问,如果我在做最坏、最好和平均情况,这个“O”符号会是什么样子?@ArcRanges假设交换,如果测试是
O(1)
,那么在最坏、最好和平均情况下,它将是
O(n^2)
。你总是有
O(n^2)
总迭代次数,即使循环中没有实际的工作。实际上,“O”符号有一个外行的正式定义,类似于“算法不会比这个运行得慢”。最坏情况、最佳情况和平均情况是三种不同的计算。看看@FilipeGonçalves的答案。@JohanS Hah,是的-当然。接得好。但我们不要让这变得过于复杂。
C = O((n - 1)(n - 2)) = O(n^2 -3n + 2) = O(n^2)