您的位置:首页 > Web前端 > Node.js

Linked List Random Node

2016-08-31 09:42 295 查看
水塘抽样算法:

关键点是不知道样本总大小,抽样要等概率

算法过程:遍历一遍链表,每遍历到一个元素时记当前元素编号为n,生成随机数,若随机数小于1/n,则令该元素作为结果,这样进行下去,遍历到最后得到的结果的被抽取概率就是1/N,也就能保证所有元素都是等概率抽取的。

参考公式为:

                        


class Solution {
public:
/** @param head The linked list's head.
Note that the head is guaranteed to be not null, so it contains at least one node. */
ListNode* p;
Solution(ListNode* head) {
p = head;
}

/** Returns a random node's value. */
int getRandom() {
int res = p->val;
ListNode* node = p->next;
int i = 2;
while (node) {
int j = rand() % i;
if (j == 0)//这样写的原理是:若生成的随机数在0~i之间,则j=0时rand()=i,
//若生成的随机数在0~2i之间时,rand()=i或2i时j=0,以此类推,这样就保证了上面说明中随机数小于1/n那条性质
res = node->val;
i++;
node = node->next;
}
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: