在最坏的情况下,以下算法的运行时间是什么,假设它需要一个恒定的时间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。
这是对的吗?
答案 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)
}) })