确定功能的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);
}
大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是一些其他的指数,乘方,但记忆是朦胧的那些。)
虽然我非常同意你应该直接问你的教授这个问题。我所能做的只是引用一个教训,但他们可以引导你通过它并找出你在哪里绊倒。 –
非常感谢你的回答我将会理解它。你写了_如果你有Func1,n = 1,则运行6条指令。赋值,比较,Printf,赋值,比较,返回。当n = 2时,运行9条指令。我们可以告诉立刻意识到的指令数3+(3 * N)._这意味着我必须了解功能**逐行**确定大O? – flowers1234
本质上,是的。您可以将它缩短一点,并查看函数中的任何重复。寻找循环机制(for,同时)或函数调用(递归,如果它自称...)当开始了,它有助于只列出了许多行会究竟是如何执行的,虽然。 –
你标记这个问题为Python中,但你的代码看起来是C-ish? –
对于您的教授或TA *,这听起来像一个问题*。 –
我很抱歉是我的错@ChristianDean,谢谢你的帮助。 – flowers1234