Time complexity 确定算法的时间复杂度

Time complexity 确定算法的时间复杂度,time-complexity,Time Complexity,我刚刚开始学习时间复杂性,但我不太明白,你能帮我解答这些问题并解释一下思考方式吗: 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){

我刚刚开始学习时间复杂性,但我不太明白,你能帮我解答这些问题并解释一下思考方式吗:

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,我认为它是θ^3,因为它最多只能运行 n*n*n次,但我不知道如何证明这一点。 第二,我认为是θn^2logn 我不确定
请您帮忙好吗?

首先请注意,在Fun2n中,在关闭while循环之前应该有一个i++程序,无论如何,时间复杂度对于理解算法的效率很重要。在这种情况下,您有以下3个功能:

Fun1n 在这个函数中,有三个嵌套的for循环,每个for循环在给定的输入上迭代n次,我们知道这个迭代的复杂性是开的。由于有三个嵌套for循环,第二个for循环将在外部for循环的每次迭代中迭代n次。这同样适用于大多数内部循环。正如您正确地说的,由此产生的复杂性是On*On*On=On^3

Fun2n 此函数有一个while循环,在给定输入上迭代n次。因此,外部循环的复杂性是开启的。和前面一样,我们有一个内部for循环,在外部循环的每个循环上迭代n次。到目前为止,我们已经在*上了,它的复杂性在^2上。在for循环中,我们有一个while循环,它不同于其他循环,因为它不在特定范围内的每个元素上迭代,而是在每次迭代时将范围除以2。例如,从0到31,我们有0-31->0-15->0-7->0-3->0-1 正如您所知,迭代次数是对数函数logn的结果,因此我们以On^2*Ologn=On^2logn作为时间复杂度

Fun3n 在这个函数中,我们有一个for循环,没有更多的内部循环,但是我们有一个递归调用。我们知道for循环的复杂性是开的,但是这个函数会被调用多少次呢? 如果我们以像6这样的小数字为例,我们有一个6次迭代的第一个循环,然后我们再次调用n=6-1的函数,因为6 mod 2=0 现在我们调用了Fun35,我们进行了5次迭代,从5 mod 2开始递归调用Fun32!=0 我们在这里吃什么?我们有一个递归调用,在最坏的情况下会调用它自己n次 复杂性结果已启用

注意,当我们计算时间复杂度时,我们忽略系数,因为这是不相关的,通常我们考虑的函数,特别是在CS中,是: O1,On,Ologn,On^a,a>1,On

我们将它们结合起来并加以简化,以便知道谁的时间复杂度最好,谁的时间复杂度最低,从而知道可以使用哪种算法