LeetCode 蓄水池抽樣演算法

2021-09-24 11:13:34 字數 1531 閱讀 5476

面試的時候被問到這個問題了,一臉懵逼。

問題:從n個元素中隨機抽取k個元素,其中n無法確定。

解法:我們總是選擇第乙個物件,以1/2的概率選擇第二個,以1/3的概率選擇第三個,以此類推,以1/m的概率選擇第m個物件。當該過程結束時,每乙個物件具有相同的選中概率,即1/n,證明如下。

證明:第m個物件最終被選中的概率p=選擇m的概率*其後面所有物件不被選擇的概率,即

對應蓄水池抽樣問題,可以類似的思路解決。先把讀到的前k個物件放入「水庫」,對於第k+1個物件開始,以k/(k+1)的概率選擇該物件,以k/(k+2)的概率選擇第k+2個物件,以此類推,以k/m的概率選擇第m個物件(m>k)。如果m被選中,則隨機替換水庫中的乙個物件。最終每個物件被選中的概率均為k/n,證明如下。

證明:第m個物件被選中的概率=選擇m的概率*(其後元素不被選擇的概率+其後元素被選擇的概率*不替換第m個物件的概率),即

382. 鍊錶隨機節點

*/398. 隨機數索引

演算法 蓄水池抽樣

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

蓄水池抽樣演算法

給你乙個長度為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個數就是隨機選擇的。證明 這裡即需要證明每個數出現...