【发布时间】:2014-07-21 03:11:10
【问题描述】:
我被要求设计一个名为 smart-list 的数据结构,它保存具有真实键号的项目并提供下一个操作:
Insert(x) - 向列表中插入一个新元素。应该是 O(log n)。
移除最小值/最大值 - 移除并返回列表中的最小值/最大值元素。应该在 O(log n) 时间内。
Transform - 改变remove min/max的返回对象(如果是min则为max,反之亦然)。应该在 O(1) 中。
随机样本(k) - 返回从列表中随机选择的 k 个元素(k 大于 0 且小于 n)。应该在 O(min(k log k, n + (n-k) log (n-k)))。
关于结构的假设: 数据结构在任何阶段都不会包含超过 3n 个元素。 我们不能假设 n=O(1)。 我们可以使用 Random() 方法在 O(1) 时间内返回 [0,1) 和预成型之间的实数。
我设法使用最小-最大精细堆实现了前三种方法。但是,我对这个时间限制内的随机样本(k)方法一无所知。我能找到的只有“Reservoir sampling”,它在 O(n) 时间内运行。
有什么建议吗?
【问题讨论】:
-
你能解释一下你所说的“转换”操作是什么意思吗?我猜一棵红黑树似乎适合你的情况。
-
这是一道作业题吗?我怀疑在现实生活中是否有人会要求您在“O(min(k log k, n + (n-k) log (n-k)))”中找到样本。如果是家庭作业,那就去找你的助教。
标签: algorithm data-structures random-sample