[528]. 按权重随机选择
[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]. 按权重随机选择相关推荐
- 528. 按权重随机选择
528. 按权重随机选择
- Java实现 LeetCode 528 按权重随机选择(TreeMap)
528. 按权重随机选择 给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比. 说明 ...
- LeetCode 528. 按权重随机选择(前缀和+二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 ...
- 随机数生成生成器和力扣按权重随机选择 528
随机数生成生成器和力扣按权重随机选择 528 在linux下内核有个专门内核模块进行生成随机数 /dev/random 不是很精准 /dev/urandom 更精准 原理 是内核的一个模块,专门产生的 ...
- 根据权重做随机选择的算法
1.随机选择算法. 要求是根据不同的权重值随机出现对应的气泡. 思路: 将所有的权重值相加,形成一个整体的区间[W1,W2],将每个权重都划分为小到子区间[w1,w2]. 每次做随机选择时,在整体的大 ...
- 负载均衡算法-权重随机均衡
权重随机均衡(Weighted Random):此种均衡算法类似于权重轮询算法,不过在处理请求分担时是个随机选择的过程.
- 权重随机算法的java实现
一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...
- java 权重_权重随机算法的java实现
一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...
- php判断数组不重复的元素,php从数组中随机选择若干不重复元素
php从数组中随机选择若干唯一元素 /* * $array = the array to be filtered * $total = the maximum number of items to r ...
最新文章
- [C#-SQLite] SQLite一些奇怪的问题
- c++/cli中app.config
- 利用寄存器进入栈值交换
- java游戏有个按技能是旋风_快打旋风加难技能增强版
- java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)
- java 随机生成中文姓名 工具类
- laydate限定某天不可选
- 天津科技大学计算机科学与信息工程学院,天津科技大学计算机科学与信息工程学院简介...
- Play 1.x 学习资料汇总
- url地址中有特殊符号“引号”引发的错误
- Docker之alpine自定义阿里云镜像
- 玩转Eclipse的Wildfly安装、配置到部署
- 刚刚,阿里重磅发布机器学习平台PAI 3.0!
- 电机坐标变换simulink仿真(笔记)
- springboot + JPA 配置双数据源
- tf-gpu为啥子不会并行??——总是只用一个卡
- 3D建模:极限精度挑战-仿真女神赵丽颖
- win7找不到服务器的dns错误怎么办,Win7百科:Win7系统DNS错误怎么办
- 安卓手机H5页面判断wifi还是数据
- android DevicePolicyManager实现一键锁屏
热门文章
- 肺结节CT影像特征提取(一)——肺结节CT图像特征概要
- 通过MailServer和Foxmail搭建本地邮件服务器及实现本地邮箱账号收发邮件
- 相对定位android,android 相对定位布局方向
- ST电机库v5.4.4源代码分析(8): 旋编怎么对齐
- springboot8==调用百度地图API从浏览器获取经纬度,后端使用geodesy依赖计算配送距离
- UPPAAL怎么使用
- 高性能计算系统——大数据/快速数据分析中的高性能技术
- 批处理-批量修改文件名
- mixin-- 混入
- windows Visual Studio error LNK2001: unresolved external symbol可能的原因