时间复杂度 - 计算算法的最坏情况

时间:2013-04-29 12:35:14

标签: performance algorithm sorting complexity-theory time-complexity

我正在阅读有关时间复杂性的一些信息,我对如何实现以下时间复杂性以及是否有一套特定的规则或方法来解决这个问题感到困惑?

1)

Input: int n
for(int i = 0; i < n; i++){
   print("Hello World, ");
}
for(int j = n; j > 0; j--){
   print("Hello World");
}
  • 紧:6n + 5
  • 大O:O(n)

2)

Input: l = array of comparable items
Output: l = array of sorted items
Sort:
for(int i = 0; i < l.length; i++){
     for(int j = 0; j < l.length; j++){
         if(l{i} > l{j}){
} }
     Swap(l{i},l{j});
}
return ls;
  • 最坏情况时间复杂度:4n2 + 3n + 2 = O(n2)

3 个答案:

答案 0 :(得分:4)

在第一个例子中,数组有n个元素,你经历这些元素两次。第一次从索引0开始直到i,第二次从索引n开始到0.因此,为了简化这一点,我们可以说它花了你2n。在处理Big O表示法时,您应该记住我们关心的界限:

结果,O(2n)= O(n)             和O(an + b)= O(n)

Input: int n                        // operation 1
    for(int i = 0; i < n; i++){    // operation 2
    print("Hello World, ");       // Operation 3 
   }
for(int j = n; j > 0; j--)       // Operation 4
   {
   print("Hello World");        //Operation 5
    }             

如您所见,我们在循环外总共有5个操作。

在第一个循环中,我们执行三个内部操作:检查i是否小于n,打印“Hello World”,并递增i。

在第二个循环中,我们还有三个内部操作。

因此,我们需要的操作总数是:3n(对于第一个循环)+ 3n(第二个循环)+5(循环外的操作)。因此,所需的步骤总数为6n + 5(这是您的紧急限制)。

正如我之前提到的,O(an + b)= n,因为一旦算法是线性的,当n非常大时,a和b不会产生很大的影响。

因此,您的时间复杂度将变为:O(6n + 5)= O(n)。

你可以对第二个例子使用相同的逻辑,记住两个嵌套循环取n²而不是n。

答案 1 :(得分:3)

对于给定的算法,时间复杂度或Big O是一种提供公平估计“算法执行的总基本操作”的方法与给定输入大小n的关系。

<强> 1型

让我们说你有这样的算法:

a=n+1;
b=a*n;

上面的代码中有2个基本操作,无论你的n有多大,对于上面的代码,计算机总是执行2个操作,因为算法不依赖于输入的大小,所以上面代码的Big-O是O(1)。

<强> 2型

对于此代码:

for(int i = 0; i < n; i++){
   a=a+i;
}

我希望你理解O(n)中的Big-O,因为基本操作数直接取决于n的大小

<强>类型-3

现在这段代码怎么样了:

//Loop-1
for(int i = 0; i < n; i++){
   print("Hello World, ");
}
//Loop-2
for(int i = 0; i < n; i++){
   for(int j = 0; j < n; j++) {
       x=x+j;
   }
}

如您所见,loop-1为O(n),loop-2为O(n ^ 2)。所以感觉总复杂度应该是O(n)+ O(n ^ 2)。但 no ,上述代码的时间复杂度为O(n ^ 2)。为什么?因为我们试图了解算法针对给定输入大小n执行的基本操作的足够公平计数,这将比较容易理解由另一个人 STRONG>。通过该逻辑,O(n)+ O(n ^ 2)变为O(n ^ 2),或者O(n ^ 2)+ O(n ^ 3)+ O(n ^ 4)变为O(n ^ 4) )!

再次,你可能会问:但是怎么样? Big-O的所有较低功率如何变得如此微不足道,因为我们用更高的Big-O功能添加它,当我们将算法的复杂性描述给另一个人时,我们可以完全省略它们(较低的功率)? p>

我将尝试说明这种情况的原因:O(n)+ O(n ^ 2)= O(n ^ 2)。

让我们说n = 1000然后O(n)的确切计数是1000次操作,O(n ^ 2)的确切计数是1000 * 1000 = 1000000,所以O(n ^ 2)大于1000倍O(n),这意味着你的程序将把大部分执行时间花在O(n ^ 2)上,因此不值得一提的是你的算法也有一些O(n)。

PS。原谅我的英语:)

答案 2 :(得分:0)

我会稍微修改一下约翰的答案。定义n是一个常数运算,定义整数i并将其分配给0是2个常数运算。定义整数j并分配n是另外2个常数运算。检查 for 循环中的i,j的条件,增量,打印语句取决于n,因此总数为3n + 3n + 5,等于6n + 5。在这里,我们不能在执行过程中跳过任何一条语句,因此它的平均情况下运行时间也将是其最坏情况下的运行时间,即O(n)