【问题标题】:What does n mean in big-oh complexity?n 在 big-o 复杂度中是什么意思?
【发布时间】:2023-03-16 16:22:01
【问题描述】:

在 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,单数时怎么解释呢?

【问题讨论】:

  • 在这种情况下,代码中实际上有一个名为 n 的变量,我可以假设它引用该变量是安全的。
  • 这里比较混乱,他们都是n。但是我认为函数内部的O(n)n是不同的东西?
  • 您发布的代码的运行时间与参数值成线性关系,而不是大小。因此,如果您在这种情况下将O(n) 解释为指输入的大小,则“This is O(n)”语句将是错误的。
  • 等等什么?为什么运行时间取决于参数的值,比如 n=3 或 n=5?它不应该取决于它的大小,即输入向量中的元素数量吗?
  • 什么输入向量?您的函数将单个整数作为其参数。运行时间取决于该值,因为迭代次数直接取决于该值。

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


【解决方案1】:

当有人说O(n) 时,n 可以根据上下文指代不同的事物。当n 所指的内容不明显时,人们最好明确指出,但存在一些约定:

  1. 当 O 表示法中使用的变量的名称也存在于代码中时,它们几乎肯定是指具有该名称的变量的值(如果它们指的是其他任何东西,则应指出明确)。因此,在您的原始示例中,您有一个名为 n 的变量,O(n) 将引用该变量。
  2. 当代码不包含名为n 的变量且nO 表示法中使用的唯一变量时,n 通常指输入的总大小。
  3. 当使用多个变量时,以n开头然后继续字母表(例如O(n*m)),n通常是指第一个参数的大小,m是第二个参数,依此类推。但是,在我看来,在实际参数名称周围使用| |len( ) 之类的东西通常更清楚(例如,如果您的参数称为l1l2,则使用O(|l1| * |l2|)O(len(l1) * len(l2)))。
  4. 在图问题的上下文中,v 通常用于表示顶点的数量,e 用于表示边的数量。

在所有其他情况下(以及在上述某些情况下,如果有任何歧义),应明确提及变量的含义。

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

在您编辑的代码中,不再有名为n 的变量。所以现在声明“这是O(n)”必须引用别的东西。通常人们会假设它指的是输入的大小(这将是m 中的位数,即log m)。但是这个声明是公然错误的(应该是O(2^n),而不是O(n)),所以原始声明明确提到了n 的值,而你通过编辑代码破坏了它。

【讨论】:

    【解决方案2】:

    n 通常表示输入数据量。

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

    在您的示例中,n 也是描述输入数据大小的值。如您所见,您的阶乘实现将需要n+1 迭代,因此此实现的渐近复杂度约为O(n)(注意:我省略了 1,因为它不会对图片产生太大影响)。如果您将传递的变量n 增加到您的函数,则需要更多的迭代来执行计算结果。

    【讨论】:

    • 什么是“输入数据量”、“输入数据大小”?它只是表示列表、矩阵或张量中元素的数量吗?
    • @user13985 是的,例如要处理的文件大小或数组中的元素数量或文本长度。
    • 我倾向于将大小视为内存大小,我想这就是我的困惑所在。也许他们应该称它为元素数量,更直接。 :(
    【解决方案3】:

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

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

    O(N^2) 表示一种算法,其性能与输入数据集大小的平方成正比。这在涉及对数据集进行嵌套迭代的算法中很常见。

    我希望这会有所帮助。

    【讨论】:

    • 我认为我们在 Big Oh 表示法中没有像 O(2n) 这样的东西。在这种情况下,我们总是删除前导常数并仅使用重要项 n。它的 O(n) 不是 O(2n)。
    猜你喜欢
    • 2023-02-08
    • 2012-01-03
    • 2010-12-26
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多