算法:获取O(n lg n / lg k)算法,而不是O(n lg n / k k)

时间:2018-10-10 16:36:18

标签: algorithm

假设您有一台特殊的高性能计算机。在这台电脑上 有一个专用的k个优化寄存器组,其中k>2。这些寄存器中的每一个都可用于存储一个键值对,因此,这组寄存器最多可存储k个键值对。该寄存器组可以在O(1)时间内支持以下操作:

  • 将键值对(x,y)插入这组寄存器;和
  • 从寄存器组中返回键-值对(x,y),其中键x最小。此返回的货币对也将从该寄存器组中删除。

设计一种算法,可以利用这组寄存器在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)慢,所以我想知道如何考虑这个问题。谢谢。

1 个答案:

答案 0 :(得分:2)

通常,使用这样的算法将K个排序的列表与总共N个元素合并将花费O(N log K)时间,该算法将输入列表保留在优先级队列中,反复从所有头项中选择最小的元素: https://www.geeksforgeeks.org/merge-k-sorted-arrays/

您的魔术寄存器组可让您在O(N)时间内进行K向合并。您可以通过使用该功能实施合并排序来获得所需的结果,但是您不必在每个级别上进行2向合并,而在每个级别上进行K向合并:

  • 在O(N)总时间中排序所有长度为K的子列表
  • 将每组K个列表合并为总时间为O(N)的长度为K ^ 2的列表
  • 与创建长度为K ^ 3等的列表相同。

排序将以每级O(N)* log_k(N)级进行,总共O(N log_k(N))= O(N log(N)/ log(K))时间