Big O表示法 - 正式定义

时间:2010-05-02 19:50:31

标签: algorithm big-o

我正在为我的Java III课阅读一本教科书。我们正在阅读关于Big-Oh的内容,我对其正式定义感到有些困惑。

形式定义:“函数f(n)最多为g(n) - 即f(n)= O(g(n)) - 如果存在正实数c和正整数N这样,对于所有n> = N,f(n)< = cg(n)。即,当n足够大时,cg(n)是f(n)的上限。“

好的,这是有道理的。但请继续阅读......这本书给了我这个例子:

  

“在第9.14段,我们说过   使用5n + 3操作的算法   是O(n)。我们现在可以证明5n + 3 =   O(n)使用正式定义   大哦。

     

当n> = 3时,5n + 3 <= 5n + n = 6n。   因此,如果我们让f(n)= 5n + 3,则g(n)=   n,c = 6,N = 3,我们已经证明了这一点   f(n)&lt; = 6g(n),n> = 3,或5n + 3 =   上)。也就是说,如果算法   要求时间与...成正比   5n + 3,它是O(n)。“

好的,这对我来说很有意义。 他们说如果n = 3或更大,5n + 3比n小于3所花费的时间少 - 因此5n + n = 6n - 对吗?有道理,因为如果n是2 ,5n + 3 = 13而6n = 12但是当n为3或更大时,5n + 3总是小于或等于6n。

这是我感到困惑的地方。他们给了我另一个例子:

  

示例2:“让我们看一下4n ^ 2 + 50n    - 10 = O(n ^ 2)。很容易看出:4n ^ 2 + 50n-10 <= 4n ^ 2 + 50n   任何n。因为n

50n≤= 50n ^ 2      
    对于n> = 50,

= 50,4n ^ 2 + 50n-10 <= 4n ^ 2 + 50n ^ 2 = 54n ^ 2.因此,在c = 54且N = 50的情况下,我们已经示出了4n ^ 2     + 50n - 10 = O(n ^ 2)。“

  

这句话没有意义:对于n> = 50,50n&lt; = 50n ^ 2。

是不是要让50n小于50n ^ 2?不只是大于或等于50?为什么他们甚至提到50n <= 50n ^ 2?这与问题有什么关系?

此外,无论n是多少,对于n> = 50,4n ^ 2 + 50n-10≤4n^ 2 + 50n ^ 2 = 54n ^ 2都是正确的。

世界上拣选数字如何显示f(n)= O(g(n))?

5 个答案:

答案 0 :(得分:5)

请记住,当n足够大时,你正在寻找“f(n)的上限。”因此,如果对于n大于N的值,可以证明f(n)小于或等于某个c g(n),这意味着c g(n)是上限因此,f(n)和f(n)的复杂度为O(g(n))。

给出的例子旨在表明,对于任何n> 1,给定函数f(n)永远不会超过c * g(n)。 N.通过操纵初始上界使得它可以更简单地表达(如果4n ^ 2 + 50n是f(n)的上界那么则是4n ^ 2 + 50n ^ 2,其等于54n ^ 2,作为你的54 * g(n),其中c = 54和g(n)= n ^ 2),作者可以证明f(n)以c * g(n)为界,其复杂度为O(g( n))因此f(n)也是如此。

答案 1 :(得分:2)

50n <= 50n^2 for n >= 50

因为如果n是50,那么50n与n ^ 2相同,因为50 * 50等于50 ^ 2。

n^2替换为50n我们得到

n^2 <= 50n^2 for n >= 50

这很明显。

答案 2 :(得分:2)

关于挑选数字的全部内容就是:为了让它变得更容易。因为你可以为N和c选择你想要的任何数字,所以作者只选择了一些最容易看到的东西。这也是你也可以做的(写考试时等)。

因此虽然通常可以使用较小的N,但推理会变得有点困难(通常需要一些先前的分析知识 - 我们几年前都学过,x不会像x ^ 2 ......但是你想写下分析证明吗?)

保持简单,是消息:-)一开始习惯这个有点奇怪。

答案 3 :(得分:0)

对于n> = 50,他们说50n≤50n^ 2的原因可能是如果n小于1,则n ^ 2

我可以看出为什么说n> = 50的50n&lt; = 50n ^ 2可能看起来有点傻了。但它仍然是真的。该书并未说50n&lt; = 50n ^ 2仅适用于n> = 50;这将是错误的。

作为一个类比,如果我说“我所有的兄弟姐妹都说英语”,即使有很多说英语的人不是我的兄弟姐妹,也是如此。

关于证据,我们可能将其分成不同的陈述。

 (1): 4n^2 + 50n - 10 <= 4n^2 + 50n  (for all n)
 (2): 4n^2 + 50n <= 4n^2 + 50n^2 (for all n>=50)  
 (3): 4n^2 + 50n^2 = 54 n^2 (for all n, including all n>=50)
 (4): Therefore, 4n^2 + 50n - 10 <= 54n^2 for all n>=50
 (5): Therefore, for f(n)=4n^2 + 50n - 10, g(n)=n^2, N=50, and c=54, 
           the statement  f(n) <= c g(n) for all n >= N is true
 (6): Therefore, by definition 4n^2 + 50n - 10=O(n^2). 

应该清楚的是,这些陈述中的每一个都是真的,要么是单独的(1,2,3),要么是前面陈述的结果。

答案 4 :(得分:0)

正式定义:

  • f(n)= O(g(n))表示存在c> 0和n 0 使得对于任何n> = n 0 f(n)&lt; = c * g(n)
  • f(n)= o(g(n))表示任何c> 0存在n 0 ,对于任何n> = n 0 f(n)&lt; = c * g(n)

正如您所注意到的那样略有不同:)