你如何在2MB RAM中对100万个32位整数进行排序?

时间:2008-09-25 15:53:47

标签: algorithm language-agnostic google-moderator

请以您选择的语言提供代码示例。

更新: 没有为外部存储设置约束。

示例:通过网络接收/发送整数。本地磁盘上有足够的空间用于中间结果。

10 个答案:

答案 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)

  • 嗯,把它们全部存放在一个文件中。
  • 内存映射文件(你说只有2M的RAM;我们假设地址空间足够大,可以存储映射文件)。
  • 使用文件后备存储对它们进行排序,就好像它现在是真正的内存一样!

答案 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的复杂性相对较低,而且很容易实现