今天写一个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;
}

315

被折叠的 条评论
为什么被折叠?



