书中的定义说
" Big-Oh"符号
设f(n)和g(n)是将非负整数映射到实数的函数。如果存在实常数c,则我们说f(n)是O(g(n))。 0和实常数n0≥1使得
f(n) ≤cg(n), for n ≥ n0.
我无法理解公式和定义中使用的术语,有人可以用简单的英语解释。
答案 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 seconds
。 log_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 = 3
,g(3) <= c * ln 3
(因为c * ln 3
最差搜索时间,实际搜索时间总是小于或等于此;但是我们总是可以在第一次尝试时找到它。如果n = 7
,g(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
。如果通过插入c
和n0
来解决方程式有某种方法,则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))如果存在正常数c
和n0
,
所有 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
。