关闭

Reservoir Sampling

79人阅读 评论(0) 收藏 举报
分类:

382. Linked List Random Node
LeetCode上的一道题

Given a singly linked list, return a random node’s value from the linked list. Each node must have the same probability of being chosen.
Follow up:
What if the linked list is extremely large and its length is unknown to you? Could you solve this efficiently without using extra space?

思路

已知链表长度n时,可以使用

rand()%n  //

但此题目提示,链表长度未知,此时需要用到一些概率论的知识。

  1. 每个元素被抽取概率均为1/n时,采样等概
  2. 考虑可覆盖的采样,即后一个采样可以覆盖前一个采样。
  3. k个元素,只考虑前k,对应概率为1/k
  4. 假设第i个元素,被采中。对应事件为第i次采中,之后所有采样均未采中,计算如下
    1i(11i+1)(11n)=1n

    即第i个元素被采中的概率为1/n
  int getRandom() {
    ListNode *tem = p;
    int val = p->val;
    for (int i = 1; tem; i++) {
        if (rand() % i == 0)
            val = tem->val;
        tem = tem->next;
    }
    return val;        
  }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6241次
    • 积分:533
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:5篇
    • 译文:0篇
    • 评论:9条