一·算法描述
随机从一组数据中取出一个,每个数据都有被随机选中的相应概率
二.实现方式
实现算法有两种方式
方式一:先计算出每个数据项的权重,然后依据权重依次将每个数据项放入一个数组中,数据项在数组中的个数与数据项的权重呈正相关,为了简便,也可以将数据项的索引放到数组中,比如一组数据的权重依次是 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实现)
方式一:
方式二:
标签:数据项,加权,遍历,权重,平均数,选取,算法,数组 来源: https://www.cnblogs.com/youyouly/p/13946742.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。