Linked List Random Node
2016-08-31 09:42
295 查看
水塘抽样算法:
关键点是不知道样本总大小,抽样要等概率
算法过程:遍历一遍链表,每遍历到一个元素时记当前元素编号为n,生成随机数,若随机数小于1/n,则令该元素作为结果,这样进行下去,遍历到最后得到的结果的被抽取概率就是1/N,也就能保证所有元素都是等概率抽取的。
参考公式为:
关键点是不知道样本总大小,抽样要等概率
算法过程:遍历一遍链表,每遍历到一个元素时记当前元素编号为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; } };
相关文章推荐
- leetcode之Linked List Random Node
- LeetCode: Linked List Random Node
- 382. Linked List Random Node
- leetcode382 Linked List Random Node java
- Linked List Random Node
- 382. Linked List Random Node
- [leetcode] 382. Linked List Random Node
- Linked List Random Node
- 382. Linked List Random Node
- [leetcode][382] Linked List Random Node
- [leetcode]-Linked List Random Node
- 382. Linked List Random Node
- [LeetCode] Linked List Random Node 链表随机节点
- LeetCode 382 Linked List Random Node
- LeetCode 382 Linked List Random Node (蓄水池算法 推荐)
- LeetCode:382 Linked List Random Node
- [leetcode]-Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- [leetcode]-Linked List Random Node