提供一个思路, 首先假设数组中的权重都是整数. (如果是浮点, 思路一样) 假设 数组为: a b c d 权重为: 88 23 10 7 按照权重排序后为: 数组为: d c b a 权重为: 7 10 23 88 权重和为128, 那么在1~128之间随机一个数字, 这个数字落在如下范围就选择对于的元素. 1~7: d 8~17: c 18~40: b 41~128: a 具体做法就是 预处理: 1. 对数组按照权重排序. (堆排序或者快排, 效率: N*LogN) 2. 遍历数组, 建立Map, key为权重范围, 值为元素的index. 同时统计权重总和. (效率: N*LogN, 空间: O(N) ) 每次使用: 3. 随机1到权重总和的数字, 在Map中搜索, 根据命中的元素的index选择随机到的元素即可. (效率: LogN, 400个元素的情况下, 平均比较2.6次) 如果是浮点的话, 需要转化为正数. 假设浮点数进度为6位, 那么所有权重乘以(10^6)取整即可. 如果存在溢出可能, 用long long存储权重值. 空间占用稍微大一些了.
33,008
社区成员
35,326
社区内容
加载中
试试用AI创作助手写篇文章吧