蓄水池算法(链表随机节点)

Posted 秦枫-_-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓄水池算法(链表随机节点)相关的知识,希望对你有一定的参考价值。


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    private ListNode head;
    public Solution(ListNode head) {
        this.head = head;
    }
    public int getRandom() {
        //直接假设袋子容量为1
        int count = 1;
        int res = head.val;
        ListNode temp = head;
        temp=temp.next;
        while (temp != null) {
            count++;
         if (rand(count) == 1) {//第 i 个数被替换(cur进入蓄水池)的概率为1/count,前面第i个数不被替换(cur不进入蓄水池)的概率为(count-1)/count,如此可以做到每个数被保留的概率为m/N
                    res = temp.val;
                } 
            temp = temp.next;
        }
        return res;
    }
    public int rand(int max){
        return (int)(Math.random()*max)+1;
    }
}

以上是关于蓄水池算法(链表随机节点)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1716. 计算力扣银行的钱 / 382. 链表随机节点(蓄水池抽样) / 1220. 统计元音字母序列的数目(动规,矩阵快速幂)

MySTL:蓄水池抽样算法

[382]. 链表结点

[程序员代码面试指南]第9章-蓄水池算法

382. 链表随机节点Normal水塘抽样算法

大数据量样本随机采样-蓄水池算法