演算法 蓄水池抽樣

2021-09-01 20:49:11 字數 879 閱讀 6190

例題:有乙個機器按自然數序列的方式吐出球,1號球,2號球......。現有乙個袋子,袋子裡最多只能裝下k個球,並且除袋子以外沒有更多的空間,球扔掉不能放回。設計一種選擇方式,使得當機器吐出第n號球時,袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個被選中進袋子的概率都是k/n。

具體例子:

有乙個只能裝下10個球的袋子:

當吐出100個球時,袋子裡有10個球,且1~100號球中每個被選中放入袋子的概率都是10/100;

當吐出1000個球時,袋子裡有10個球,且1~1000號球中每個被選中放入袋子的概率都是10/1000;

當吐出n個球時(n>10),袋子裡有10個球,且1~n號球中每個被選中放入袋子的概率都是10/n;

蓄水池演算法步驟:

1. 處理1~k號球時,直接放入袋子;

2. 處理第i號球(i > k)時,以 k/i 概率決定是否將第i號球放入袋子。若不放入,直接扔掉。若放入,則從袋子裡隨機選乙個球扔掉,然後把第i號球放進袋子。

import random;

class bag:

selected =

def __init__(self):

self.selected =

# 每次拿乙個球都會呼叫這個函式,n表示第i次呼叫

def carryballs(self, n, k):

if n <= k:

if random.randint(1,n) <= k:

index = random.randint(0,k-1)

self.selected[index] = n

return self.selected

蓄水池抽樣演算法

給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 蓄水池抽樣演算法 該演算法是針對從乙個序列中隨機抽取不重複的k個數,保證每個數被抽取到的概率為k n這個問題...

蓄水池抽樣演算法

題目 要求從n個元素中隨機的抽取k個元素,其中n無法確定 解法 首先選擇n中的前k個數加入 蓄水池 中,然後從第k 1個數開始,以k k i i 1,2,3.的概率選擇這個數,然後在蓄水池中隨機選擇乙個數,並將其替換,n個元素遍歷完畢後,蓄水池中的k個數就是隨機選擇的。證明 這裡即需要證明每個數出現...

蓄水池抽樣演算法

蓄水池抽樣演算法是一種抽樣演算法,對於乙個不知道大小的的集合 通常是流式資料 抽取的樣本值能夠保證隨機。特點 其時間複雜度並不是很高o n 空間複雜度通常是o k 能夠很大程度地節省記憶體。問題 我現在有乙個很長並且不知道多長的序列,怎麼從中取出k個完全隨機的數。用乙個足夠大的陣列存放所有資料然後隨...