Algorithm 算法:获得一个O(n lgn/lgk)算法,而不是O(n lgn/k)

Algorithm 算法:获得一个O(n lgn/lgk)算法,而不是O(n lgn/k),algorithm,Algorithm,假设你有一台特殊的高性能计算机。在这台电脑里, 有一个专用的k优化寄存器组,其中k>2。这些寄存器中的每一个都可以用来存储一个键值对,因此这组寄存器最多可以存储k个键值对。该寄存器组可在O(1)时间内支持以下操作: 将键值对(x,y)插入该寄存器组;及 返回一个键值对(x,y),它是寄存器组中最小的键x。此返回对也将从此寄存器库中删除 设计一种算法,可以利用这组寄存器在O(n lgn/lgk)时间内对n个数字进行排序 这就是问题所在。我是用“分而治之”的方法做到的。我认为它类似于merge

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

  • 将键值对(x,y)插入该寄存器组;及
  • 返回一个键值对(x,y),它是寄存器组中最小的键x。此返回对也将从此寄存器库中删除
设计一种算法,可以利用这组寄存器在O(n lgn/lgk)时间内对n个数字进行排序



这就是问题所在。我是用“分而治之”的方法做到的。我认为它类似于mergesort。然而,我只能得到一个O(n lg n/k)的an算法。在大多数情况下,O(nlgn/k)比O(nlgn/lk)慢,所以我想知道我如何思考这个问题。谢谢。

通常,使用这样的算法将K个排序列表与总共N个元素合并需要O(N log K)时间,该算法将输入列表保持在优先级队列中,并从所有标题项中重复选取最小的元素:

您的魔法注册库允许您在O(N)时间内完成K路合并。通过使用该功能实现合并排序,您可以获得所需的结果,但不是在每个级别执行双向合并,而是在每个级别执行K向合并:

  • 按O(N)总时间对所有长度为K的子列表排序
  • 将每组K个列表合并为一个长度为K^2的列表,总时间为O(N)
  • 创建长度为K^3等的列表的步骤相同

排序每级需要O(N)*log_k(N)级,总的O(N log_k(N))=O(N log(N)/log(k))时间

通常,使用这样的算法将k个排序列表与总共N个元素合并需要O(N log k)时间,该算法将输入列表保持在优先级队列中,并从所有标题项中重复选择最小的元素:

您的魔法注册库允许您在O(N)时间内完成K路合并。通过使用该功能实现合并排序,您可以获得所需的结果,但不是在每个级别执行双向合并,而是在每个级别执行K向合并:

  • 按O(N)总时间对所有长度为K的子列表排序
  • 将每组K个列表合并为一个长度为K^2的列表,总时间为O(N)
  • 创建长度为K^3等的列表的步骤相同

排序将采用O(N)每个级别*log_k(N)级别,因为总共O(N log_k(N))=O(N log(N)/log(k))时间

为什么您认为
N lg N/k
N lg N/lg k
慢?由于正k的
lg k
小于
k
1/lg k
大于
1/k
@Nico,因此缺少括号。应该是O(n log n/log k)对O(n log(n/k))啊,是的。这是有道理的@Matt。为什么你认为
n lg n/k
n lg n/lg k
慢?由于正k的
lg k
小于
k
1/lg k
大于
1/k
@Nico,因此缺少括号。应该是O(n log n/log k)对O(n log(n/k))啊,是的。这很有意义@Matt。我想知道的是,他们是如何得到一个优先级队列的,该队列在O(1)中进行插入和删除的。这将允许O(n)比较排序。我想知道的是,他们是如何得到一个优先级队列的,该队列在O(1)中进行插入和删除。这将允许O(n)比较排序。