【发布时间】:2021-03-08 17:30:58
【问题描述】:
我正在尝试设计一种支持随机弹出和插入操作的数据结构。一个元素根据其权重随机弹出。例如,如果数据结构具有权重为“10”和“20”的元素“a”和“b”,则元素“b”被弹出的可能性是“a”的两倍。 n 是元素的数量。权重可以是浮点数或整数,为>=0。
我认为段树或二叉索引树可能能够在 O(log n) 时间内实现这两种操作,但我不确定。谁有更好的主意?
【问题讨论】:
-
你能把这个问题说得更准确一些吗?即 1. 指定 n 是什么(我假设数据结构中的元素数量)2. 指定权重的限制,例如“仅自然数 或 “仅来自预定义集合 {1, 2, 5} 的权重”。限制越多,解决方案可能越有效。 3. 只是为了确保:这不像是优先级队列,而更像是一个集合?例如。当您有 (a,1), (b,2), (c,2) 时,第一个弹出操作可能会以 2/(1+2+2) 的概率返回 c。这是正确的吗?
-
@Socowi 我刚刚添加了更多细节。对于你的第三个问题,是的,这是正确的。元素应该以它们的权重除以元素的总权重的概率被弹出。
-
我建议在你的问题中避免使用“push”和“pop”这两个词,它们与堆栈的概念密切相关。命名法对于有效沟通很重要。