[528]. 按权重随机选择

  • 题目
  • 算法设计:加权随机取样

题目

传送门:528. 按权重随机选择

输入:
["Solution","pickIndex"]
[[[1]],[]]输出:
[null,0]解释:
Solution solution = new Solution([1]);
solution.pickIndex(); // 返回 0,因为数组中只有一个元素,所以唯一的选择是返回下标 0。

算法设计:加权随机取样

加权随机取样,和等概率随机取样不同。

特意制造概率不等的取样,但概率并非任意设定,而是按照定量的权重。

假设我们有数组 w: [1, 2, 3, 4], 那么这个数组的的和为 1 + 2 + 3 + 4 = 10。

对应的我们得到 index {0,1,2,3} 的概率为 {1/10, 2/10, 3/10, 4/10}。‘

数组和为 10,那 rand() % 10 这里产生的数字是 0-9。

我们用数字区间来划分:

  • 0 :取到 index 0,代表概率 1/10
  • 1,2: 取到 index 1,代表概率 2/10
  • 3,4,5: 取到 index 2,代表概率 3/10
  • 6, 7, 8, 9: 取到 index 3,代表概率 4/10

抽象一下:

  • 0 ~ w[0]-1 :取到 index 0,代表概率 1/10
  • w[0] ~ w[0] + w[1] - 1: 取到 index 1,代表概率 2/10
  • w[0] + w[1] ~ w[0] + w[1] + w[2] - 1: 取到 index 2,代表概率 3/10
  • w[0] + w[1] + w[2] ~ w[0] + w[1] + w[2] + w[3] -1: 取到 index 3,代表概率 4/10
  • ······
  • w[0] + w[1] + ··· + w[n-2] ~ w[0] + w[1] + ··· + w[n-1] - 1:取到 index n-1,代表概率 n/10

图片,好分析一点:

红色框部分,是前缀和。

前缀和的意思是,从位置 0 到位置 i-1 这个区间内的所有的数字之和。

用以上的例子产生的前缀和表 [1, 3, 6, 10], 可以发现我们用得到的数字调用 upper_bound() 会刚好使其指向我们的 index 位置。

upper_bound():查找大于目标值的第一个元素。

  • 0 的 upper_bound 会指向 index 0, 因为第一个比 0 大的数是 w[0] = 1;
  • 1, 2 的 upper_bound 会指向 index 1, 因为第一个比 1 或者 2 大的数是 w[1] = 3;
  • 3,4,5 的 upper_bound 会指向 index 2, 因为第一个比 {3, 4, 5} 大的数是 w[2] = 6;
  • 6, 7, 8, 9 的 upper_bound 会指向 index 3, 因为第一个比 {6,7, 8, 9} 大的数是 w[3] = 10;
class Solution {vector<int> presum;   // 保存前缀和
public:Solution(vector<int>& W) {int n = W.size();presum.push_back(W[0]); for(int i = 1; i < n; ++i) presum.push_back(presum.back() + W[i]);// presum.back():返回数组最后一个元素}int pickIndex() {int weight = rand() % presum.back();return upper_bound(presum.begin(), presum.end(), weight) - presum.begin();// upper_bound():查找大于目标值的第一个元素// 满足 presum[i] < 5 且 presum[i] 最大}
};

时间复杂度: θ ( l o g n ) \theta(log~n) θ(log n),二分查找实现的 pickIndex(),Solution 类构造函数是 θ ( n ) \theta(n) θ(n)

空间复杂度: θ ( n ) \theta(n) θ(n)

[528]. 按权重随机选择相关推荐

  1. 528. 按权重随机选择

    528. 按权重随机选择

  2. Java实现 LeetCode 528 按权重随机选择(TreeMap)

    528. 按权重随机选择 给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比. 说明 ...

  3. LeetCode 528. 按权重随机选择(前缀和+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 ...

  4. 随机数生成生成器和力扣按权重随机选择 528

    随机数生成生成器和力扣按权重随机选择 528 在linux下内核有个专门内核模块进行生成随机数 /dev/random 不是很精准 /dev/urandom 更精准 原理 是内核的一个模块,专门产生的 ...

  5. 根据权重做随机选择的算法

    1.随机选择算法. 要求是根据不同的权重值随机出现对应的气泡. 思路: 将所有的权重值相加,形成一个整体的区间[W1,W2],将每个权重都划分为小到子区间[w1,w2]. 每次做随机选择时,在整体的大 ...

  6. 负载均衡算法-权重随机均衡

    权重随机均衡(Weighted Random):此种均衡算法类似于权重轮询算法,不过在处理请求分担时是个随机选择的过程.

  7. 权重随机算法的java实现

    一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...

  8. java 权重_权重随机算法的java实现

    一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...

  9. php判断数组不重复的元素,php从数组中随机选择若干不重复元素

    php从数组中随机选择若干唯一元素 /* * $array = the array to be filtered * $total = the maximum number of items to r ...

最新文章

  1. [C#-SQLite] SQLite一些奇怪的问题
  2. c++/cli中app.config
  3. 利用寄存器进入栈值交换
  4. java游戏有个按技能是旋风_快打旋风加难技能增强版
  5. java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)
  6. java 随机生成中文姓名 工具类
  7. laydate限定某天不可选
  8. 天津科技大学计算机科学与信息工程学院,天津科技大学计算机科学与信息工程学院简介...
  9. Play 1.x 学习资料汇总
  10. url地址中有特殊符号“引号”引发的错误
  11. Docker之alpine自定义阿里云镜像
  12. 玩转Eclipse的Wildfly安装、配置到部署
  13. 刚刚,阿里重磅发布机器学习平台PAI 3.0!
  14. 电机坐标变换simulink仿真(笔记)
  15. springboot + JPA 配置双数据源
  16. tf-gpu为啥子不会并行??——总是只用一个卡
  17. 3D建模:极限精度挑战-仿真女神赵丽颖
  18. win7找不到服务器的dns错误怎么办,Win7百科:Win7系统DNS错误怎么办
  19. 安卓手机H5页面判断wifi还是数据
  20. android DevicePolicyManager实现一键锁屏

热门文章

  1. 肺结节CT影像特征提取(一)——肺结节CT图像特征概要
  2. 通过MailServer和Foxmail搭建本地邮件服务器及实现本地邮箱账号收发邮件
  3. 相对定位android,android 相对定位布局方向
  4. ST电机库v5.4.4源代码分析(8): 旋编怎么对齐
  5. springboot8==调用百度地图API从浏览器获取经纬度,后端使用geodesy依赖计算配送距离
  6. UPPAAL怎么使用
  7. 高性能计算系统——大数据/快速数据分析中的高性能技术
  8. 批处理-批量修改文件名
  9. mixin-- 混入
  10. windows Visual Studio error LNK2001: unresolved external symbol可能的原因