最坏情况下算法的运行时间

时间:2015-09-07 23:16:45

标签: algorithm

在最坏的情况下,以下算法的运行时间是什么,假设它需要一个恒定的时间c1来进行比较而另一个恒定时间c2来交换两个元素?

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n - 1; j++)
    {
        if (array[j] > array [j+1])
        {
            swap(array[j], array[j+1]);
        }
    }
}

我得到2 + 4n ^ 2。我如何计算它(从内循环开始):

内循环运行(n-1)次。
它第一次运行时,有j的初始化和j与(n-1)的比较,以知道是否进入循环。这给出了2条指令。
每次运行时,都会将j与(n-1)进行比较,以了解是继续循环,j的增量,数组比较还是交换。这给出了4条指令,它们运行(n-1)次,因此有4(n-1)条指令。 因此内环包含2 + 4(n-1)条指令。

外循环运行n次。
外循环第一次运行时,i的初始化和i与n的比较。这给出了2条指令。
每次运行时,都会将i与n,i的增量和内循环进行比较。这给出了(2 +(2 + 4(n-1)))n个指令。

总共有2+(2 +(2 + 4(n-1)))n个指令,它们给出2 + 4n ^ 2。

这是对的吗?

1 个答案:

答案 0 :(得分:2)

您忘记在if语句和交换调用中为索引添加n-1,并且内部for循环中的for (int i = 0; i < n; i++) //(1 + 1) + n(1 + 1 + innerCost) (init+comp) + numLoops(comp+inc+innerCost) { for (int j = 0; j < n - 1; j++) //(1 + 2) + (n-1)(1 + 1 + 1 + inner) (init+comp) + numLoops(sub+comp+inc+innerCost) { if (array[j] > array [j+1]) //1 + 1 (1 for comparison, 1 for +) { swap(array[j], array[j+1]); //1 + 1 (1 for function call, 1 for +) } } } 计算将是一个额外的指令。

请记住,每个计算都算作一条指令,这意味着代码中的每个操作符基本上都会添加一条指令,而不仅仅是比较,函数调用和循环控制。

(1+1) + n(1+1+ (1+2)+(n-1)(1+1+1+ (1+1 + 1+1)))

runtime = 2 + n( 2 + 3 +(n-1)( 3 + 2 + 2))

runtime = 2 + n( 5 +(n-1)(7))

runtime = 2 + n( 5 + 7n - 7)

runtime = 2 + n(7n-2)

runtime = 2 + 7n^2 - 2n

运行时= 7n^2 - 2n + 2 = chrome.runtime.getPackageDirectoryEntry(function(package) { package.getMetadata(function(metadata) { console.log(metadata.size) }) })