请以您选择的语言提供代码示例。
更新: 没有为外部存储设置约束。
示例:通过网络接收/发送整数。本地磁盘上有足够的空间用于中间结果。
答案 0 :(得分:18)
将问题分成足够小的部分以适应可用内存,然后使用merge sort将它们组合起来。
答案 1 :(得分:11)
答案 2 :(得分:4)
100万32位整数= 4 MB内存。
您应该使用一些使用外部存储的算法对它们进行排序。例如,Mergesort。
答案 3 :(得分:4)
您需要提供更多信息。有多少额外存储空间?你应该在哪里存储结果?
否则,最一般的答案: 1.将第一半数据加载到内存(2MB),按任意方法排序,输出到文件。 2.将后半部分数据加载到内存(2MB)中,按任意方法对其进行排序,并将其保存在内存中。 3.使用合并算法合并两个已排序的一半,并将完整的排序数据集输出到文件中。
答案 4 :(得分:3)
此wikipedia article on External Sorting有一些有用的信息。
答案 5 :(得分:1)
Dual tournament sort with polyphased merge
#!/usr/bin/env python
import random
from sort import Pickle, Polyphase
nrecords = 1000000
available_memory = 2000000 # number of bytes
#NOTE: it doesn't count memory required by Python interpreter
record_size = 24 # (20 + 4) number of bytes per element in a Python list
heap_size = available_memory / record_size
p = Polyphase(compare=lambda x,y: cmp(y, x), # descending order
file_maker=Pickle,
verbose=True,
heap_size=heap_size,
max_files=4 * (nrecords / heap_size + 1))
# put records
maxel = 1000000000
for _ in xrange(nrecords):
p.put(random.randrange(maxel))
# get sorted records
last = maxel
for n, el in enumerate(p.get_all()):
if el > last: # elements must be in descending order
print "not sorted %d: %d %d" % (n, el ,last)
break
last = el
assert nrecords == (n + 1) # check all records read
答案 6 :(得分:0)
答案 7 :(得分:0)
这是一个有效且有趣的解决方案。
将一半数字加载到内存中。堆将它们排序到位并将输出写入文件。重复另一半。使用外部排序(基本上是将文件i / o考虑在内的合并排序)来合并这两个文件。
除了: 面对缓慢的外部存储,使堆排序更快:
在所有整数都在内存之前开始构建堆。
开始将整数放回输出文件,而堆排序仍在提取元素
答案 8 :(得分:-2)
如上所述,提到32位4 MB的int类型。
使用C ++中的int,short和char类型尽可能多地将“Number”拟合到尽可能小的空间中。你可以通过几种类型的转换来处理任何地方的事情,从而获得光滑(但是有很多脏代码)。
这是我座位的边缘。
小于2 ^ 8(0 - 255)的任何内容都存储为char(1字节数据类型)
小于2 ^ 16(256 - 65535)且>的任何内容。 2 ^ 8被存储为短(2字节数据类型)
其余的值将被放入int中。 (4字节数据类型)
您可能希望指定char部分的开始和结束位置,短节的开始和结束位置以及int部分的开始和结束位置。
答案 9 :(得分:-3)
没有例子,但Bucket Sort的复杂性相对较低,而且很容易实现