我明白如何使用大O的定义来证明f(n)是O(n)或O(n^2),但对于O(2^n)我感到困惑。你能帮我证明2^n + n^3 + 30是O(2^n)吗?大一AI专业,我喜欢所有内容,但复杂度让我头疼!
回答:
我不会为你解决这个问题,因为这听起来像是作业。但我会解决一个你已经知道如何解决的问题,然后试图说服你,这个问题并没有什么不同。
所以,回忆一下,当我们试图证明某个函数,称之为f(n),属于另一个函数的Big-Oh,称之为g(n)时,我们在做什么。我们试图证明,在某个常数因子的范围内,并且当n变大时,f(n)永远不会比g(n)差。我们通过选择两个数字,c和n0来做到这一点。第一个,c,就是我之前提到的那个“常数因子”。我们将f(n)和g(n)按如下方式关联:
f(n) ≤ c g(n),对所有n ≥ n0成立
重要的是,c和n0并不是唯一的。通常,你可以几乎任意选择一个,然后通过简单的代数计算出另一个的值。所以我们用下面的函数来尝试:
f(n) = n² + 5n + 10
g(n) = n²
首先我们根据我们的常数因子c设置关系:
n² + 5n + 10 ≤ c n²
现在我们想让c单独出来,与n的某个其他函数相关,所以只需将n²从两边除掉:
1 + 5/n + 10/n² ≤ c
我们想知道什么值的n(我们称之为n0)使得这个对于所有更大的n值都成立。嗯,我们可以选择一个c并求解n,或者选择一个n0并求解c。这并不重要,但我们选择n0 = 1,只需在看到n的地方都替换成1,看看会发生什么:
1 + 5/1 + 10/1 = 1 + 5 + 10 = 16 ≤ c
这就是我们的答案:如果我们选择c为16,那么每当n大于1时(即,n0 = 1),f(n)将小于g(n)。
那么,你能用你试图解决的问题来做这个吗?嗯……为什么不能呢?我们有两个函数,f(n)和g(n)。我们试图证明与你知道如何解决的问题完全相同的关系。唯一改变的是函数的类型,从n的多项式变为n的指数函数(和一个混合的)。但这重要吗?嗯,代数看起来会有点不同,但那又怎样?它还是代数。