我正坐在这里,在一个关于大量数据集算法的课程中使用Little-Oh表示法让我感到困惑,尽管我对Big-Oh非常有信心。
我不想要一个解决方案,因此我不会提出它。相反,我的问题是我如何解释时间复杂度 o(log n)?
我从定义中知道,算法A必须渐渐渐渐慢于o(log n),但我不确定这是否意味着算法必须在恒定时间运行或者是否仍然允许在某些条件下 log n ,例如c = 1或者是否真的 log(n-1)。
假设算法的运行时间为 O(log n),但实际上是两次迭代,因此c = 2,但 2 * log n 仍然是 O(log n),当我说这不适合Little-Oh时我是对的吗?
非常感谢任何帮助,如果需要澄清,我将提供作业
答案 0 :(得分:3)
说f
是'小小的'g'f = o(g)
,意味着商
|f(x)/g(x)|
当x
接近无穷大时,接近0。参考您的o(log n)
示例,该类包含log x / log (log x)
,sqrt(log x)
等函数,因此o(log x)
绝对不会暗示O(1)
。另一方面,log (x/2) = log x - log 2
,所以
log (x/2) / log x = 1 - log 2 / log x -> 1
且log (x/2)
不在班级o(log x)
中。
答案 1 :(得分:-1)
对于Little-Oh,对于所有x,f(x)不必小于g(x)。它必须在x的某个值之后变小。 (对于您的问题,在某些条件下仍允许记录。)
例如:
let f(x) = 5000x and g(x) = x^2
当p接近无穷大时,f(x)/ g(x)为0,因此f(x)为g(x)的litte-o。然而,在x = 1时,f(x)大于g(x)。只有在x大于5000之后,g(x)才会大于f(x)。
真正告诉我们的是,g(x)总是以比f(x)更快的速度增长。例如,看看在x = 1和x = 2之间增长了多少f(x):
f(1) = 5000
f(2) = 10000 - f(x) became twice as big
现在看一下同一区间的g(x):
g(1) = 1
g(2) = 4 - g(x) became four times bigger
在较大的x值下,此速率会增加更多。现在,由于g(x)以更快的速率增加,并且因为我们将x带到无穷大,在某些时候它将变得大于f(x)。但这不是小o关注的问题,而是改变的速度。