【问题标题】:Linear time v.s. Quadratic time线性时间与二次时间
【发布时间】:2013-08-02 18:15:15
【问题描述】:

通常,一些答案提到给定解决方案是线性,或者另一个解决方案是二次

如何区分/识别什么是什么?

谁能为像我这样仍然不知道的人解释一下这个最简单的方法?

【问题讨论】:

    标签: python big-o complexity-theory time-complexity


    【解决方案1】:

    一个方法是线性的,当它所花费的时间随着所涉及的元素数量线性增加。例如,打印数组元素的 for 循环大致是线性的:

    for x in range(10):
        print x
    

    因为如果我们打印 range(100) 而不是 range(10),运行它所需的时间会长 10 倍。你会经常看到写成 O(N),这意味着运行算法的时间或计算量与 N 成正比。

    现在,假设我们要打印两个 for 循环的元素:

    for x in range(10):
        for y in range(10):
            print x, y
    

    对于每个 x,我循环 10 次 y。出于这个原因,整个事情要经过 10x10=100 次打印(您只需运行代码即可看到它们)。如果我不使用 10,而是使用 100,那么现在该方法将执行 100x100=10000。换句话说,该方法采用 O(N*N) 或 O(N²),因为每次增加元素数量时,计算工作量或时间都会随着点数的平方而增加。

    【讨论】:

    • 我之所以感谢这个答案只是因为我要求一种简单的方法来解释这一点。但绝对所有的答案都非常好而且详尽。
    • 您应该考虑将示例更改为:"for x in range(n)" as for x in range(10) 是常数时间,不是线性的。
    • 感谢您提供解释。搞定了。总而言之,O(n) 将花费线性时间来完成,O(n^2) 将花费二次时间来执行某些功能。
    • 你能告诉我哪个更快二次或线性?
    • 小心将 Big-O 和速度混为一谈,@mkturner。 Big-O 是关于当你增加 N 时事物如何扩展,而不是关于任何特定 N 的速度。例如,对于 N=1000,二次算法完全有可能比线性算法快得多。但是,如果你增加 N,你知道在某个时候这会逆转,而线性将占上风。用户是否愿意增加足够的 N,取决于特定的用例。
    【解决方案2】:

    它们一定是指运行时复杂性,也称为大 O 表示法。这是一个非常大的话题。我将从维基百科上的文章开始:https://en.wikipedia.org/wiki/Big_O_notation

    当我研究这个主题时,我学会做的一件事是用不同大小的数据集绘制我的算法的运行时间。当您绘制结果时,您会注意到直线或曲线可以归类为几个增长顺序之一。

    了解如何对算法的运行时复杂性进行分类将为您提供一个框架,以了解您的算法将如何根据时间或内存进行扩展。它将使您能够对算法进行松散的比较和分类。

    我不是专家,但这帮助我从兔子洞开始。

    以下是一些典型的增长顺序:

    • O(1) - 恒定时间
    • O(log n) - 对数
    • O(n) - 线性时间
    • O(n^2) - 二次
    • O(2^n) - 指数
    • O(n!) - 阶乘

    如果维基百科的文章难以下咽,我强烈建议在 iTunes 大学观看一些关于该主题的讲座,并研究算法分析、大 O 表示法、数据结构甚至运算计数等主题。

    祝你好运!

    【讨论】:

      【解决方案3】:

      您通常会根据输入大小n(如果输入是数组或列表)来争论算法。问题的线性解决方案是执行时间与n 成线性关系的算法,因此x*n + y,其中xy 是实数。 n 以最高指数 1 出现:n = n^1

      对于二次解,n 出现在以 2 为最高指数的项中,例如x*n^2 + y*n + z.

      对于任意n,线性解的执行时间增长比二次解慢得多。

      有关更多信息,请查找Big O Notation

      【讨论】:

        【解决方案4】:

        您没有指定,但当您提到 解决方案时,您可能会询问二次和线性收敛。为此,如果您有一个迭代算法并生成一个收敛值的近似序列,那么当您可以证明时,您就有二次收敛

         x(n) <= c * x(n-1)^2
        

        对于一些正常数c。也就是说,迭代n+1时解的误差小于迭代n时误差的平方。有关更一般的收敛速度定义的更全面介绍,请参阅此内容http://en.wikipedia.org/wiki/Rate_of_convergence

        【讨论】:

          猜你喜欢
          • 2018-03-15
          • 1970-01-01
          • 1970-01-01
          • 2019-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-01
          • 1970-01-01
          相关资源
          最近更新 更多