【发布时间】:2012-03-09 20:19:12
【问题描述】:
我有一个包含n 元素的向量。我需要从向量中随机选择 m 元素的一个子集而不重复。这样做最有效的方法是什么?我需要在我的代码中执行数千次。
我想到的解决方案是使用rand() 在0 和n 之间生成一个随机数k。然后选择向量中的kth 元素并将其插入std::set。继续这样做直到集合的大小等于m。我现在确信该集合包含从 n 元素集合中随机选择的 m 唯一元素。
其他可能的解决方案是什么?
谢谢。
【问题讨论】:
-
在向量上执行
std::random_shuffle()并从中拉出第一个m元素,也许? -
@jrok:虽然很简单,但当
m比n小很多时效率非常低。 -
@MooingDuck 但事实上
std::random_shuffle()只是一个完整的排列,它也使用了Fisher-Yates shuffle。请参阅 cppreference 中的 first version of possible implementation。对于那些想了解接受的答案以及std::random_shuffle()的人来说,值得一读。 -
@Rick:当然,这是相同的算法,但不是在
m元素之后停止,而是处理整个数据集,这非常浪费时间。这是std::sort和std::partial_sort之间的区别。