假设我们有一个大小为n的数组,所有元素都相同。什么是O(n)?它会是线性的吗?
答案 0 :(得分:0)
这取决于算法的实现方式。
使用mergesort的标准“vanilla”实现,对数组进行排序所需的时间将始终为Θ(n log n),因为每个步骤所需的合并都需要线性时间。
但是,通过适当的优化,可以使其在时间O(n)内运行。在许多mergesort实现中,输入数组被不断修改,以便对更大和更大的范围进行排序,并且当合并步骤发生时,算法使用外部缓冲区来合并两个相邻的排序范围。在这种情况下,您可以执行一项非常好的优化:在进行合并之前,检查第一个范围的最后一个元素是否小于或等于第二个范围的第一个元素。如果是这样,两个范围合在一起已经排序,因此不需要进行合并。
假设您执行此优化并尝试对所有元素已经排序的数组进行排序。怎么了?好吧,每次调用mergesort都会触发两次递归调用。在返回之后,它可以检查已排序范围的端点,并会注意到它们已经按排序顺序排列,因此没有其他工作要做。总的来说,这会对每次调用执行O(1)工作,因此我们对算法的时间复杂度有这种递归关系:
T(n)= 2T(n / 2)+ O(1)
这解决了O(n),因此只进行了线性工作。