【发布时间】: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>
这给我带来了一些问题:
是否有此类问题的通用名称,或者我可以从中找到见解的类似类型的问题?
考虑到以下限制,理想的实现是什么:
- 快速/非常快的查找时间
- 内存使用量不会膨胀(即以下操作占用空间相当)
- 插入[10,20]、插入[20,30]、删除[14,24]
- 插入 [10,15],插入 [25,30]
- 同上,数据结构在长时间运行的系统上应该具有稳定性
- 插入/删除时间并不是绝对可怕(尽管它们不需要像查找一样快)
给定一个理想的实现,您对在 C++ 中使用它有什么建议
感谢所有回复和帮助。
【问题讨论】:
-
使用
std::hash_map<std::string, std::hash_set<long> > -
@andre:可悲的是,这会在错误的方向上进行查找!
-
我认为数据结构有点像range tree。
-
一个interval tree 映射到字符串集?
-
@DietmarKühl:我看到了相似之处,但范围树似乎主要用于进行有效的范围查找(即查找(0x100,0xFFF)),而这种结构只会查找单个键,并期待匹配的值。
标签: c++ data-structures range interval-tree segment-tree