我正在尝试确定一种适合完成以下任务的方法。
我想在特定范围内(例如[0x0-0xffffffff])进行范围集合查找。值会以范围方式插入到该范围内(因此,如果我们使用T =唯一字符串,则可能插入(“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>
这引出了几个问题:
这种问题是否有通用名称,或者我能从类似类型的问题中获得启示?
在以下限制条件下,什么是理想的实现:
- 快速/非常快的查找时间
- 内存使用不会膨胀(即以下操作具有等效的占用空间)
- Insert [10,20], Insert[20,30], Remove[14,24]
- Insert [10,15], Insert[25,30]
- 与上一个类似,数据结构应对长期运行系统保持稳定
- 插入/删除时间不是极其糟糕的(虽然它们不需要像查找一样快)
给定一个理想的实现,你有关于如何在C++中使用它的建议吗?
感谢所有的回答和帮助。
std::hash_map<std::string, std::hash_set<long>>
。 - andre