线性时间vs.二次时间

时间:2013-08-02 18:15:15

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

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

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

对于像我这样仍然不知道的人,有人可以解释这个,这是最简单的方法吗?

4 个答案:

答案 0 :(得分:50)

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

for x in range(10):
    print x

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

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

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

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

答案 1 :(得分:28)

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

当我研究这个主题时,我学到的一件事就是用不同大小的数据集来绘制算法的运行时间。在绘制结果图表时,您会注意到线条或曲线可以分为几个增长顺序中的一个。

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

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

以下是一些典型的增长订单:

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

如果维基百科文章难以接受,我强烈建议您在iTunes大学上观看有关该主题的一些讲座,并研究算法分析,大O符号,数据结构甚至操作计数等主题。

祝你好运!

答案 2 :(得分:1)

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

使用二次解,n出现在一个术语中,其中2为最高指数,例如x*n^2 + y*n + z

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

对于mor信息,请查看Big O Notation

答案 3 :(得分:1)

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

时,您就会得到二次收敛
 x(n) <= c * x(n-1)^2

表示某些正常数c。也就是说,迭代n+1中的解决方案中的错误小于迭代n处的错误的平方。有关更一般的收敛速度定义http://en.wikipedia.org/wiki/Rate_of_convergence

的更全面介绍,请参阅此内容