在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
一个数字?
答案 0 :(得分:1)
当有人说O(n)
时,n
可以根据具体情况引用不同的内容。当n
引用的内容不明显时,人们理想地明确指出它,但存在几个约定:
n
的变量,O(n)
将引用该变量。n
的变量且n
是O
表示法中使用的唯一变量时,n
通常指的是输入n
开始,然后继续使用字母表(例如O(n*m)
),n
通常是指第一个参数m
的大小第二个等等。但是,在我看来,在实际参数名称周围使用| |
或len( )
之类的内容通常比较清晰(例如O(|l1| * |l2|)
或O(len(l1) * len(l2))
被称为l1
和l2
)。v
通常用于表示顶点的数量,e
表示边数。在所有其他情况下(以及在上述某些情况下,如果存在任何歧义),应明确提及变量的含义。
在您的原始代码中,您有一个名为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表示输入数据量。
我希望这会有所帮助。