【问题标题】:Time Complexity of an algorithm : How to decide which algorithm after calculated the time算法的时间复杂度:计算时间后如何决定哪个算法
【发布时间】:2012-05-11 07:02:14
【问题描述】:

今天我在 msdn 中看到博客,我注意到如何计算算法的时间复杂度。我完全理解如何计算算法的时间复杂度,但最后作者提到了以下几行

把我得到的所有东西都加起来

(N+4)+(5N+2)+(4N+2) = 10N+8

所以上述代码的渐近时间复杂度为 O(N),即 表示上述算法是线性时间复杂度算法。

那么为什么作者说它是基于线性时间复杂度算法的。博客链接

http://blogs.msdn.com/b/nmallick/archive/2010/03/30/how-to-calculate-time-complexity-for-a-given-algorithm.aspx.

【问题讨论】:

  • 如果您认为某些答案对您的问题有回应,请将其标记为正确答案。

标签: java algorithm time-complexity


【解决方案1】:

他说因为 10N + 8 是一个线性方程。如果你画出这个方程,你会得到一条直线。尝试在此网站 (function graphs) 上输入 10 * x + 8 并亲自查看。

【讨论】:

    【解决方案2】:

    时间复杂度升序(常见的)

    O(1) - Constant
    O(log n) - logarithmic
    O(n) - linear
    O(n log n) - loglinear
    O(n^2) - quadratic
    

    注意:N 无限增加

    【讨论】:

      【解决方案3】:

      对于复杂性理论,您绝对应该阅读一些背景理论。它通常是关于渐近复杂度的,这就是为什么你可以去掉较小的部分,只保留复杂度类。

      关键的想法是,一旦N 真的很大,NN+5 之间的区别就变得可以忽略不计了。

      欲了解更多详情,请从此处开始阅读:

      http://en.wikipedia.org/wiki/Big_O_notation

      【讨论】:

        【解决方案4】:

        作者只是根据自己的经验选择了最合适的。你应该知道,计算算法复杂度几乎总是意味着找到一个 Big-Oh 函数,而该函数又只是给定函数的 上限 10N+8 在你的情况下)。

        只有几种众所周知的复杂性类型:线性复杂性、二次复杂性、etc。因此,计算时间复杂度的最后一步是选择不太复杂的类型(我的意思是,linearquadratic 复杂,而 quadratic 没有 exponential 等复杂)可以用于给定的函数,它正确地描述了它的复杂性。

        在您的情况下,O(n) 和 O(n^2) 甚至 O(2^n) 确实是正确答案。但是在Big-Oh notation definition 中完全适合的不太复杂的函数是O(n),这是一个答案。

        这是一个real good article,完整解释了Big-Oh 符号

        【讨论】:

          【解决方案5】:

          一个非常务实的规则是:

          当算法的复杂度 si 用一个 poly 表示时 比如A*n^2+B*n+C 那么复杂度的顺序(也就是 O(something) )等于变量n的最高阶

          A*n^2+B*n+C poly 中,顺序为 O(n^2)。

          就像 josnidhin 解释的那样,如果 poly 有

          • 1 阶(即 n)- 称为线性
          • 2 阶(即 n^2) - 称为二次型
          • ...等等。

          【讨论】:

            猜你喜欢
            • 2011-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多