给定一个未知的长度列表,只需扫描1次即可返回其中的随机项目。
我的想法:
类似的算法是储层采样(由其他人发布)。但是,它太复杂了,因为它需要运行rand()并在每次迭代中保留k个节点。
有更好的解决方案吗?O(n)时间和O(1)空间?
为什么反对储层采样?您恰好用k = 1来执行此操作。有一些小的优化(例如,由于k = 1,您无需从k中选择1),但这是正确的方法。您可以尝试通过一次处理一个固定的窗口来进行优化,如果您应该选择窗口中的任何项而不是窗口中的任何项,则进行算术运算以均等的概率进行计算,等等,以最大程度地减少rand()调用以更复杂的算法为代价,但是无论如何,您都将或多或少地回过头来进行储层采样。