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

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]. 链表结点

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

蓄水池算法

抽样随机算法