[英]Is it O(n^2) or O(1)?
这个问题有很多有趣的讨论,使我想知道我们是否对算法设置一些阈值,这会改变Big-O运行时间的复杂性吗? 例如:
void someAlgorithm(n) {
if (n < SOME_THRESHOLD) {
// do O(n^2) algorithm
}
}
是O(n 2 )还是O(1)。
这将是O(1)
,因为有一个常数,因此无论输入多大,您的算法都会在小于该常数的时间内完成。
从技术上讲,它也是O(n^2)
,因为存在一个常数c
,无论您输入的内容多大,您的算法都将在c * n ^ 2
时间单位内完成。 由于big-O为您提供了上限,所以O(1)
内容也都是O(n^2)
如果SOME_THRESHOLD
是常数,则您已对函数的增长进行了硬编码f(x) = O (g(x))
( f(x) = O (g(x))
给出了g(x)
在f(x)
)。
按照惯例,某些常数k
O(k)
只是O(1)
因为我们不在乎常数因子。
请注意,至少从理论上讲,下界是未知的,因为我们对O(n^2)
函数的下界一无所知。 我们知道对于f(x) = Omega(h(x))
, h(x) <= 1
因为f(x) = O(1)
。 尽管实际上h(x) = 1
,所以f(x) = Omega(1)
,但理论上少于恒定时间的函数是可能的。
这意味着通过在函数上施加一个恒定的上限,该函数现在具有一个严格的边界: f(x) = Theta(1)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.