【问题标题】:Asymptotic Growths of Functions函数的渐近增长
【发布时间】:2010-09-24 19:30:06
【问题描述】:

如何确定给定的 f(n) 和 g(n) 是在 theta、omega、big oh、little omega 还是 little oh 中? - 我认为一种方法是绘制函数 f(n) 和 g(n) 的图形。即使通过绘制图表,我们如何判断 f(n) 何时处于 theta、omega、big oh、little omega 或 little oh 中?我不清楚。有人可以提供更多细节吗?

我也不确定这是否是正确的方法。谁能告诉我是否有其他更简单的方法可以做到这一点。 举例:f(n) = sq root(n) and g(n) = n^sin n

【问题讨论】:

    标签: algorithm computer-science complexity-theory


    【解决方案1】:

    你不能通过观察来确定渐近增长。每种类型的渐近增长关系都有正式的定义,可以准确准确地解释它们的含义。您可以通过数学方式确定两个函数是否满足关系的正式定义来确定它们是否适合给定关系。

    例如,Big-O 的几个等效形式定义之一如下:

    f = O(g) 当且仅当 lim [ n -> inf ] ( f(n) / g(n) )

    因此,例如,如果 f(n) = n 且 g(n) = n^2,您可以观察到极限为 n -> n/n^2 = 0 的无穷大,因此 f = O(g)。

    或者,如果 f(n) = n 和 g(n) = 2n,你可以观察到 n-> inf,n / 2n -> 1/2

    但是,如果 f(n) = n 和 g(n) = sqrt(n),你可以观察到极限为 n -> n 的无穷大 / sqrt(n) = 无穷大,所以 f != O( g)。

    您的示例 f 和 g 很棘手,因为随着 n 的增加,正弦会在 -1 和 1 之间振荡。但是 Wolfram Alpha 告诉我有问题的极限是无穷大,所以 sqrt(n) != O(n^(sin(n))。

    每个其他渐近增长关系都有一个类似的正式定义,您可以测试两个函数是否相互满足。

    编辑:

    您似乎在寻找经验法则。这是确定相对简单函数 f 和 g 的渐近顺序的一种快速简便的方法。考虑每个函数中 n 的最高幂:

    • 如果最高功率相同,则 f = O(g), g = O(f), f = Omega(g), g = Omega(f), f = Theta(g), g = Theta (f)
    • 如果 f 的最高功率小于 g 的最高功率,则 f = O(g), f = o(g), g = Omega(f), g = omega(f)
    • 如果 f 的最高幂大于 g 的最高幂,则 f = Omega(g), f = omega(g), g = O(f), g = o(f)

    当然,如果函数不是 n 中的多项式,或者更复杂并且不容易确定最高幂是多少(例如,您使用正弦的示例),您仍然必须恢复到正式定义。

    有些事情总是正确的:

    • Theta 根据定义是 O 和 Omega 的结合。 f = O(g) ^ f = Omega(g) f = Theta(g) [其中 ^ 表示逻辑“与”]
    • “小”关系比“大”关系。这意味着 f = o(g) => f = O(g) 和 f = omega(g) => f = Omega(g),但相反的方向是不正确的。

    【讨论】:

    • 我已经了解了所有 5 个渐近 fns 的正式定义,并且我完全理解了您上面描述的更简单的函数,f(n)=n, g(n)=n^2。但我不明白的是复杂的功能,比如说 1) f(n) = 5(n+1)^4 - n^2 g(n) = (n+5)^4 + (n+10)^2 2) n(logn^2) , (n^2)log n 3) 1/sq 根(n), 1/logn 4)(3^n+4)(n-17 * (n/17))+ 6 , 3^(n+3)
    • 第一个例子很简单,可以使用我给出的经验法则。 f(n)的最高幂是4,g(n)的最高幂也是4,所以f是O(g)、Omega(g)和Theta(g)。在第二个和第三个示例中,所涉及的最高功率并不明显,因此您必须取两个函数的比率并计算它们的极限。停止与不可避免的事情作斗争:如果你想计算更复杂函数的渐近增长关系,你必须计算极限。没有办法解决它。如果您不知道如何计算限制,请查找微积分文本。
    • 如果我把上面的 1) 推到这个 1) f(n) = 5(n+1)^4.1 - n^2 g(n) = (n+5)^4 + (n+10)^2 和 4))(3^n+4)(n-17 * floor(n/17))+6 , 3^(n+3) 显然是指数函数。 f(n) 也是 n+4 次方,g(n) 是 n+3 次方,所以我认为我们可以说,对于任何 n 值,f(n) 的增长速度都快于 g(n)。因此 f(n)= wg(n) 和 Omega(g(n))。你同意吗?
    【解决方案2】:

    这是在给定 f(n) 和 g(n) 的情况下使用限制计算 Big-O 的方法。

    在同一组轴上绘制 f(x) 和 g(x) 的较大 x 值的函数应该有助于您立即识别渐近行为。

    【讨论】:

    • 我认为您在这里指的是 L 医院规则。我认为对于 Big -O ,他们提到的条件是 lim x-> infinity f(x)/ g(x) = 0
    • 这就是little o的定义。 Big-O 只要求限制是有限的——它可以大于零。
    • 但是如果我想避免那些数学计算,并且我更喜欢绘制图形,我可以为所有 5 个渐近符号(theta、big o、omega、little o 和 little omega)做这件事吗?如果是,我如何从图中计算出来。我假设如果我的 f(n) 高于 g(n),那么它应该是 omega 和 little omega。类似地,如果 f(n) 低于 g(n),那么它是大 oh 和小 o。那是对的吗?不过,我不确定 theta。
    【解决方案3】:

    首先,您需要了解所调用函数的复杂性。这可能会记录在案,但在可能的情况下,您必须查看这些函数的来源。

    在简单的情况下,您可以计算嵌套循环以了解事情需要多长时间。如果您在从 1 到 t 的循环中有一个从 1 到 n 的循环,并且内部调用的唯一函数需要恒定时间(或者您只是在内部进行算术运算),那就是 Theta(nt)。如果你碰巧知道 t 2)。

    在更复杂的情况下,您可能需要使用Master Theorem 等。在某些情况下,确定复杂性可能非常困难(研究级别)!

    【讨论】:

    • 这就是被问到的。
    • @svick:不,我的意思是如果你的函数 f() 调用 f1() 和 f2(),你需要知道或确定 f1() 和 f2() 的复杂性。在你的第二段中,我非常简要地描述了确定复杂性的基础知识——对于一个如此广泛的问题,这就是我所能做的。
    • 我实际上在这里只使用函数。我知道从循环中做事,但我的问题是从函数计算渐近符号。比如说。 f(n) = 5(n+1)^4 - n^2 g(n) = (n+5)^4 + (n+10)^2。对于如此复杂的函数,我们怎么能说它在 theta、big oh、omega、little o、little omega 中。
    • 对于单词大小的输入,它们都是 O(1)。对于多精度输入(数字可能会变得任意大),这取决于您用于加法和供电的算法。如果您使用标准的“教科书”方法,则将 n 和 m(其中 n 和 m 是正整数)相乘需要 Theta(log m * log n),相加需要 Theta(log m + log n)。 (对于平方和加倍,Theta(log^2 n) 和 Theta(log n)。)因此,在这种情况下,您的示例将是 Theta(log^2 n)。如果您使用更高级的算法,则对于大型输入可能会更快。
    • @Charles:他说的不是计算这些函数的复杂性,而是函数本身的复杂性。
    【解决方案4】:

    绘制函数图在理论上是不够的。 (虽然绘制一个图表然后根据它进行推理。另外,实际上,如果你绘制足够大的值应该就足够了)

    正确的方法是构造证明:

    如果存在正的Kn0,则函数f(n)O(g(n)),这样对于每个n > n0f(n) < K × g(x)

    假设f(n) = sqrt(n)g(n) = n^sin n 以及一些Kn0 是这样。 现在考虑一个数字n1

    1. 大于这个n0
    2. 大于1
    3. 大于
    4. 等式 g(n1) = 1 成立

    满足这些条件的数字有无穷多个:g(n1) = 1sin n1 = 0,即n1 = a × π 对任何整数a。将它们限制为n1 > max(n0, 1, K²) 仍然会留下无限多的可能性,所以我们选择一个。

    所以我们得到了g(n1) = 1f(n1) 的值是多少?那是sqrt(n1),大于K(因为n1 > K²)。

    我们把它放在一起:K < f(n1) < K × g(n1) = K,换句话说K < K,这不可能是真的,这意味着最初的假设是错误的,所以f(n) != O(g(n))

    【讨论】:

    • 对于大哦,条件应该是 f(n)
    • 不管是< 还是<=。而且它必须申请所有 n > n0,而不是一个,所以你的证明是错误的。
    • 好的,我明白你在说什么。但是我不认为我清楚地理解你上面提到的 f(n)!=O(g(n)) 的证明解释。您能否详细说明为什么 f(n)!=O(g(n)) 的证明?
    • 对不起,证明有错误:我忘记说明K。我也试图让它更清楚。现在好点了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多