给定一系列N
元素(比如std::vector
或T*
),是否有任何有效的方法以随机顺序迭代其元素,只需访问每个元素一次。解决方案必须避免使用混洗索引创建其他数组。
修改
此外,我们需要能够跟踪原始索引
答案 0 :(得分:13)
不是特别随机,但考虑到你的限制,你几乎没有选择。
A is the array
S is the size of the array
Generate a random prime number (P), such that P > S
Q = P % S
for i = 1 to S
process A[Q]
Q = (Q + P) % S
答案 1 :(得分:6)
使用std::random_shuffle
,因此您的代码将是这样的:
std::random_shuffle ( myvector.begin(), myvector.end() ); // in place no extra array
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
答案 2 :(得分:0)
好吧,我并不完全清楚制作额外数组的限制。但实质上,我们随机生成一个索引,然后重复,如果我们达到了已经命中的索引,则重新生成。它不一定有效。但是,我猜测边界肯定在O(n ^ 2)和O(n!)之间(可能是(O(n ^ n))。只需要做一点工作,我们就可以清理它并获得几乎总是落在n ^ 2上。