什么意味着大复杂性?

时间:2018-04-09 16:52:11

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

在Big-Oh表示法中,n是什么意思?我已经看到了矢量的输入大小和长度。如果是输入大小,它是否意味着计算机上的内存空间?我看到n经常与输入大小互换使用。

Big-Oh的例子,

O(n)是线性运行时间
O(logn)是对数运行时间。

代码复杂性分析示例(我正在将输入n更改为m

def factorial(m):
   product = 1
   for i in range(1, m+1):
      product = product*i
   return product

这是O(n)。 n是什么意思?它需要多少内存?也许n表示向量中的元素数量?那么,你如何解释n=3一个数字?

3 个答案:

答案 0 :(得分:1)

当有人说O(n)时,n可以根据具体情况引用不同的内容。当n引用的内容不明显时,人们理想地明确指出它,但存在几个约定:

  1. 当O-notation中使用的变量的名称也存在于代码中时,它们几乎肯定会引用具有该名称的变量的值(如果它们引用其他任何内容,则应该指出明确)。因此,在原始示例中,您有一个名为n的变量,O(n)将引用该变量。
  2. 当代码不包含名为n的变量且nO表示法中使用的唯一变量时,n通常指的是输入
  3. 当使用多个变量时,从n开始,然后继续使用字母表(例如O(n*m)),n通常是指第一个参数m的大小第二个等等。但是,在我看来,在实际参数名称周围使用| |len( )之类的内容通常比较清晰(例如O(|l1| * |l2|)O(len(l1) * len(l2))被称为l1l2)。
  4. 在图形问题的上下文中,v通常用于表示顶点的数量,e表示边数。
  5. 在所有其他情况下(以及在上述某些情况下,如果存在任何歧义),应明确提及变量的含义。

    在您的原始代码中,您有一个名为n的变量,因此语句"这是O(n)"几乎可以肯定地引用了参数n的值。如果我们进一步假设我们只计算乘法次数或循环体执行的次数(或者我们测量时间并假装乘法占用恒定时间),那么该语句是正确的。

    在您编辑的代码中,不再有名为n的变量。所以现在声明"这是O(n)"必须提到别的东西。通常,人们会假设它指的是输入的大小(这将是m中的位数,即log m)。但后来声明显然是假的(它是O(2^n),而不是O(n)),因此原始声明清楚地提到了n的价值,你通过编辑它来打破它代码。

答案 1 :(得分:0)

n通常表示输入数据量。

例如,取一个包含10个元素的数组。要迭代所有元素,您将需要十次迭代。在这种情况下,n为10。

在您的示例中,n也是描述输入数据大小的值。正如您所看到的,您的因子实现将需要n+1次迭代,因此此实现的渐近复杂性大约为O(n)(注意:我省略了1,因为它不会经常更改图片)。如果你将增加传递变量n到你的函数,它将需要更多的迭代来执行计算结果。

答案 2 :(得分:0)

O(1)描述了一种算法,无论输入数据集的大小如何,该算法总是在相同的时间(或空间)内执行。

O(N)描述了一种算法,其性能将线性增长,并与输入数据集的大小成正比。

O(N2)表示一种算法,其性能与输入数据集的大小的平方成正比。这涉及涉及数据集上的嵌套迭代的算法。

O(2N)表示一种算法,其增长率与输入数据集的每个附加值加倍。

正如yivo所说,n表示输入数据量。

我希望这会有所帮助。