我想唯一一个由n 个元素组成的数组。
n可以达到 10^9,甚至 10^11。
也就是说,元素可能并不都适合内存。所以下面的简单排序和唯一方法将不起作用(太慢:排序和唯一一个 10^8 数组需要半分钟一个线程)。
sort( a.begin(), a.end() );
a.erase( unique(a.begin(), a.end() ), a.end() );
幸运的是,设计算法有一些帮助:
元素适合 64 位无符号整数 (uint64_t)。由于元素是由哈希函数生成的,所以我们可以假设它满足均匀分布( ~U(0, 2^64-1) )。
我有一个不少于 10 台多核计算机/节点的集群,所以算法可以(并且应该)设计为分布式的。我有权运行 MPI C++ 代码。(但是集群不属于自己,有时可能有其他程序在任意一台计算机/节点上争抢CPU时间,所以任务最好动态分派到每台计算机/节点上)
每台计算机/节点不少于8个核心,不少于64G主存,不少于100G SSD可用空间。此外,它们通过千兆以太网连接。
任何人都可以帮助就设计算法提出任何建议吗?该方法需要多次运行。我希望在一小时内在集群上得到结果。