对蓄水池算法的解析和应用

今天写一个10万个数据的消息队列,对里面的数据输入和输出感觉并没有达到完全随机的地步,这让我想起了我之前学习过的蓄水池算法,然后就自己手撸了一个感觉比较满意的随机池。

蓄水池算法:

所谓的蓄水池算法,其实很简单:先给一个概念一个很大的文件,我要随机取其中的某一行,先选第一行,然后第二行以1/2的几率决定要不要替换第一行,第三行以1/3的几率要不要替换,直到最后一行,然后每一行的几率都是一样的。

如果我们要平均选k行呢,就一开始先放k行,然后每次以k/k+1的几率考虑要不要替换池子里的数,所有操作完成后,就是k/n的概率,具体证明其实也不难,就是一个逼近的数学式子。

具体应用:

给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。

int * getrandom(ListNode* root){
     ListNode* tmp=root;
     int res=tmp->val;
     for(int i=1;tmp!=nullptr;i++){
       if(rand()%i==0){
            res=tmp->val;
        tmp=tmp->next;
     }
   return res;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值