未知链表长度的情况下从中随机取k个数 [原]
摘要:
问题:有一个未知长度的链表,要求在其中随机抽取k个节点作为样本(即如果有n个节点,则每个节点被取出的概率是k/n,而n是未知的)。链表只能顺序读取一遍。(保证链表节点数>k) 思路:先取出前k个节点,以后没到一个节点,就以一定的概率将其与已取出的k个节点随机交换。具体来说,记链表为A,从A[1]一直扫到A[K],并取出作为最初的k个节点,记为B。继续往下扫,扫到A[i](i>k)时,以k/i的概率将其取出,并与B中的某个节点交换(B中有k个节点,每个节点被换出的概率都是相等的,即1/k);如果A[i]没被取出(概率为(i-k)/i),就继续往下扫。最后扫完A,得到的B即为所求。 证 阅读全文
posted @ 2012-02-28 14:07 龙豆 阅读(1107) 评论(0) 推荐(0)
浙公网安备 33010602011771号