ランダム配列動揺アルゴリズム、アルゴリズムリザーバー

1.破壊ランダムアレイ(シャッフルアルゴリズム)

  結果は、持っているn個の可能な必要があり、そうでなければ、それは間違っている!:アルゴリズムの正しさの基準分析をシャッフル 長さnの完全な配列は、n個の配列があるので、これは、素敵な説明です!種、それは動揺した結果、N!種の合計を言うことです。アルゴリズムは、この事実を反映できるようにする必要があり、それは正しいです。

コード:

def shuffleArr(arr):
    l = len(arr)
    for i in range(l):
        rand = random.randint(i,l-1)
        arr[i],arr[rand] = arr[rand],arr[i]
    print(arr)

arr = [1,2,3,4,5]
shuffleArr(arr)

  

2.リザーバーアルゴリズム

シナリオ:ランダムデータ等しい確率を抽出するために、未知の長さの大規模なデータ・ストリーム

アルゴリズムのプロセス:

  データ配列のサイズは、N k個であることが必要なサンプルの数であると仮定する。

  最初のk個の要素を、アレイに配列の最初のk個の要素の受信アレイを構築します。

  次いで、最初の要素からのk + 1 (FRAC \ {K} {\ n}は\) 要素が(置換される配列内の要素の確率は同じである)アレイに置き換えられているかどうかを決定する確率。すべての要素を横断が完了したら、アレイ内の残りの要素は、サンプルを取る必要があります。

証明:

i番目の場合(\(i≤k\) )。ステップkの前の確率を1として選択されます。我々はステップk + 1に到着したとき、kは交換可能な要素の確率= + \(K + 1 \)要素選択された確率\(\タイムズ\)確率は、iは、すなわち、選択された置換(\ \ K FRAC {} + {K}。1 \タイムズ\ FRAC。1 {{}} K \)これは、確率のために予約された\(1- \ FRAC。1 {{}} = Kの+。1 \ K FRAC {} {}。1 K + \) そしてように、K + 2番目の要素を置換されていない確率\(1 - \ FRAC {K回\} {K + 2} \ FRAC {1} {K} = \ FRAC {K + 1} {K + 2 } \) 。操作がnステップと、選択された予約=確率*確率の確率、すなわち、置換されていません。

\(1 \回\ FRAC {K} {K + 1}回\ \ FRAC {K + 1} {K + 2}回\ \ FRAC {K + 2}、{K + 3}回\ ... \回\ FRAC {N - 1} {N} = \ FRAC {K} {N} \)

j番目の数の(\(J> K \) )。ステップjの確率は次のように選択されている\(\ K FRAC {J}} {\) 確率がj + 1番目の要素を置換されていない\(1 - \ K FRAC {} {} J + 1 \時間\ FRAC 1 {{}} = K \ FRAC {J} {J + 1} \。)操作がnステップと、選択された=確率を保持している確率は\(\タイムズ\)確率、すなわち、交換されるべきではない:\(\ FRAC {K} {J} \タイムズ\ FRAC {J} {J時間\ + 1} \ FRAC {回\ J + 1} {J + 2} \回\ FRAC {J + 2} {J + 3} ... \回\ FRAC {N - 1} {N} = \ FRAC {K} {N} \ ) 各要素のように、保持されている確率\(\ FRAC {K} {N} \ ) 。

コード:

import random
def ReservoirSamplingTest(k):
    N = 10
    pool = [i for i in range(N)]
    result = pool[:k]
    for i in range(k,N):
        r = random.randint(0,i+1)
        if r < k:
            result[r] = pool[i]
    return result

res = ReservoirSamplingTest(4)
print(res)

  

参考文献:

[1] シャッフリングアルゴリズム奥行き深さ-動揺アレイ-電源ボタン(LeetCode)

[2] リザーバサンプリングアルゴリズム(貯水池サンプリング) - alfred_zhong -ブログパーク

おすすめ

転載: www.cnblogs.com/nxf-rabbit75/p/11545315.html