对232个数字进行排序的典型算法是:
创建一个包含232个数字的数组,并将其从0填充到232-1
设n=数组中的项数=232
随机选取一个从0到n-1的数字,从数组中移除该数字,并将其推到堆栈上
现在,n递减1,堆栈大小递增1
转到3。在数组为空之前,最后一个堆栈是解决方案
232=4294967296件
232*4=17179869184字节,如果我们使用4字节无符号整数
因为我在一台机器上没有那么多内存,所以使用memmap()可能是一个很好的选择(可能是最直接的方法)。
出于好奇,我想知道是否可以使用MapReduce来解决这个问题Map和Reduce函数是什么样子的?
我突然想到了这个想法,因为虽然我在一台机器上没有那么多内存,但我在局域网上所有的盒子里肯定都有那么多内存。MapReduce中数据的分布式性质可能会有所帮助。
尽管适合MapReduce的替代、等价算法是受欢迎的,但要想提出一种不降低上述算法随机性的算法可能是困难的。
最佳答案
“MapReduce:大型集群上的简化数据处理”一文(第3页,第3节之前)描述了如何使用MapReduce进行分布式排序。对2^32个数字进行随机洗牌的一种方法是给每个数字一个随机生成的80位密钥,然后按此密钥对数字+密钥进行排序对于80位键,将很少有连接(预期的数字约为2^-17),您可以使用最后一次传递将它们按随机顺序排列。
毫无疑问,如果你准备做很多相对低级的编程,有更好的方法来做到这一点,但是随机洗牌和排序都需要在机器之间做大量的严肃的数据移动,而且很可能已经投入了大量的工作来让排序变得聪明——这样你就可以重用它。
关于algorithm - 使用MapReduce进行2 ^ 32个数字的随机混洗的可能性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8116082/