我在很多地方都看到合并2个n大小的排序数组的时间复杂度为O(n)。 Θ(n)在这里更准确吗?
谢谢!
答案 0 :(得分:3)
证明Θ(f(x))比证明O(f(x))困难,因此很多人都不会打扰。但是,在这种情况下,对于所有可能的输入,就地合并两个n个大小排序的列表实际上是O(n) ,而不是Θ(n)。
很明显,复制合并两个n大小的列表不能比O(n)更好,因为正在复制2 * n个元素。但是,在最佳情况下,可以在Ω(1)中实现就地合并。当第一个列表的所有元素都小于或等于第二个列表中的元素时,这是一个简单的情况。合并算法可以在O(1)中检测到这种情况,并且如果元素已经按照正确的顺序进行任何操作,则不做任何事情,因此最好使用Ω(1)。
结论:就地合并不是Θ(n),而是Ω(1)。实际上,与其他内存进行的就地合并可以是Ω(1)和O(n),但是如果没有额外的内存,则需要O(n log n)来合并两个n个大小的列表,因此显然问题不在于这种情况。
这就是为什么只说O(n)而不被就地与复制合并的细节所困扰的原因。而且,通常让程序员感到困扰的是最坏的情况,而不是最好的情况,而不是一般的情况。
在许多情况下,当人们说O(f(n))时,它们表示Θ(f(n))最坏情况下的复杂度。与复制合并一样,在最坏的情况下,就地合并也为Θ(n)。
人们通常在谈论复杂性时指所有可能的运行。如果最坏的情况是Θ(f(x)),最好的情况是Θ(g(x)),那么将O(f(x))和Ω(g(x))都紧可能的情况。
类似地,如果复制数组为Θ(n),则没有道理说它是O(2 n )。从技术上讲,这是正确的,但是使用大O表示法的情况却很少见。