假设我们想要执行外部排序并且对M个块进行排序,其中每个块包含k个可比较的项目,使得n = Mk。在这种情况下,k也指您可以放入内存进行排序的最大项目数,n是要排序的项目总数。
然后在合并排序中使用合并功能,必须将每个元素与其他块中的所有其他元素进行比较,这样就可以对一个元素进行O(M)比较。由于我们必须对所有元素执行此操作,因此我们将具有O(M * Mk)= O(M ^ 2 * k)= O(nM)时间复杂度。
这看起来似乎是线性的,但假设在最坏的情况下我们只能将1个项目放入内存中。所以我们有M = n个块,时间复杂度直接为O(n ^ 2)。合并如何为外部排序提供线性时间?
此外,在k = 1的情况下,如果无法进行任何比较,分类是如何可行的呢?
答案 0 :(得分:0)
基于优先级队列?例如,在binary heap上,用每个块中的当前项(或它们的索引)填充它,并在每一步中提取顶部项。
每个输出元素提取O(log(M))
,因此完全合并为O(n*log(M))
对于您的人为示例:O(n*log(n))