Reservoir Sampling

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时,采样等概

    • 考虑可覆盖的采样,即后一个采样可以覆盖前一个采样。
    • k 个元素,只考虑前k,对应概率为 1/k
    • 假设第 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;        
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值