假设我们有k
排序数组(每个大小n
),在这种情况下使用优先级堆比传统合并(类似于合并排序中使用的)更好,反之亦然?
优先队列方法:在这种方法中,我们有一个最小堆大小k
(最初,每个数组的第一个元素被添加到堆中)。我们现在删除 min 元素(从输入数组之一),将其放入最终数组并从同一个输入数组中插入一个新元素。这种方法需要O(kn log k)
时间和O(kn)
空间。注意:它占用O(kn)
空间,因为这是最终数组的大小,并且在计算渐近空间复杂度时,它决定了堆的大小。
传统合并:在这种方法中,我们合并前 2 个数组以获得大小为的排序数组2n
。我们对所有输入数组重复此操作,并且在第一遍之后,我们获得k/2
每个大小为的排序数组2n
。我们重复这个过程,直到我们得到最终的数组。每次比较都有一个时间复杂度,O(kn)
因为每次比较后都会将一个元素添加到相应的输出数组中。我们有 log k 通行证。因此,总时间复杂度为O(kn log k)
。而且由于我们可以在每次传递后删除输入数组,因此在任何时候使用的空间都是O(kn)
.
正如我们所见,两种方法的渐近时间和空间复杂度完全相同。那么,我们究竟什么时候更喜欢其中一个呢?我知道对于外部排序,优先队列方法更好,因为您只需要O(k)
内存空间,并且您可以从磁盘读取和写入每个元素。但是当我们有足够的内存时,这些方法如何相互叠加呢?