我一直在观看麻省理工学院的算法课程讲座和Big O符号的定义
f(n)= O(g(n))使得某些常数c和n 0
0< f(n)< c.g(n)对于所有n> n 0
然后教练开始举一个例子,
2n个 2 = O(N 3 )
现在我得到Big O给出了函数的上限但是我很困惑函数f(n)到底对应于什么?它的意义是什么?根据我的理解,g(n)是表示我们试图分析的算法的函数,但是f(n)的目的是什么,或者如例2n 2 ?
需要对此进行一些澄清,我已经被困在这里几个小时了。
答案 0 :(得分:1)
在big-O表示法的正式定义中,函数f(n)和g(n)是其他函数的占位符,就像在二次公式中的字母a,b和c一样是二次方程中实际系数的占位符。
在您的示例中,讲师正在讨论2n 2 = O(n 3 )。你有一个正式的定义,一般来说,f(n)= O(g(n))的含义是正确的。因此,让我们对照上面的数学进行模式匹配。看起来f(n)是左边的东西,g(n)是右边的东西,所以在这个例子中f(n)= 2n 2 和g(n)= n 3
上一段只是通过一个例子给出了f(n)和g(n)是什么的表面解释,但最好还是谈谈他们真正意味着什么 。在数学上,f(n)和g(n)实际上可以是你喜欢的任何函数,但通常当你在算法分析的上下文中使用big-O表示法时,你会发现通常让f(n)是有问题的算法(或者它的运行时,或者它的空间使用,或者其他任何事情)完成的真正的工作量,并且将选择g(n)为某些" nice& #34;功能更容易推理。例如,可能的情况是,您正在分析的某个函数具有真实的运行时间,作为n的函数,如16n 3 - 2n 2 - 9n + 137.这将是你的函数f(n)。由于大O符号背后的整点是能够(数学上严格且安全地)丢弃常数因子和低阶项,我们尝试选择以与f相同的速率增长的ag(n)( n)但更容易推理 - 例如,g(n)= n 3 。所以现在我们可以通过查看是否可以在big-O表示法的正式定义中找到常量c和n 0 来尝试确定f(n)= O(g(n))
所以回顾一下:
答案 1 :(得分:0)
f(n)
是一个函数,它为您提供您要测量的事物的精确值(当时,处理器指令数,迭代步数,使用的内存量,等等)。
g(n)
是另一个近似f(n)
增长的函数。
在通常的情况下,你真的不知道f(n)或者它真的很难计算。例如,它的时间取决于处理器速度,内存访问模式,系统负载,编译器优化等。 g(n)
通常非常简单,如果f(n)= O(N)则更容易理解,如果你加倍,你将大致加倍运行时间,在最坏的情况下。因为它是一个上限g(n)
不一定是最小的,但通常人们试图避免在没有必要的情况下给它充气。在你的例子中,O(n ^ 3)是2n ^ 2的上界,但O(n ^ 2)和O(n!)也是如此。