【发布时间】:2010-10-02 15:27:15
【问题描述】:
在给定任意种子值的情况下,是否有任何已知算法可以在线性时间和恒定空间(当输出迭代产生时)中生成混洗范围 [0..n)?
假设 n 可能很大,例如在数百万中,因此不需要潜在地产生每个可能的排列,尤其是因为它是不可行的(种子价值空间需要很大)。这也是需要恒定空间的原因。 (所以,我特别不是在寻找数组混洗算法,因为这要求范围存储在长度为 n 的数组中,因此会使用线性空间。)
我知道question 162606,但它没有给出这个特定问题的答案 - 从排列索引到该问题中给出的排列的映射需要巨大的种子值空间。
理想情况下,它的行为类似于LCG,句点和范围为n,但为LCG 选择a 和c 的艺术是微妙的。简单地满足 a 和 c 在整个 LCG 周期内的约束可能会满足我的要求,但我想知道是否有更好的想法。
【问题讨论】:
-
您要输出整个范围,还是只输出其中的几个元素?
-
范围有多少:一开始我不知道。这是可配置的。它可能只是整个范围的一小部分,但它可能是例如10001 范围内的 10000 个项目,例如仅仅选择随机项目并测试重复项是不好的。
标签: algorithm language-agnostic random shuffle