假设您有一台特殊的高性能计算机。在这台电脑上 有一个专用的k个优化寄存器组,其中k>2。这些寄存器中的每一个都可用于存储一个键值对,因此,这组寄存器最多可存储k个键值对。该寄存器组可以在O(1)时间内支持以下操作:
设计一种算法,可以利用这组寄存器在O(n lg n / lg k)的时间内对n个数字进行排序。
这是问题。我通过使用分而治之的想法做到了。我认为它类似于mergesort。但是,我只能得到一个O(n lg n / k)的算法。在大多数情况下,O(n lg n / k k)比O(n lg n / lg k)慢,所以我想知道如何考虑这个问题。谢谢。
答案 0 :(得分:2)
通常,使用这样的算法将K个排序的列表与总共N个元素合并将花费O(N log K)时间,该算法将输入列表保留在优先级队列中,反复从所有头项中选择最小的元素: https://www.geeksforgeeks.org/merge-k-sorted-arrays/
您的魔术寄存器组可让您在O(N)时间内进行K向合并。您可以通过使用该功能实施合并排序来获得所需的结果,但是您不必在每个级别上进行2向合并,而在每个级别上进行K向合并:
排序将以每级O(N)* log_k(N)级进行,总共O(N log_k(N))= O(N log(N)/ log(K))时间