繁体   English   中英

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

[英]What is the relation between merges and number of items in a in k-way merge

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

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

2-way merge 在合并大小相等的块时效率最高,因此基于 2-way 合并的最有效的k -way 合并是先将块 1 与块 2 合并,将块 3 与块 4 合并,以此类推,然后合并前两个结果块,依此类推。 这基本上是归并排序的工作原理,并导致 O( kn log k ) 时间,假设k个块中的每一个包含n 个项目。 但只有当所有块都恰好有n 个项目并且k是 2 的幂时,它才是完全有效的,所以......

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

  1. 从堆中读取最低项(O(log k ) 时间)
  2. 把它写出来
  3. 从堆中删除它
  4. 如果该项目来自的块尚未耗尽,则将其下一个项目放入堆中(再次O(log k )一次)。
  5. 重复直到堆为空。

如果总共有kn个项目,这总是需要 O( kn log k ) 时间,无论它们如何在块之间分布,也不管k是否是 2 的幂。你的堆需要包含(item, block_index)对这样您就可以识别每个项目来自哪个块。

好的,按照说明回答原始问题:

要使用一系列 2 路合并来合并k个块,总是需要恰好k - 1 次合并,因为无论您在任何时间点选择合并哪对块,合并它们都会将块的总数减少 1。

正如我在原始答案中所说,您选择合并的哪对块确实会影响整体时间复杂度——最好合并大小相似的块——但它不会影响 2 路合并操作的数量

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM