我正在处理大量的整数排列。每个排列中的元素数为K。元素大小为1个字节。我需要生成N个唯一的随机排列。 限制条件:K <= 144,N <= 1,000,000。
我想出了以下简单算法:
有一个更好的方法吗?尤其是,是否有一种方法不将所有排列存储在RAM中(在生成时将其写到磁盘上)?
编辑 :最后,需要顺序访问生成的排列(一对一,无需随机访问)。RAM是更关键的因素(我希望不要一次将所有排列存储在RAM中)。
一种可能的解决方案是使用 布隆过滤器 。
将排列存储在磁盘上(顺序写入),并在RAM中维护Bloom过滤器。 生成排列后-检查它是否在bloom过滤器中存在,如果bloom过滤器说尚未将其写入磁盘,则将其写入磁盘,bloom过滤器不会出现假阴性。 但是,如果bloom过滤器说它在磁盘上,则可能是错误的。
如果Bloom筛选器显示“排列已经存在”,则可以决定是否要退出此候选并转到下一个而不检查集合中是否确实存在该候选,或者可以搜索磁盘以查看是否存在该排列。真的在那里。 如果选择后者,则应考虑为排列(例如哈希表或B +树)维护一个智能DS 。
布隆过滤器在这里是完美的匹配-它们被设计为表示一个可扩展阅读的集合,同时给出0个假阴性,这是这里最重要的事情。