【问题标题】:Which Big-O grows faster asymptotically哪个 Big-O 渐近增长更快
【发布时间】:2016-01-25 19:41:31
【问题描述】:

我最近陷入了一场争论/辩论,我正在努力对正确的解决方案做出明确的判断。

众所周知n! grows very quickly,但究竟有多快,足以“隐藏”所有可能添加到其中的额外常量?

假设我有这个愚蠢而简单的程序(没有特定的语言):

for i from 0 to n! do:
    ; // nothing

鉴于输入是n,那么它的复杂性显然是O(n!)(甚至是ϴ(n!),但这与这里无关) .

现在让我们假设这个程序:

for i from 0 to n do:
    for j from 0 to n do:
        for k from 0 to n! do:
            ; // nothing

Bob 声称:“这个程序的复杂性显然是 O(n)O(n)O(n!) = O(n!n^2) = O((n+2)!)。”

Alice 回应:“我同意 bob 你的观点,但实际上如果你说复杂度是 O(n!) 就足够了,因为 O(n!n^k) = O(n!) 对于任何 k >= 1 常量。"

爱丽丝在她对鲍勃分析的笔记中是否正确?

【问题讨论】:

    标签: big-o time-complexity asymptotic-complexity


    【解决方案1】:

    爱丽丝错了,鲍勃是对的。

    在使用 limit 时,回忆一下大 O 表示法的等效定义:

    f(n) is in O(g(n)) iff 
    lim_n->infinity: f(n)/g(n) < infinity
    

    对于任何k&gt;0

    lim_n->infinity: (n!*n^k) / n! = lim_n->infinity n^k = infinity
    

    因此,n!*n^k 不在O(n!)

    【讨论】:

      【解决方案2】:

      Amit 解决方案是完美的,我只会添加更多“人性化”的解决方案,因为初学者可能很难理解定义。

      定义基本上是说-如果您增加n 的值并且f(n)g(n) 方法“仅”不同k-次,其中k 是恒定的并且不会改变(例如g(n) 总是高出约 100 倍,无论是 n=10000 还是 n=1000000),那么这些函数具有相同的复杂性。

      如果g(n)n=10000 高100 倍,n=1000000 高80 倍,那么f(n) 的复杂度更高!因为随着n 的增长和增长,f(n) 最终会在某个时候到达g(n),然后与g(n) 相比,它会变得越来越多。在复杂性理论中,您感兴趣的是,它将如何以“无穷大”(或更可以想象的 n 的极高值)结束。

      如果你比较n!n!*n^2,你可以看到,对于n=10,第二个函数的值是10^2=100 的两倍。对于n=1000,它的值是1000^2=1000000 的两倍。正如您可以想象的那样,差异会越来越大。

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多