一·算法描述
隨機從一組數據中取出一個,每個數據都有被隨機選中的相應概率
二.實現方式
實現算法有兩種方式
方式一:先計算出每個數據項的權重,然后依據權重依次將每個數據項放入一個數組中,數據項在數組中的個數與數據項的權重呈正相關,為了簡便,也可以將數據項的索引放到數組中,比如一組數據的權重依次是 5 2 2 1,則可以生成這樣一個數組:[0, 0, 0, 0, 0, 1, 1, 2, 2, 3],生成數組后,從數組中隨機選出一個作為結果。
優點:選取的時間復雜度為:O(1),算法簡單;
缺點:空間占用極大,如果權重和為10000,則需要一個長度為10000的臨時數組,造成極大的空間浪費;
方式二:先計算出權重和為sum,然后從1 ~ sum中隨機選取一個數字r,遍歷每個數據項,將每個數據項的權重相加,遇到權重和大於等於r就停止,當前數據項就是所得結果;
優點:沒有額外的空間占用,算法也比較簡單;
缺點:選取的時候要遍歷數組,事件復雜度為:O(n);
三.對於方式二,如果選取的權重數字較大,那么就要遍歷到數組較靠后的位置才能得到結果,極端情況下要遍歷完整個數組才能得到結果,所以為了較高權重的數據較早可以被找到,可以對權重進行降序排序
優點:提高了平均選取速度;
缺點:需要對數組進行排序;
四.代碼(js實現)
方式一:
方式二: