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

标签 algorithm performance

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

当 k 是任意值时,M(n) 是多少?

最佳答案

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

代替执行 k 个单独的合并 channel ,您可以使用单个 channel ,该 channel 使用包含每个 block 的第一个项目的堆(即总共 k 个项目):

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

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

关于algorithm - k-way合并中合并和项目数之间的关系是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/658502/

相关文章:

algorithm - 了解 FastICA 实现

algorithm - 尝试通过一个简单示例了解 Dijkstra 算法的工作原理

java - 尝试编写迭代算法但无法使其工作

ruby - Ruby 进程如何限制其 CPU 使用率?

performance - 我应该先发制人地缓存数据吗

c - ANSI C : Assigning arrays and pointers to arrays

java - 两个for循环,里面的for循环增加1000倍,而速度只增加100倍?

algorithm - 通过改变输入数据来最小化输出值的最佳算法

java - 快速处理数据

C# 转换异常