【问题标题】:Efficient mapping of ranges to groups of values范围到值组的有效映射
【发布时间】:2013-09-02 20:34:35
【问题描述】:

我正在尝试确定一种合适的方式来完成以下任务。

我想要范围 -> 在特定范围内设置查找(例如 [0x0 - 0xffffffff])。 值被插入到范围内(所以如果我们使用 T = 唯一字符串),我可能会 insert("beef3490", [0x1234, 0xFFFF]);并且单个 id 可能有多个插入,它们可能重叠也可能不重叠。此外,可能会插入其他重叠的值,并且它们重叠的地方我应该收到一组唯一字符串作为结果。 最后,值也可以从范围中删除(不一定匹配,但通常包含在它们的初始插入范围内)。

这是一个简化的示例用法:

insert("beef3490", [0x1234, 0xFFFF])
insert("beef3490", [0x11111, 0x22222])
insert("flam1456", [0x8000, 0xA0000])
remove("beef3490", [0x21000, 0x22000])
lookup(0x0) -> set<>
lookup(0x2000) -> set<beef3490>
lookup(0x9456) -> set<beef3490, flam1456>
lookup(0x21212) -> set<flam1456>
lookup(0x99789) -> set<flam1456>

这给我带来了一些问题:

  1. 是否有此类问题的通用名称,或者我可以从中找到见解的类似类型的问题?

  2. 考虑到以下限制,理想的实现是什么:

    • 快速/非常快的查找时间
    • 内存使用量不会膨胀(即以下操作占用空间相当)
      • 插入[10,20]、插入[20,30]、删除[14,24]
      • 插入 [10,15],插入 [25,30]
    • 同上,数据结构在长时间运行的系统上应该具有稳定性
    • 插入/删除时间并不是绝对可怕(尽管它们不需要像查找一样快)
  3. 给定一个理想的实现,您对在 C++ 中使用它有什么建议

感谢所有回复和帮助。

【问题讨论】:

  • 使用std::hash_map&lt;std::string, std::hash_set&lt;long&gt; &gt;
  • @andre:可悲的是,这会在错误的方向上进行查找!
  • 我认为数据结构有点像range tree
  • 一个interval tree 映射到字符串集?
  • @DietmarKühl:我看到了相似之处,但范围树似乎主要用于进行有效的范围查找(即查找(0x100,0xFFF)),而这种结构只会查找单个键,并期待匹配的值。

标签: c++ data-structures range interval-tree segment-tree


【解决方案1】:

是否有此类问题的通用名称,或者我可以从中找到见解的类似类型的问题?

这个问题是区间树或段树问题。 具体来说,树/数据结构需要执行重叠聚合操作。 这意味着当两个相交的范围被插入到结构中时,它们在两个范围内查找一个点的值等于 val(range A) + val(range B)。如果值是整数,则“+”操作可以是加法,或者在集合的情况下,它可以是联合操作。

在给定约束的情况下,理想的实现是什么

一种自平衡二叉搜索树(例如红黑树或替罪羊树),用于根据范围优化搜索。插入操作将根据需要额外与范围相交以产生正确的返回值。拆分范围的方式因您的要求而异,但通常是通过“加入”(丢弃有关原始范围的信息但占用空间较小)或“拆分”(仍可以从中推断出原始范围)。

给定一个理想的实现,您对在 C++ 中使用它有什么建议

boost::icl。 (升压区间容器库)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多