算法分析中如何判断一个函数是否属于特定的渐近类型?
How to determine if a function is of a specific asymptotic type in algorithm analysis?
我想更好地理解渐近符号以及如何分类一个函数是否是另一个函数的O符号,以及我们如何判断f = o(g) || f != o(g)
例如:
例如,我们如何判断f = O(g)
?
我见过的主要是这种方法(下面的解决方案与上面的问题无关):
但这令人困惑,因为我不明白证明这一点的方式。
请帮助我理解这里应用的核心概念。
谢谢
如果我们能找到这两个东西,我们就说 f 是 O(g):
(1) 我们可以找到一个常量 "C" (你只选择一个 constnat ,这里我的意思是你以后不能改变它,这是初学者最困惑的部分)。
(2) 和一个 "N"(这是一些下限,意味着对于大于此 N 的值,我们的公式将有效,一旦你到达终点然后回来并尝试理解我的意思下限)。
这样,每当我们插入 n>= N 的值时,f(n) 应该小于或等于 C.g(n)
或公式形式:
示例:
假设我有一个函数f = 3n^2 + 4n + 3
还有一个函数g = n^2
f = O(g)吗?
f 的首项是 3n^2
,这意味着如果我有一个常数高于 3
并且我将它与 g
相乘,那么 f
将更少比 g
.
让我们取 n = 4 > 3
然后我得到 g = 4n^2
然后我的常量 c
是 4
.
现在的问题是如果我增加 n
的值会发生什么?例如,如果我插入 n = 4
,那么 f(n)
将不会小于 g(n)
,但是当我插入 n = 5
时,它是有效的。所以在这个例子中 c = 4 and N = 5
.
现在你的问题中有两个不同的东西。下面这个问题与大O符号无关,它被称为tilde notation
.
Big-O 舍弃常数项,但代字号不舍弃。它是算法比较的更严格的形式。这里 22
意味着每当 n 接近无穷大时,f 和 g 之间的差异大约是 22。但是我更喜欢 tilde
符号但是首先你需要理解 Big-O 然后你可以更进一步。
对于你的这个问题:
可以看到:两个函数都有高项n
,即f = 7n + ...
和g = n
。
如果我要证明是f is o(g)
现在如果我问什么值 c
c.g(n)
大于 f(n)
。
是否存在任何常量 c
使得该公式对所有 n >= some N
.
都有效
如果我现在将 g
与 7
相乘(因为 f 的前导常数为 7)这是否有效?不,因为 f 也有 8 个因子,这意味着我需要增加常量 c
。让我们把它当作 8
then still 7n + 8 > 8n
if n = 1
但是当 n >= 2
then g
总是大于 f
时会发生什么。所以对于常量 c = 8 and n >= 2
f is o(g)
。你也可以证明 g is O(f)
。
这不难,你应该得到常量c = 1 and for n belonging to natural number
自然数上的函数 f
是自然数上函数 g
的 Big-Oh,写作 f(n) = O(g(n))
,当且仅当存在常数 c > 0, n_0 > 0
这样,n >= n_0, f(n) <= c * g(n)
。为证明这一点,您必须显示有效的 c
和 n_0
值并证明它们有效。您可以证明 7*n + 8 = O(n)
因为 7*n + 8 <= 8n
对所有 n >= 8 (c = 8, n_0 = 8)
。您可以显示 n = O(7*n + 8)
因为 n <= 1 * (7*n + 8)
对应 n >= 1 (c = 1, n_0 = 1)
。
自然数上的函数 f
是自然数上函数 g
的 Little-Oh,写作 f(n) = o(g(n))
,当且仅当对于所有常量 c > 0
,存在一个 n_0
使得 f(n) < cg(n)
对应 n >= n_0
。为了证明这一点,您必须展示如何找到一个 n_0
在给定任何正值 c
的情况下都有效。您可以证明 7*n + 8 = o(n^2)
因为 7*n + 8 < c*n^2
可以重新排列为 c*n^2 - 7*n - 8 > 0
,这显然对 c
的任何正选择都有解决方案(导数是 2*c*n - 7
这是最终总是正的,所以对于足够大的 n_0
).
,函数必须是正的
我想更好地理解渐近符号以及如何分类一个函数是否是另一个函数的O符号,以及我们如何判断f = o(g) || f != o(g)
例如:
例如,我们如何判断f = O(g)
?
我见过的主要是这种方法(下面的解决方案与上面的问题无关):
但这令人困惑,因为我不明白证明这一点的方式。
请帮助我理解这里应用的核心概念。
谢谢
如果我们能找到这两个东西,我们就说 f 是 O(g):
(1) 我们可以找到一个常量 "C" (你只选择一个 constnat ,这里我的意思是你以后不能改变它,这是初学者最困惑的部分)。
(2) 和一个 "N"(这是一些下限,意味着对于大于此 N 的值,我们的公式将有效,一旦你到达终点然后回来并尝试理解我的意思下限)。
这样,每当我们插入 n>= N 的值时,f(n) 应该小于或等于 C.g(n)
或公式形式:
示例:
假设我有一个函数f = 3n^2 + 4n + 3
还有一个函数g = n^2
f = O(g)吗?
f 的首项是 3n^2
,这意味着如果我有一个常数高于 3
并且我将它与 g
相乘,那么 f
将更少比 g
.
让我们取 n = 4 > 3
然后我得到 g = 4n^2
然后我的常量 c
是 4
.
现在的问题是如果我增加 n
的值会发生什么?例如,如果我插入 n = 4
,那么 f(n)
将不会小于 g(n)
,但是当我插入 n = 5
时,它是有效的。所以在这个例子中 c = 4 and N = 5
.
现在你的问题中有两个不同的东西。下面这个问题与大O符号无关,它被称为tilde notation
.
Big-O 舍弃常数项,但代字号不舍弃。它是算法比较的更严格的形式。这里 22
意味着每当 n 接近无穷大时,f 和 g 之间的差异大约是 22。但是我更喜欢 tilde
符号但是首先你需要理解 Big-O 然后你可以更进一步。
对于你的这个问题:
可以看到:两个函数都有高项n
,即f = 7n + ...
和g = n
。
如果我要证明是f is o(g)
现在如果我问什么值 c
c.g(n)
大于 f(n)
。
是否存在任何常量 c
使得该公式对所有 n >= some N
.
如果我现在将 g
与 7
相乘(因为 f 的前导常数为 7)这是否有效?不,因为 f 也有 8 个因子,这意味着我需要增加常量 c
。让我们把它当作 8
then still 7n + 8 > 8n
if n = 1
但是当 n >= 2
then g
总是大于 f
时会发生什么。所以对于常量 c = 8 and n >= 2
f is o(g)
。你也可以证明 g is O(f)
。
这不难,你应该得到常量c = 1 and for n belonging to natural number
自然数上的函数 f
是自然数上函数 g
的 Big-Oh,写作 f(n) = O(g(n))
,当且仅当存在常数 c > 0, n_0 > 0
这样,n >= n_0, f(n) <= c * g(n)
。为证明这一点,您必须显示有效的 c
和 n_0
值并证明它们有效。您可以证明 7*n + 8 = O(n)
因为 7*n + 8 <= 8n
对所有 n >= 8 (c = 8, n_0 = 8)
。您可以显示 n = O(7*n + 8)
因为 n <= 1 * (7*n + 8)
对应 n >= 1 (c = 1, n_0 = 1)
。
自然数上的函数 f
是自然数上函数 g
的 Little-Oh,写作 f(n) = o(g(n))
,当且仅当对于所有常量 c > 0
,存在一个 n_0
使得 f(n) < cg(n)
对应 n >= n_0
。为了证明这一点,您必须展示如何找到一个 n_0
在给定任何正值 c
的情况下都有效。您可以证明 7*n + 8 = o(n^2)
因为 7*n + 8 < c*n^2
可以重新排列为 c*n^2 - 7*n - 8 > 0
,这显然对 c
的任何正选择都有解决方案(导数是 2*c*n - 7
这是最终总是正的,所以对于足够大的 n_0
).