0

如何对大型数据集实际使用归并排序?

假设我有几个带有以下数据的排序文件:

1.txt

1
2
2

2.txt

3
4
5

3.txt

1
1
1

假设我们不能同时将所有文件的内容保存在内存中(假设我们只能保存每个文件中的两个数字)。

我听说在这种情况下我可以使用某种 R-way 合并排序,但我不明白我该怎么做。

如您所见,第一次迭代将为我们提供以下排序序列:

1 1 1 2 3 4

,所以我们将它刷新到输出文件。但是,我们将在下一次迭代中1再次(从文件中)得到,所以整个结果序列是错误的!3.txt

4

2 回答 2

1

I heard that I can use some kind of R-way merge sort in this case but I don't understand how can I actually do it.

N 路合并很容易解释。您打开所有文件,从每个文件中获取第一个元素并将它们放入堆中。然后,该算法通过从堆(pop)中获取最小元素,将其写入您的输出缓冲区,然后从该项目所源自的文件中读取下一个元素。重复直到所有文件都为空。

于 2016-09-04T21:48:22.677 回答
0

首先填充与文件一样多的变量,一个变量附加到一个文件。在每一步找到三个变量中的最小值,并将其刷新到输出,同时从同一个文件再次填充它。

| 1.txt | 2.txt | 3.txt |
| 1     | 3     | 1     | output 1 refill from file 1
| 2     | 3     | 1     | output 1 refill from file 3
| 2     | 3     | 1     | output 1 refill from file 3
| 2     | 3     | 1     | output 1 refill from file 3
| 2     | 3     | nil   | output 2 refill from file 1
| 2     | 3     | nil   | output 2 refill from file 1
| nil   | 3     | nil   | output 3 refill from file 2
| nil   | 4     | nil   | output 4 refill from file 2
| nil   | 5     | nil   | output 5 refill from file 2
| nil   | nil   | nil   | end
于 2016-09-04T21:43:14.847 回答