关闭

Linked List Random Node

73人阅读 评论(0) 收藏 举报
分类:

水塘抽样算法:

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

算法过程:遍历一遍链表,每遍历到一个元素时记当前元素编号为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;
	}
};


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16654次
    • 积分:1729
    • 等级:
    • 排名:千里之外
    • 原创:160篇
    • 转载:17篇
    • 译文:3篇
    • 评论:1条
    文章分类