【发布时间】:2019-04-20 17:06:53
【问题描述】:
假设我们得到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)。
正如我们所见,两种方法的渐近时间和空间复杂度完全相同。那么,我们究竟什么时候更喜欢其中一个呢?我知道对于外部排序,Priority Queue 方法更好,因为您只需要O(k) 内存空间,您可以从磁盘读取和写入每个元素。但是当我们有足够的内存时,这些方法如何相互叠加呢?
【问题讨论】:
标签: algorithm sorting merge divide-and-conquer external-sorting