合并与k-way合并中的项目数之间的关系是什么

时间:2009-03-18 14:31:21

标签: algorithm performance

问题是:在k-way合并中,我们将执行多少合并操作。 例如:2路合并:2个节点1合并; 3个节点2合并; 4个节点3合并。所以我们得到M(n)= n-1。

当k是任意的时,M(n)是什么?

3 个答案:

答案 0 :(得分:1)

双向合并在合并相等大小的块时效率最高,因此基于双向合并的最有效的 k -way合并是首先将块1与块2合并,块3使用块4,依此类推,然后合并前两个结果块,依此类推。这基本上是mergesort如何工作,并导致O( kn log k )时间,假设每个 k 块包含 n 项目。但是,如果所有块都具有 n 项,并且 k 是2的幂,则效率非常高,所以......

您可以使用包含每个块的第一项(即总共 k 项)的堆的单个传递,而不是执行 k 单独的合并传递:

  1. 从堆中读取最低项目(O(log k )时间)
  2. 写出来
  3. 从堆中删除
  4. 如果该项目来自的块尚未耗尽,请将其中的下一项放入堆中(O(log k )时间。)
  5. 重复直到堆为空。
  6. 如果总共有 kn 项目,那么总是需要O( kn log k )时间,无论它们如何分配阻止,无论 k 是否为2的幂。您的堆需要包含(item, block_index)对,以便您可以识别每个项目来自哪个块。

答案 1 :(得分:1)

好的,回答原来提出的问题:

要使用一系列双向合并来合并 k 总是需要完全 k - 1合并,因为无论哪一对您选择在任何时间点合并的块,合并它们会将块总数减少1。

正如我在原始答案中所说,您选择合并的哪些块会影响整体时间复杂度 - 最好合并类似大小的块 - 但它不会影响双向合并操作的编号

答案 2 :(得分:0)

是的,堆方式可能更有效。但原始问题的答案是什么?我发现可能没有答案,因为它可能不是一个完整的k-way树,所以4-way可以回归到3-way,2-way。