使用K方式合并合并n排序的文件



有关于合并分类文件或说合并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变为较少。然后最终将获得排序的文件。

这有意义吗?

相关内容

  • 没有找到相关文章

最新更新