我有一个整数向量如下:vector<int> vec {3, 4, 2, 1, 1, 3, 1}
.下面的代码总是返回1
在索引3
处的最小元素.当同一代码多次运行时,如何使它从三个位置[3, 4, 6]
中随机选择1
的最小值?
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> vec {3, 4, 2, 1, 1, 3, 1};
auto it = min_element(vec.begin(), vec.end());
cout << *it << endl;
cout << "It is at a distance of: " << distance(vec.begin(), it) << endl;
return 0;
}
3条答案
按热度按时间lsmepo6l1#
根据你的需要,可能有很多方法可以做到这一点。
Demo
uurity8g2#
下面是一个基于选择采样的单遍变体(尽管它可能会做得更好),本质上是Reservoir Sampling的一个例子,样本大小为1。
Demo of the above
9w11ddsr3#
这个解决方案是随机的,但可能不会给所有的条目给予相等的概率,但是它避免了必须创建新的向量,并且仍然是O(N)。
它的工作原理是随机地将序列(在逻辑意义上)分成两部分,取其中的最小值,然后返回这两部分的最小值。
正如我所说,它可能不是均匀分布的,但它确实仍然是随机的。
生产
神箭:https://godbolt.org/z/3EhzdGndz