有关于合并分类文件或说合并k排序文件的体面文献。他们都在理论上,即每个文件的第一个元素都放在一个堆中,然后直到堆为空的轮询为元素,然后从获取此元素的文件中获取另一个元素。只要每个文件的一个记录都可以放在堆中。
现在我们说我有n个排序的文件,但我只能在堆和k&lt中带上k记录;n,让我们说n = kc,其中" c"是乘数,暗示n是如此之大,以至于它是c的某些倍数。显然,这需要一遍又一遍地合并,直到我们只剩下k文件,然后将它们合并为最后一次排序的最后一次。我该如何实现此问题,这将是什么复杂性?
在Java中编写的Kway合并的示例多个示例。一个是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文件。因此,您必须执行日志 k (m)通过。也就是说,如果您有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项,并且每个文件都会进行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)。而且您正在执行日志 k (m)通过。因此,总的复杂性为:O(log k (m) *(mn log k))或
O((Mn log k) log M)
每个文件包含相同数量的项目的假设不会影响渐近分析,因为,正如我所表明的那样,每次通过操纵相同数量的项目:m*n。
这就是我所有的想法
我会在迭代中进行。首先,我会选择p = floor(n/k)迭代以获取P排序文件。然后继续对P N%K项目进行此操作,直到P N%K变为较少。然后最终将获得排序的文件。
这有意义吗?