【发布时间】:2020-10-06 14:11:40
【问题描述】:
能否请您帮助我了解允许O(logN)(或至少O(sqrtN))对以下内容进行操作的数据结构:
- 插入具有
ID(int64_t) 和health(double) 的项目 - 删除
ID的项目 - 找到一个由
health随机加权的项目
首选语言是 C++ 或 C。加权随机是指:
考虑totalHealth=Sum(health[0], health[1], ..., health[N-1])。我需要一个快速(如上所述)的操作,相当于:
- 计算
const double atHealth = rand_uint64_t()*totalHealth/numeric_limits<uint64_t>::max(); - 遍历
i=0 to N-1以找到第一个i使得Sum(health[0], health[1], ..., health[i]) >= atHealth
约束:health[i] > 0、rand_uint64_t() 返回一个在0 和numeric_limits<uint64_t>::max() 之间均匀分布的整数值。
到目前为止,我尝试的是 C++ unordered_map,它允许 ID 快速插入 (Θ(1)) 并通过 ID 删除,但操作 #3 在 N 中仍然是线性的,如中所述我上面的伪代码。
非常感谢您的帮助!
【问题讨论】:
-
如果我对您的理解正确,您想要一个快速**分位数函数**(en.wikipedia.org/wiki/Quantile_function) 的数据结构?唯一的区别是你的分布是非标准化的。
-
如果您正在搜索,您将需要一个有序的结构,您是否尝试过
map?如果你不喜欢stl容器,还有abseil.io/docs/cpp/guides/container这些。 -
@SebastianHoffmann,我也不确定(对概率论不是很熟悉),但
health的值并没有绝对归一化:它们总和不等于 1,我认为它们的标准化将是一个额外的操作,也很繁重。
标签: c++ algorithm performance data-structures