【问题标题】:design an algorithm to randomized choose one element from a linkedlist [duplicate]设计一种算法从链表中随机选择一个元素[重复]
【发布时间】:2012-10-03 23:35:32
【问题描述】:

可能重复:
How would you pick a uniform random element in linked list with unknown length?

假设我们想从链表中随机选择一个元素, 但我们不知道链表的长度。

设计一种算法,以尽可能少的运行时间随机选择元素。

【问题讨论】:

标签: algorithm


【解决方案1】:

O(N) 有一个简单的算法,获取长度,然后选择一个元素。

但是你可以做得更好,使用在线算法,只访问每个元素一次:

您选择第一个元素作为答案,然后在kth 元素上用概率为1/k 的元素替换您的答案。可以用数学归纳法证明这种方法没有偏差。

广义版本(选择 k 个元素)是reservoir sampling

【讨论】:

  • “然后在第 k 个元素上以 1/k 的概率替换选择”是什么意思?你能详细解释一下吗?
  • 你选择第一个元素,然后你放弃它并以 50% 的概率选择第二个元素,然后以 1/3 的概率选择下一个元素,依此类推......
  • 从实现的角度来看,第二种算法真的会因为必须生成 N 个随机数而最终变慢吗? IE。生成随机数是否比取消引用指针更快?
  • @IvanVergiliev,对于链表,扫描两次几乎肯定会更快,因为任何质量的随机数生成器都会比指针解引用慢。但是考虑一个非常相似的问题,“选择文件中的随机行”。现在,水库算法开始看起来更有吸引力了。
  • @Ivan 如果您的随机数生成器是例如一个线性同余生成器(对于这个实验来说可能已经足够好了,否则将其中两个结合起来,请参阅 L'Ecuyer),我很确定对于大型列表,由于缓存未命中和页面错误,指针的取消引用会慢得多.
【解决方案2】:

考虑一下: 我假设您有一个变量来跟踪您的链接列表中有多少项目(标准编程实践)。如果你有一个传入该变量的函数,你所要做的就是有一个指向链表中一个项目的指针,并将指针设置为 rand() % Amount_Of_Items 然后让函数返回指针,如果你必须使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2014-06-19
    • 2019-02-26
    • 2014-07-28
    • 2023-01-11
    • 2013-03-03
    • 2011-05-29
    • 2012-01-12
    相关资源
    最近更新 更多