有效地将范围映射到值组

时间:2013-09-02 20:34:35

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

我正在尝试确定一种合适的方法来完成以下操作。

我想有范围 - >在特定范围内设置查找(比如[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>

这给我带来了许多问题:

  
      
  1. 是否存在此类问题的广义名称,或者我可以从中找到相似类型的问题?

  2.   
  3. 考虑到以下限制条件,理想的实施方案是什么:

         
        
    • 快速/非常快的查找时间
    •   
    • 内存使用不会膨胀(即以下操作具有相同的占用空间)
    •   
      •   
      • 插入[10,20],插入[20,30],删除[14,24]
      •   
    •   
      •   
      • 插入[10,15],插入[25,30]
      •   
    •   
    • 与last类似,数据结构应该在长时间运行的系统上具有稳定性
    •   
    • 插入/删除时间并不是非常糟糕(尽管它们不需要像查找一样快)
    •   
  4.   
  5. 鉴于理想的实现,您是否有在C ++中使用它的建议

  6.   

感谢所有回复和帮助。

1 个答案:

答案 0 :(得分:1)

  

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

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

  

给定约束

的理想实现是什么

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

  

鉴于理想的实现,您是否有在C ++中使用它的建议

boost::icl。 (Boost间隔容器库)