【发布时间】:2012-04-18 15:58:41
【问题描述】:
我正在寻找一种数据结构来帮助我管理整数池。这是一个池,我从池中删除整数一会儿,然后将它们放回原处,期望它们会再次被使用。但是,它还有一些其他奇怪的限制,因此常规池不能很好地工作。
硬性要求:
- 恒定时间访问使用中的最大整数。
- 整数的稀疏性需要有界(即使只是原则上)。
我希望整数彼此接近,这样我就可以在范围内使用最少的未使用整数快速迭代它们。
如果它们有助于选择数据结构,则使用它们,否则忽略它们:
- 池中的整数从 0 开始且连续。
- 池可以是固定大小的。
- 池中的整数仅用于短期高流失率。
我有一个可行的解决方案,但感觉不够优雅。
我的(次优)解决方案
固定大小的池。
将所有可用整数放入一个有序集合 (free_set)。
当请求一个新整数时,从 free_set 中检索最小的整数。
将所有正在使用的整数放入另一个排序集 (used_set)。
当请求最大时,从 used_set 中检索最大的。
有一些优化可能有助于我的特定解决方案(优先队列、记忆等)。但我的整个方法似乎很浪费。
我希望有一些深奥的数据结构可以完美地解决我的问题。或者至少是更好的池化算法。
【问题讨论】:
-
抱歉,堆 + 哈希集(或布隆过滤器,或者什么都没有,如果您不需要跟踪旧整数)有什么问题,当您弹出时只需填写一个新整数出一个旧的(或者当你想用新的整数填充时)?
-
used_set需要多于一个集合(至少是一个有序集合),否则检索最大整数不会是 O(1) 操作。另外,为什么还要预先填充free_set?当你需要一个新的整数并且空闲池为空时,只需构造一个新的。 -
the sparseness of the integers needs to be bounded (even if only in principal).- 你能详细说明这个要求吗? -
“基于 0 且连续”是否意味着您总是存储从 0 到 N 的所有整数?如果是这样,是否有任何理由存储除 N 之外的任何内容,因为您可以从 N 生成整个集合的其余部分?如果不是,那是什么意思?
-
@deft_code:所以这实际上是在描述您当前的实现,而不是问题本身。在问题本身中,您只是有一组稀疏的值,以及什么能够在恒定时间内获得最大的(可能是最小的?)?你说你的流失率很高,那么想必你也关心插入和删除速度?当您“搅动”时,您是删除所有当前内容并放入新的,还是插入和删除任意元素,并且需要随时知道最大的?
标签: algorithm optimization data-structures