【问题标题】:Which algorithmic function is faster in its growth ,O(n^2) or O(n^2*log(n)) and why?哪个算法函数的增长更快,O(n^2) 或 O(n^2*log(n)),为什么?
【发布时间】:2020-07-07 11:28:31
【问题描述】:

我将 n 的随机值 1、2、4、8、16、32 和 64 应用于函数 (n^2) 和 ((n^2)*log(n))。n 的值^2 高于 ((n^2)*log(n)) 的值,但在某些时候 ((n^2)*log(n)) 的值超过了 (n^2) 的值。数值表是:

      n     n^2       (n^2 *log(n))
      1     1          0
      2     4          1.2
      4     16         9.6
      8     64         57.79
      16    256        308.25
      32    1156       1541.27
      64    4096       7398.11

从上表中,可以得出哪个算法函数的增长速度更快的结论,为什么?

【问题讨论】:

  • А 愚蠢的例子:看看n10 + log n。对于 n ≤ 11,n < 10 + log n。不过,从 n→infinity 来看,n 的速度要快得多。
  • 对于那些 log(n)
  • 我理解你的论点,即 10+log(n) 比 n 快。在这种情况下,log n 乘以 n^2,并将其值与 n^2 进行比较。您注意到的是 n^2 的值在某些时候被 (n^2)*log n 的值超过。但是,n^2 的值连续高于 ((n^2)*log(n)) 并不一致。什么时候会选择比另一个增长更快的算法函数?
  • @tobias_k 我使用以 2 为底的对数
  • 不,一定要以 10 为基数。

标签: algorithm function calculus


【解决方案1】:

复杂性分析通常关注渐近行为,因为我们通常只在进行大型计算时才关心性能(小问题规模的低效计算不是典型的研究对象)。

鉴于此,小输入的行为通常被忽略,我们说一个函数从上面渐近约束 (f = O(g)),这意味着如果最终总是如此,f 的增长速度不会快于 g。

显然,n^2 log(n) 最终总是大于 n^2,因为 log(n) 最终假定任何对数底的值都大于 1,之后 n^2 log(n) 总是大于比n^2。确实,对于小于对数底的值,它的值更小,但这样的输入大小永远不会是少数。

【讨论】:

    【解决方案2】:

    如果log是以10为底的对数,那么log(10)=1,即n^2*log(n)>n^2代表n>10。这也适用于所有其他对数底数,即 n^2*log(n,b)>n^2 代表 n>b 如果 log(n,b)n 与底数 b 的对数。

    【讨论】:

      【解决方案3】:

      对于一些小的值,n^2n^2*logn 快的原因是 logb(n) for all n 。您似乎在使用 log10,因此该点位于 816 之间。

        n  n^2  logn  n^2*logn
      ------------------------
        1    1  0.00     0.00
        2    4  0.30     1.20
        4   16  0.60     9.63
        8   64  0.90    57.80  ^^^ logn < 1
       16  256  1.20   308.25  vvv logn > 1
       32 1024  1.51  1541.27
       64 4096  1.81  7398.11
      

      之后,logn 大于 1 并继续增长(尽管越来越慢),这意味着对于所有更高的值,n^2*lognn^2 更大且增长更快。对于 n 的一些小值来说它更小是无关紧要的,就像对于一些小输入来说,具有恒定复杂度的函数可能比指数函数慢。

      【讨论】:

        【解决方案4】:

        我们想知道的是:log(n) 会大于 1 吗?

        如果我们比较O(n²)O(n² log(n)),我们需要知道log(n) 是大于还是小于1。正如你所说,我正在考虑log(n) 作为底数2。

        log(n) > 1   
        n > 2^1
        n > 2
        

        n &gt; 2log(n) &gt; 1之后,表示O(n²) &lt; O(n² log(n))代表所有n &gt; 2

        【讨论】:

          【解决方案5】:

          你可以通过限制这两个来展示它:

          lim_{n \to \infty} n^2 / (n^2 * log(n)) = lim_{n \to \infty} 1 / log(n) = 0
          

          最后一步是因为log 函数是严格递增函数。因此,基于限制结果, 这意味着n^2 = o(n^2 * log(n))(小哦),n^2*log(n) 的增长速度比n^2 快。

          【讨论】:

            猜你喜欢
            • 2014-06-13
            • 2021-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-04
            • 1970-01-01
            • 1970-01-01
            • 2012-05-09
            相关资源
            最近更新 更多