在通过渐近符号进行基础课程学习时,我遇到了一系列问题,在这些问题中,我应该找到一个函数(g(n))使得给定的函数f(n)= O(g(n ))。解决了这些问题后,我开始感到奇怪。难道不是所有的功能都大吗?给定f(n)是原始函数,它们最终将受到某些c * f(n)的约束。我一直在尝试证明这在Desmos中是不正确的,但无济于事。
我是否从根本上误解了big-O表示法?目的是否更多是为了证明某些算法的运行时间肯定比其他算法小,而不是将它们绑定到任意函数上?任何澄清都非常感谢。谢谢。
答案 0 :(得分:2)
您可以在here区域周围的所有符号上找到一些资源。
从理论上讲,是的,任何函数本身就是big-O。从数学上讲是重言式。但是据我了解,big-O通常用于将复杂的运行时间与输入大小的关系转换为大输入大小的渐近行为的简单而优雅的估计。通常,我们只保留最重要的项,而忽略其他项和常数。因为对于较大的n,只有最重要的项才突出。
例如您可以针对一个问题有两种解决方案,一种解决方案T1(n) = n^2 + 100*n + 30*log(n)
,另一种解决方案T2(n) = 10000n + 40*sqrt(n)
。使用big-O表示法,我们知道T1(n)
是O(n^2)
,而T2(n)
是O(n)
,因此对于大输入,方法2可能更理想,因为它渐近线性增长与n。
答案 1 :(得分:1)
您可以通过big-O的定义来证明这一点。当lim f(n)/f(n)
到达n
时,\infty
等于1
并且常数,我们可以说f(n) = \Theta(f(n))
,这意味着f(n) = O(f(n))
和{{ 1}}。
答案 2 :(得分:0)
我从根本上误解了big-O表示法吗?
恐怕您是因为问题“ Big-O本身是否有任何功能?” 对我来说听起来很奇怪。
更多的目的是证明某些算法确实具有 运行时间短于其他时间,而不是用任意时间限制它们 功能?
绝对。
回想一下Big-O是一种数学符号。它广泛用于简化公式的编写。例如,函数f(x)的泰勒展开式在这里我们不想写近似误差的精确公式,但仍然想知道(通过阅读公式)当x趋于x时,该误差表现为多项式函数变为无限或接近特定值。
但是在大多数情况下,我们通常对函数的时间和空间成本(从编程意义上来说)感兴趣,并且我们想比较数据集很大时两种算法的效率。
这是Big-O标记派上用场的地方:我们知道我们可以通过比较算法A和B的Big-O对应物来比较算法A和B的成本-也就是说,它们的成本复杂度以多项式,常数表示或变量n的对数函数(或其他易于比较的函数),其中n是数据集的大小(数组的大小,集合中的项数...)
答案 3 :(得分:0)
上面给出的答案很棒,但是这是一个补充,可以使此问题页面完整。我假设您已经阅读了上面答案中的链接,并且了解Big-O,Theta和Omega表示法。
我想您要问的是:是否有f(n)
这样的f(n) = O(f(n))
?
也许。但是在许多情况下,f(n) = Θ(f(n))
在哪里。当f(n) = T(f(n))
(即输入整数并输出整数的函数)与时间函数的定义方式相同时,就会发生这种情况。
斐波那契数列函数尤其如此。我开始输入证明,但会倾向于以下答案:https://stackoverflow.com/a/360773/11252937
如果链接断开,请摘录:
您将时间函数建模为将Fib(n)计算为计算Fib(n-1)的时间加上计算Fib(n-2)的时间加上将它们相加的时间(O(1)) 。假设对同一Fib(n)进行重复评估需要花费相同的时间-即不使用记忆。
T(n <= 1)= O(1)
T(n)= T(n-1)+ T(n-2)+ O(1)
您解决了这种重复关系(例如,使用生成函数),最后得到了答案。
或者,您可以绘制递归树,该递归树的深度为n,并直观地确定此函数渐近为O(2 ^ n)。然后,您可以通过归纳证明您的猜想。
基数:n = 1很明显
假设T(n-1)= O(2 ^(n-1))
T(n)= T(n-1)+ T(n-2)+ O(1)等于
T(n)= O(2 ^(n-1))+ O(2 ^(n-2))+ O(1)= O(2 ^ n)
但是,正如评论中所指出的,这并不是严格的界限。关于此函数的一个有趣的事实是,T(n)渐近地与Fib(n)的值相同,因为两者均定义为
f(n)= f(n-1)+ f(n-2)。
递归树的叶子将始终返回1。Fib(n)的值是递归树中叶子返回的所有值的总和,该值等于叶子的计数。由于每个叶子都需要O(1)进行计算,因此T(n)等于Fib(n)x O(1)。因此,该函数的紧密界是斐波那契数列本身(〜θ(1.6 ^ n))。您可以通过使用上面提到的生成函数来找出这种紧密联系。