c++ - 给定一个未知长度的列表,通过仅扫描 1 次返回其中的随机项目

标签 c++ algorithm list data-structures random

给定一个未知长度的列表,通过仅扫描 1 次返回其中的随机项目。

我的想法:

类似的算法是 Reservoir Sampling(其他人发布)。但是,它太复杂了,因为它需要运行 rand() 并在每次迭代中保留 k 个节点。

有更好的解决方案吗? O(n) 时间和 O(1) 空间?

最佳答案

您为什么反对水库采样?您碰巧是在 k = 1 的情况下进行的。有一些小的优化(例如,您不需要从 k 中选择 1,因为 k = 1)但这是正确的方法。您可以尝试通过一次保持处理一个固定窗口来进行优化,做数学计算以相等的概率计算出您是否应该选择窗口中的任何项目而不是您拥有的项目等,以尽量减少 rand() 调用以更复杂的算法为代价,但无论如何你或多或少都会回到水库采样。

关于c++ - 给定一个未知长度的列表,通过仅扫描 1 次返回其中的随机项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8695022/

相关文章:

list - 检查 clisp 中的模式列表

c++ - 如何避免 CScrollView 移动时出现闪烁?

python - 用Python编写一个高效的算法来解决数学问题

Python。查找具有设定长度的所有可能的数字组合

java - k-means 在 mapreduce 中对特定集群中的文件进行分组

c# - 在 C# 中将泛型列表转换为数据集

c++ - 在 SFML 顶点数组中组合基元

c++ - 将指针地址转换为 int

c++ - 具有相对超时的函数 pthread_rwlock_timedwrlock/timedrdlock

python - 用字符串替换列表元素中的列表元素