大(Big)中f(n),g(n)和真实常数是什么?
这个问题在这里已经有了答案:
基本上, f(n)
是O(g(n))
那么g(n)
与f(x)
的最坏情况成正比。
例如,二进制搜索是O(log n)
(或O(ln n)
,这相当于)。 为什么?
(二进制搜索是这样的:取中间元素,并与目标进行比较,如果是一个,则表示完成;如果大于目标,则丢弃列表的后半部分并在前半部分重复;如果它小于目标,则扔掉前半部分,并在下半部分重复搜索。)
因为您需要1次操作才能在3个元素的列表中查找某些内容; 2个操作,当它是7个元素时; 3如果它是15个元素长。 因此,对于任何x
,当元素的数目n
是(2^x - 1)
,操作的数目是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
),规则变得显而易见和不可侵犯。 在这种情况下,该规则从一开始就工作得非常多,但是一些算法可能会产生额外的成本,从而导致对小数字的计算失败。
翻译为“简单英语”:假设f(n)是以正数或零作为输入的g(n)函数,并给出实数作为输出(无虚数)。
大哦,我们可以比较两个函数,看看是否有另一个函数。 例如,指数函数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
。 以下可解:n≥n0时, 2^n ≤ c * n for n ≥ n0
? 答案是不。 无论什么值插入c
,当n
接近无穷大时,左侧将总是大于右侧。 对于所有值n ≥ n0
没有办法使左侧小于右侧。
另一方面,如果f(n) = 2n, g(n) = n
,则当2n ≤ c * n for n ≥ n0
,条件为2n ≤ c * n for n ≥ n0
。 这是可以解决的: c = 2, n0 = 0
。
令f(n)和g(n)是将非负整数映射到实数的函数。
令f(n)和G(N)是函数,其中的值n
为的那些值,即域是0或正整数,f的值(n)和G(N) n
可以是实数。
如果存在实常数c> 0且实常数n0≥1,那么我们说f(n)是O(g(n)),使得:
对于n≥n0,f(n)≤cg(n)。
如果存在正常数c
和n0
,使得对于所有n> = n 0,0 <= f(n)<= cg(n),则f(n)= O(g(n))。 实际上,这意味着f(n)
渐近地小于或等于g(n)
。
例如,考虑f(n)= 3 * n ^ 2 + 5。我们可以通过选择c = 4和n0 = 2来证明f(n)是O(n ^ 2)。这是因为对于所有的n
大于2
:
3 * n ^ 2 + 5 <= 4 * n ^ 2
f(n)不是O(n),因为无论你选择哪个常数c
和值n0
,总能找到一个大于n0
的n
值,这样3 * n ^ 2 + 5就大于c * n
。