2S-1D 与 2S-2D 与多相文件排序
2S-1D vs 2S-2D vs Polyphase file sorting
谁能给我解释一下比较哪一个更好,他们的时间和 space 复杂性以及您认为值得了解的任何重要事项。我知道 2S1D 和 2S2D 是如何工作的。
我假设 "S" 表示源,"D" 表示目标,因此您要比较 2 个源 1 目标与 2 个源 2 目标,以及普通合并排序和多相合并排序。维基文章包括这些案例:
https://en.wikipedia.org/wiki/Polyphase_merge_sort
请注意,该 wiki 文章侧重于外部排序,其中忽略了比较开销,只考虑了数据移动。
对于内部普通归并排序,使用随机存取存储器,2S-2D 排序只需要两个数组,因为 2 个源可以在单个源数组中进行偶数和奇数运行,输出也可以是单个数组。对于内部多相合并排序,您至少需要 3 个数组 (2S-1D)。在我的系统上,尽管 3 数组多相合并排序比 2 数组普通合并排序多执行了大约 5% 的移动,但多相最终快了大约 5%,这可能是由于缓存问题。
琐事 - 对于 3 堆栈(2S-1D 的 LIFO 仅接口版本),多相归并排序是最快的。
谁能给我解释一下比较哪一个更好,他们的时间和 space 复杂性以及您认为值得了解的任何重要事项。我知道 2S1D 和 2S2D 是如何工作的。
我假设 "S" 表示源,"D" 表示目标,因此您要比较 2 个源 1 目标与 2 个源 2 目标,以及普通合并排序和多相合并排序。维基文章包括这些案例:
https://en.wikipedia.org/wiki/Polyphase_merge_sort
请注意,该 wiki 文章侧重于外部排序,其中忽略了比较开销,只考虑了数据移动。
对于内部普通归并排序,使用随机存取存储器,2S-2D 排序只需要两个数组,因为 2 个源可以在单个源数组中进行偶数和奇数运行,输出也可以是单个数组。对于内部多相合并排序,您至少需要 3 个数组 (2S-1D)。在我的系统上,尽管 3 数组多相合并排序比 2 数组普通合并排序多执行了大约 5% 的移动,但多相最终快了大约 5%,这可能是由于缓存问题。
琐事 - 对于 3 堆栈(2S-1D 的 LIFO 仅接口版本),多相归并排序是最快的。