此伪代码的下限运行时

时间:2014-02-03 01:56:14

标签: runtime complexity-theory time-complexity big-o

for i = 0 to n do
for j = n to 0 do
for k = 1 to j-i do
print (k)

我想知道上面代码的下限运行时。在我正在阅读的笔记中,它解释了下限运行时

enter image description here

带有解释;

为了找到运行时间的下限,考虑i的值,使得0&lt; = i&lt; = n / 4和j的值,使得3n / 4 <= j <= n 。请注意,对于i和j的n ^ 2/16个不同组合中的每一个,最内层循环执行至少n / 2次。

有人可以解释这些数字的来源吗?他们似乎对我来说是武断的。

2 个答案:

答案 0 :(得分:1)

第一个循环有n个迭代,第二个循环的迭代次数n迭代。总的来说,这是第二个循环的n^2次迭代。

现在,如果您只考虑i的可能值的较低四分之一,那么您将剩下内部循环的n^2/4次迭代。如果您还只考虑j的上四分之一值,那么您将对内循环进行n^2/16次迭代。

对于这些受约束情况的每次迭代,您都有j-i >= 3n/4-n/4 = n/2,因此对于外循环的这些n/2迭代中的每一个,最内部循环至少迭代n^2/16次。因此,最内部循环的完整迭代次数至少为n^2/16*n/2

因为我们只考虑了特定的迭代,所以迭代的实际数量更高,这个结果是一个下限。因此,算法位于Omega(n^3)

这些值是任意的,你可以使用许多其他值。但这些是一些简单的,使论证j-i >= 3n/4-n/4 = n/2成为可能。例如,如果您只采用i次迭代的下半部分和j次迭代的上半部分,那么您将获得j-i >= n/2-n/2 = 0,导致Omega(0),这是没意思。如果你采取了像十分之一和十分之一的东西它仍然可以工作,但数字不会那么好。

答案 1 :(得分:1)

我无法从您的书中解释范围,但如果您尝试通过以下方法继续,我希望能够更清楚地找到您正在寻找的内容。

外循环(索引 i )和内循环(索引 j )的理想方式如下,因为j - i >= 1应该持续,这样最内层的循环就会执行(在每种情况下都至少执行一次)。

执行分解是因为最内层循环忽略了j from i to 0的范围。

for ( i = 0 ; i < n ; i ++ ) {
    for ( j = n; j > i ; j -- ) {
        for ( k = 1;  k <= j - i ; k ++ ) {
            printf(k);
        }
    }
}

此算法的增长复杂度T(n)的顺序为:

enter image description here

因此,您的算法的迭代次数超过上述算法(j goes from n to 0)。

使用Sigma Notation,您可以这样做:

enter image description here enter image description here

其中c表示print(k)的执行成本,c'是不涉及最内层循环的发生迭代的执行成本。