问题是:在k-way合并中,我们将执行多少合并操作。 例如:2路合并:2个节点1合并; 3个节点2合并; 4个节点3合并。所以我们得到M(n)= n-1。
当k是任意的时,M(n)是什么?
答案 0 :(得分:1)
双向合并在合并相等大小的块时效率最高,因此基于双向合并的最有效的 k -way合并是首先将块1与块2合并,块3使用块4,依此类推,然后合并前两个结果块,依此类推。这基本上是mergesort如何工作,并导致O( kn log k )时间,假设每个 k 块包含 n 项目。但是,如果所有块都具有 n 项,并且 k 是2的幂,则效率非常高,所以......
您可以使用包含每个块的第一项(即总共 k 项)的堆的单个传递,而不是执行 k 单独的合并传递:
如果总共有 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。