确定算法的时间复杂度

时间:2018-03-23 11:08:51

标签: time-complexity

我刚开始学习time complexity,但我真的不明白,你能帮助那些questions并解释思考方式:

int Fun1(int n)
{
for (i = 0; i < n; i += 1) {
    for (j = 0; j < i; j += 1) {
       for (k = j; k < i; i += 1) {
        // do something
      }
    }
  }
}



void Fun2(int n){
i=o
while(i<n){
   for (j = 0; j < i; j += 1) {
      k=n
      while(k>j){
        k=k/2           
       }
      k=j
      while(k>1){
        k=k/2 
       }
     } 
   }

int Fun3(int n){
 for (i = 0; i < n; i += 1) {
   print("*")
  }
 if(n<=1){
   print("*")
   return
  }
 if (n%2 != 0){
    Fun3(n-1)     
  } 
 else{
    Fun3(n/2)
  }
 }
  1. 对于函数1,我认为它是Theta(n^3),因为它最多运行 n*n*n次,但我不确定如何证明这一点。
  2. 对于第二个我认为它是Theta (n^2log(n))
  3. 我不确定
  4. 请帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先快速说明,在Fun2(n)中,在关闭while循环之前应该有一个i++,无论如何,时间复杂度对于理解算法的效率很重要。在这种情况下,您有以下3个功能:

  1. FUN1(n)的
  2. 在这个函数中,你有三个嵌套的for循环,每个for循环在给定的输入上迭代n次,我们知道这个迭代的复杂性是O(n)。由于有三个嵌套的for循环,第二个for循环将在外部for循环的每次迭代中迭代n次。同样会做最内循环。正如你所说,由此产​​生的复杂性是O(n)* O(n)* O(n)= O(n ^ 3)

    1. FUN2(n)的
    2. 此函数有一个while循环,它在给定的输入上迭代n次。因此外环复杂度为O(n)。与之前相同,我们有一个内部for循环,在外循环的每个循环上迭代n次。到目前为止,我们有O(n)* O(n),其复杂度为O(n ^ 2)。在for循环中,我们有一个while循环,它与其他循环不同,因为它不会迭代特定范围内的每个元素,但它在每次迭代时将范围除以2。例如,从0到31,我们有0-31 - &gt; 0-15 - &gt; 0-7 - &gt; 0-3 - &gt; 0-1 如您所知,迭代次数是对数函数log(n)的结果,因此我们最终得到O(n ^ 2)* O(log(n))= O(n ^ 2(log) (n))作为时间复杂度

      1. FUN3(n)的
      2. 在这个函数中,我们有一个没有更多内部循环的for循环,但是我们有一个递归调用。我们知道for循环的复杂性是O(n),但是这个函数会被调用多少次? 如果我们采用一个小数(如6)作为例子,我们有一个6迭代的第一个循环,那么我们再次调用n = 6-1的函数,因为6 mod 2 = 0 现在我们调用Fun3(5),我们进行5次迭代,递归地我们调用Fun3(2),因为5 mod 2!= 0 我们在这有什么?我们有一个递归调用,在最坏的情况下会调用自己n次 复杂性结果是 O(n!)

        注意,当我们计算时间复杂度时,我们忽略系数因为不相关,通常我们考虑的函数,特别是在CS中,通常是: O(1),O(n),O(log(n)),O(n ^ a),a> 1。 1,O(n!)

        我们将它们组合并简化,以便了解谁拥有最佳(最低)时间复杂度,以了解可以使用哪种算法