确定功能的Big-O符号

问题描述:

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

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); 
} 
+4

你标记这个问题为Python中,但你的代码看起来是C-ish? –

+2

对于您的教授或TA *,这听起来像一个问题*。 –

+0

我很抱歉是我的错@ChristianDean,谢谢你的帮助。 – flowers1234

大O符号在谈论最坏的情况下,多长时间可以把功能运行?

如果您有Func2,b = 1,则运行六条指令。作业,比较,作业,作业,比较,返回。当b = 2时,运行9条指令。我们可以立即知道指令的数量是3+(3 * n)。当谈到函数需要多长时间时,我们忽略添加到变量中的常量,并乘以我们的变量。因为最终,当b = 1000时,这是功能运行需要多长时间的首要因素。并且因为它相对于b线性增加,所以函数被称为O(n)时间。 (大O符号总是使用'​​n'作为其变量。)

第一个函数相对于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)时间。

对大O符号进行分析的方法是根据n = 1,2,3,4 ... n确定运行了多少条指令n做一个函数并确定它是否为常量(不会更改) n),线性(与n成正比的变化),对数(基于log(n)的变化),指数(基于n的幂的变化)或其他。 (它已经有一段时间,但我记得一个的n log n型和一个谈论当n是一些其他的指数,乘方,但记忆是朦胧的那些。)

+0

虽然我非常同意你应该直接问你的教授这个问题。我所能做的只是引用一个教训,但他们可以引导你通过它并找出你在哪里绊倒。 –

+0

非常感谢你的回答我将会理解它。你写了_如果你有Func1,n = 1,则运行6条指令。赋值,比较,Printf,赋值,比较,返回。当n = 2时,运行9条指令。我们可以告诉立刻意识到的指令数3+(3 * N)._这意味着我必须了解功能**逐行**确定大O? – flowers1234

+0

本质上,是的。您可以将它缩短一点,并查看函数中的任何重复。寻找循环机制(for,同时)或函数调用(递归,如果它自称...)当开始了,它有助于只列出了许多行会究竟是如何执行的,虽然。 –