确定函数的Big-O表示法

时间:2017-06-22 17:18:23

标签: c algorithm function big-o

在我的算法课程中,我们用Big O Notation讨论时间复杂度。当我尝试计算Big O时,我总是感到困惑。例如,当一个函数可以是O(n)或O(n²)时,我知道。但我不知道逻辑背景以及如何为每个函数获得此解决方案。

int func1(int n){ 
   for (int i=1; i<n; i=i*2) 
   printf("i = %d", i); return i; 
}

int func2(int a, int b) {
   int result=1; 
   while (b>0) {
      result = result*a; 
      b = b-1; 
   }
   return result;
}

void func3(int n) {
   for (int i=0; i<pow(2,n); i++) 
      printf("%d", i);  
}

1 个答案:

答案 0 :(得分:-1)

Big O表示正在谈论最坏情况,该函数运行多长时间?

如果你有Func2,b = 1,则运行六条指令。作业,比较,作业,作业,比较,回归。当b = 2时,运行9条指令。我们可以立即告诉说明指令的数量是3+(3 * n)。在谈论函数将花费多长时间时,我们忽略添加到变量中的常量,并乘以变量。因为最终,当b = 1000时,这是该函数运行多长时间的最重要因素。并且因为它相对于b线性增加,所以该函数被称为O(n)时间。 (Big O表示法总是使用&#39; n&#39;作为其变量。)

第一个函数相对于n增加甚至更慢,它以对数方式增加,只为n传递的2的每个幂增加更多的计算。 (当n = 2,4,8,16,32等时更多的计算)

(假设pow(2,n)= n平方;有时pow(2,n)= 2到n的幂) 当n = 1时,第三个函数运行循环一次,当n = 2时,第三个函数运行4次,我们可以看到我们正在讨论通过循环的n ^ 2个迭代次数。这是指数扩展,所以它是O(n ^ 2)时间。

分析Big O表示法的方法是确定基于n = 1,2,3,4 ... n运行的指令数量n使该函数成为一个函数并确定它是否为常量(不是&# 39; t基于n)改变,线性(与n成正比变化),对数(基于log(n)的变化),指数(基于n的幂的变化)或其他。 (已经有一段时间了,但是我记得一个n log n类型和一个谈论当n是一个其他指数被提升到的力量的时候,但是那些内存是模糊的。)