有多个用 Java 编写的 k-way 合并示例。一个是http://www.sanfoundry.com/java-program-k-way-merge-algorithm/。
要实现合并,您只需要编写一个简单的包装器,它会不断扫描您的目录,提供事物文件,直到只剩下一个。基本思想是:
while number of files > 1
fileList = Load all file names
i = 0
while i < fileList.length
filesToMerge = copy files i through i+k-1 from file list
merge(filesToMerge, output file name)
i += k
end while
end while
复杂性分析
如果我们假设每个文件包含相同数量的项目,这更容易考虑。
您必须合并 M 个文件,每个文件包含 n 个项目,但一次只能合并 k 个文件。所以你必须做 log k (M) pass。也就是说,如果您有 1,024 个文件并且一次只能合并 16 个,那么您将进行一次合并 16 个文件的过程,总共创建 64 个文件。然后,您将进行另一遍,一次合并 16 个文件,创建四个文件,最后一遍将合并这四个文件以创建输出。
如果你有 k 个文件,每个文件包含 n 个项目,那么合并它们的复杂度是 O(n*k log 2 k)。
因此,在第一遍中,您进行 M/k 合并,每个合并的复杂度为 O(nk log k)。那是 O((M/k) * n * k * log 2 k),或 O(Mn log k)。
现在,您的每个文件都包含 n k k 个项目,并且您每个都对 k 个文件进行 M/k/k 合并。所以第二遍复杂度是 O((M/k 2 ) n * k 2 * log 2 k)。简化后,这也适用于 O(Mn log k)。
在第二遍中,您进行 k 次合并,每个合并的复杂度为 O(nk)。请注意,在每次传递中,您都在使用 M*n 项。所以你做的每一遍都是O(Mn log k)。你正在做 log k (M) pass。所以总复杂度是:O(log k (M) * (Mn log k)),或者
O((Mn log k) log M)
每个文件包含相同数量的项目的假设不会影响渐近分析,因为正如我所展示的,每次传递都操作相同数量的项目:M*n。