什么是大Oh符号中的f(n),g(n)和实常数

时间:2013-07-31 05:11:58

标签: algorithm data-structures big-o

书中的定义说

" Big-Oh"符号

设f(n)和g(n)是将非负整数映射到实数的函数。如果存在实常数c,则我们说f(n)是O(g(n))。 0和实常数n0≥1使得

f(n) ≤cg(n), for n ≥ n0.

我无法理解公式和定义中使用的术语,有人可以用简单的英语解释。

3 个答案:

答案 0 :(得分:3)

基本上,f(n)O(g(n)),然后g(n)f(x)的最差情况成正比。

例如,二进制搜索是O(log n)(或O(ln n),它是等效的)。为什么呢?

(二元搜索的工作原理如下:取中间元素,然后与目标进行比较。如果是那个,你就完成了。如果它比目标大,那么扔掉列表的后半部分并重复上半场;如果它小于目标,则扔出前半场并在下半场重复搜索。)

因为您需要1次操作来查找长度为3个元素的列表中的内容;当7个元素长时,2个操作; 3如果它是15个元素长。因此,当任何n的元素数(2^x - 1)x时,操作数为x;转过来,你会说元素数n,操作次数是log_2 n。并且说每个操作持续2秒(比如你手动比较),最差的搜索时间是log_2 n * 2 secondslog_2 n可以重写为ln n / ln 2,因此公式变为:

worst search time(n) = (ln n / ln 2) * 2 seconds
                     = (2 seconds / ln 2) * ln n

现在,2 seconds / ln 2是一个常数;我们称之为c。我们称之为“n个元素的搜索时间”f(n)。我们将ln n称为g(n)

我们之前说过,如果n = 3g(3) <= c * ln 3(因为c * ln 3 最差搜索时间,实际搜索时间总是小于或等于此;但是我们总是可以在第一次尝试时找到它。如果n = 7g(7) <= c * ln 7;等

关于n0的一点只是一个警卫,说我们为小n计算的复杂性可能是偏差,异常,规则的例外,如果我们足够大数据(即n >= n0),规则变得明显和不可侵犯。在这种情况下,该规则从一开始就起作用,但是某些算法可能会产生额外的成本,从而导致计算小数。

答案 1 :(得分:1)

翻译成“普通英语”:想象一下f(n)是g(n)函数,它将一个正数或零作为输入,并给出一个实数作为输出(没有虚数)。

Big-Oh允许我们比较两个函数,看看一个是否受另一个函数的限制。例如,指数函数f(n)不受线性函数g(n)的限制,因此f(n)不会是O(g(n))

如果可能的话,我们可以说f(n)O(g(n))f(n) ≤ c * g(n) for n ≥ n0。如果通过插入cn0来解决方程式有某种方法,则f(n)O(g(n))

例如(与上述相同),请f(n) = 2^n, g(n) = n。以下是可解决的:2^n ≤ c * n for n ≥ n0?答案是不。无论插入c的值是什么,当n接近无穷大时,左侧将始终大于右侧。对于所有值n ≥ n0,无法使左侧小于右侧。

另一方面,如果f(n) = 2n, g(n) = n,则条件为2n ≤ c * n for n ≥ n0。这是可以解决的:c = 2, n0 = 0

答案 2 :(得分:0)

  

设f(n)和g(n)是将非负整数映射到实数的函数。

f(n) g(n)成为n即域的值为0或正整数的函数,<对于n的值,em> f(n)和 g(n)可能是实数。

  

如果存在实常数c,则f(n)为O(g(n))。 0和实常数n0≥1使得:

     

f(n)≤cg(n),n≥n0。

f(n) = O(g(n))如果存在正常数cn0, 所有 n&gt; = n0 0&lt; = f(n)&lt; = cg(n)实际上,这意味着f(n)渐近渐近大于或等于g(n)


例如,考虑 f(n) = 3 * n ^ 2 + 5 。通过选择 c = 4 n0 = 2,我们可以证明 f(n) O(n ^ 2) EM>。这是因为n的所有值都大于2

  

3 * n ^ 2 + 5 <= 4 * n ^ 2

f(n)不是 O(n),因为您选择的常数c和值n0,我总能找到值n大于n0,以便 3 * n ^ 2 + 5 大于c * n