【问题标题】:Why is the complexity of merging M sorted arrays linear time?为什么合并 M 个排序数组的复杂性是线性时间?
【发布时间】:2018-07-14 13:19:43
【问题描述】:

假设我们要执行外部排序并有 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的情况下,在无法进行任何比较的情况下,排序怎么可能实现?

【问题讨论】:

  • 当比较每个数组的第一项时,可以使用二分查找来比较下一项。

标签: arrays algorithm sorting merge


【解决方案1】:

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

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

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

【讨论】:

  • 当索引不能传达元素的值时,它们会起作用吗?这怎么能做比较呢?我认为我们不能比线性时间更好地提取最小值,因为我们至少需要对每个元素至少迭代一次才能知道它是否是要提取的最小值。然后我们必须重复获取一组新整数的过程以再次找到最小值,因为我们不能重用旧集合。
  • 例如,Block[num][pos] 指的是第 num 块的 pos-th 项。如何比较它们 - 取决于实施。关于最小提取 - 阅读二进制堆:en.wikipedia.org/wiki/Binary_heap
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2020-03-21
  • 2012-03-26
  • 2011-07-04
  • 2014-02-17
相关资源
最近更新 更多