使用空间约束对数据进行排序

时间:2015-04-07 14:52:57

标签: sorting

现在问题非常简单。你有1000 MB,你必须对它进行排序。现在的问题是你只有100 MB的空间来排序数据。 (可以说1000 MB存储在磁盘中,你只有100 MB Ram来对数据进行排序。 - 在任何时候你都可以在Ram中只有100 MB的数据。)

现在我想出了这个解决方案:

  1. 将数据分为10个部分 - 每个100 MB,并使用快速排序对其进行排序。
  2. 然后将所有数据块写入硬盘驱动器。
  3. 现在从每个块中选择前10 MB,然后合并。现在你有100 MB。现在将这100 MB分开。
  4. 现在做同样的事情。从每个块中选择下一个10 MB并合并。
  5. 继续这样做,然后连接数据。
  6. 现在我面临的问题是,当我们连接时,我们将分别合并100 MB,我们将犯错误。 (这些100 MB也应该合并在一起。)

    我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

外部合并排序与合并阶段的内部版本不同。在您的问题中,您试图直接将内部合并算法应用于外部合并。

因此,您最终必须合并两个大小为n / 2的块。正如您所记得的那样,由于内存不足,这将无效。

假设您有足够的内存来排序所有元素中的1/k个。这会为您留下k个排序列表。您可以一次合并所有k,而不是合并两个列表:

  1. 选择输出缓冲区大小。好的价值似乎是n / 2。这会留下n / 2内存用于输入缓冲或每个子块m = n / (2 x k)
  2. 从每个子块中读取第一个m元素。现在使用了所有内存,并且您拥有内存中每个子块的最低m个元素。
  3. 从每个k输入缓冲区中选择最低值。将此值附加到输出缓冲区。重复,直到其中一个输入缓冲区用完为止。
  4. 如果其中一个输入缓冲区用完,请从磁盘上的子块读取下一个m元素。如果没有更多元素,则完成子块。
  5. 如果输出缓冲区已满,请将其附加到输出文件并将其位置重置为开始。
  6. 从(3)中冲洗并重复,直到所有子块都用完为止。
  7. 输出文件现已排序。

    您可以将输入缓冲区视为已排序存储区上的一组流缓冲区。检查流并从所有流中选择 best (即最低)元素,并将其保存到输出列表中。从外部看,它是一个与智能预取和输出缓冲的流合并。

答案 1 :(得分:0)

您需要重复步骤3和4. N-1次。