通过一次遍历获取单向链表中的随机元素

卢声远*_* Lu 9 random algorithm traversal

我有一个方向链表而不知道它的大小.

我想在这个列表中得到一个随机元素,我只有一次机会遍历列表.(我不允许遍历两次或更多次)

这个问题的算法是什么?谢谢!

Aur*_*nda 18

这只是一个水库取样,水库大小为1.

基本上它非常简单

  1. 无论如何选择第一个元素(对于长度为1的列表,第一个元素始终是样本).
  2. 对于概率为1/n的每个其他元素,其中n是到目前为止观察到的元素数,您将已经拾取的元素替换为您所在的当前元素.

这是统一采样的,因为在一天结束时挑选任何元素的概率是1/n(向读者练习).