一·算法描述
随机从一组数据中取出一个,每个数据都有被随机选中的相应概率
二.实现方式
实现算法有两种方式
方式一:先计算出每个数据项的权重,然后依据权重依次将每个数据项放入一个数组中,数据项在数组中的个数与数据项的权重呈正相关,为了简便,也可以将数据项的索引放到数组中,比如一组数据的权重依次是 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实现)
方式一:
方式二: