可能重复:
How would you pick a uniform random element in linked list with unknown length?
假设我们要随机选择链表中的元素, 但是我们不知道链表的长度。
设计一种算法,该算法尽可能采用随机选择元素的运行时间。
答案 0 :(得分:10)
有一个简单的算法O(N)
,获取长度,然后选择一个元素。
但是你可以通过在线算法做得更好,只访问每个元素一次:
您选择第一个元素作为答案,然后在k
元素上使用概率1/k
替换您的答案。这种方法没有偏差的事实可以通过数学归纳证明。
一般化版本(挑选k个元素)是reservoir sampling。
答案 1 :(得分:-2)
考虑一下: 我假设你有一个变量来跟踪你链接列表中的项目数量(标准编程实践)。如果你有一个传入该变量的函数,你所要做的就是有一个指向链表中项目的指针,并将指针设置为rand()%Amount_Of_Items然后让函数返回指针,如果你必须使用它