我正在研究CLRS书籍,学习big-O分析的第一个例子涉及一个从数组A的第二个元素到最终元素(第26页)的for循环,但它归属于该行的时间成本为“n”。
我不明白为什么它不是n-1。如果我有一个大小为5的数组A(n = 5),并且我的for循环从A [1]变为A [4],那么总共有4次迭代,或者是n-1。
它实际上是n的成本,因为它需要进行一次最终检查以确保它退出for循环或其他什么?
答案 0 :(得分:1)
这是因为他们试图证明Big-O分析的全部内容 - 它是关于“大”的图片。通常的数学解释是这样的:给定足够大的n值,常数项的加法或减法对算法复杂性的分析并不重要。
简单来说,如果数组包含有关美国等国家公民的人口统计信息,则该数组的大小超过300,000,000个元素。在比较算法时,您是否会关心算法是否进行了299,999,999次计算与300,000,000次计算?
您还可以将其视为四舍五入,为简单和清晰起见,为了简化小数字而将其缩小。
答案 1 :(得分:0)
当进行Big-O表示法时,O(n)和O(n - 1)本质上是相同的。当n达到无穷大时,O(n)和O(n-1)的速度大致相同。 -1可以忽略不计。当参数接近无穷大时,大O分析通常会检查函数的复杂性。
答案 2 :(得分:0)
不要认为big-O是迭代次数的精确计数。循环的运行时间与n成正比。在您的示例中,如果您将数组中的元素数量加倍,那么运行时也将大约加倍。如果有帮助,请始终考虑如果你大幅增加n会发生什么。
答案 3 :(得分:0)
是的,处理数组n-1
个元素的for循环是O(n-1),但它也是O(n)。考虑formal definition:
f(x) = O(g(x))
当且仅当存在正实数M
且实数x0
时|f(x)| ≤ M·|g(x)|
所有x > x_0
。
很明显,如果常量M
和x0
与g(x)=x-1
一起使用,那么M
和x0
也可以与g(x)=x
一起使用。
在像O(g(x))
这样的大O符号中,通常会忽略多项式g(x)的低阶项,因为当x
变大时,领先术语总是占主导地位。更具体地说,如果第一个低阶项是负号(与g(x)=x-1
一样),我们不需要找到M
和x0
的新值。如果该术语是正号,则将M
乘以第二项的系数会得到一个M
,它与第二个术语的删除一致。这在wikipedia中有更详细的解释。
答案 4 :(得分:0)
复杂性分析用于推断计算在一般情况下的行为。它的一种方法是推理更大和更大的输入值(转向无穷大)。
让我们假设您的实际计算是某种函数 f(n)= 3n + 10
现在让另一个函数, g(n)= 5n + 15
由于 n 趋于无穷大并且您将两个函数绘制在一起,因此它们之间的比率趋于恒定。因此,其比率趋于常数的函数被认为具有相似的复杂性,并且属于相同的复杂性类。
f(n)属于 O(n)类,就像 g(n)一样。编辑:澄清。这是人们在谈论非正式场合中的复杂性时通常所说的。为了更深入地了解所有不同类型的渐近线,请查看本答案末尾的链接。
现在,另一方面,如果 g(n)= 2 ^ n ,那么它们之间的比率不趋于恒定,因此,它们不会在同一复杂性类中。
作为自己的练习,请考虑 f(n)= log_2(n)和 g(n)= log_3(n)的比率如何工作。
最后一点:大哦有更严格的定义。它被认为是上绑定。因此,如果您的函数是常量,例如 f(n)= 5 , f 仍然是 O(n)。您应该查看the whole family of asymptotic functions以获得更深入的了解。