为什么合并M个排序数组的复杂性是线性时间?

时间:2018-02-04 15:35:26

标签: arrays algorithm sorting merge

假设我们想要执行外部排序并且对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的情况下,如果无法进行任何比较,分类是如何可行的呢?

1 个答案:

答案 0 :(得分:0)

基于优先级队列?例如,在binary heap上,用每个块中的当前项(或它们的索引)填充它,并在每一步中提取顶部项。

每个输出元素提取O(log(M)),因此完全合并为O(n*log(M))

对于您的人为示例:O(n*log(n))