algorithm - 排序大于 RAM 大小的数据

标签 algorithm sorting data-structures

这是一个谷歌面试问题: 给定 2 台机器,每台机器都有 64 GB RAM,包含所有整数(8 字节),对整个 128 GB 数据进行排序。您可以假设有少量额外的 RAM。扩展它以对存储在 1000 台机器中的数据进行排序。

我想到了外部排序。因为我们将整个数据分成 block 并对它们使用合并排序。这是第一次对 block 进行排序,然后将它们放回去,然后再次分段获取它们并合并它们。有没有更好的办法?复杂度如何?

最佳答案

ChingPing 建议对每个子集进行 O(n log n) 排序,然后进行线性合并(通过交换元素)。 Quicksort(以及大多数 n log n 排序)的问题是它们需要 n 内存。我建议改用 SmoothSort,它使用常量内存,仍然在 O(n log n) 中运行。

最坏的情况是你有这样的事情:

setA = [maxInt .. 1]
setB = [0..minInt]

两个集合的顺序是相反的,但合并后的顺序是相反的。

ChingPing 解决方案的(IMO - 更清楚)解释是:

Have a pointers 'pointerA', 'pointerB' initialized at the beginning of each array
While setA's pointer is not at the end
  if (setA[pointerA] < setB[pointerB])
    then { pointerA++; }
    else { swap(setA[pointerA], setB[pointerB]); pointerB++; }

这两个集合现在应该都已排序。

关于algorithm - 排序大于 RAM 大小的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8584779/

相关文章:

javascript - 在数组中查找可能的加法组合

javascript - 对 jstree 上的特定元素进行排序

r - 如何在 R 中对数据框进行排序

java - 使用合并排序与选择排序的比较

java - memcached 中的数据结构库

c# - 事件发生在读取和清除操作之间,因此,最后的数据将丢失

algorithm - 在 2 个排序的整数数组中进行二进制搜索

c++ - 结构中的默认成员值或默认构造函数参数?

database - 什么是数据仓库?

php - 多边形算法/伪代码中的最短路径