C++ 我可以用Boost interval_map来实现这一点吗?

C++ 我可以用Boost interval_map来实现这一点吗?,c++,algorithm,boost,data-structures,boost-icl,C++,Algorithm,Boost,Data Structures,Boost Icl,我想做的是有效地处理时间间隔。例如,在我的示例中,间隔如下所示: [10,20]、[15,25]、[40100]、[5,14] 区间是闭合的和整数的,有些区间可能是重叠的。我想高效地找到给定查询的重叠间隔。例如,如果给出了[16,22]: [10,20],[15,25] 上述间隔应计算为超高间隔 我目前正在写一个基于红黑树的区间树(参考:CLRS,算法简介)。虽然查找所有重叠的间隔可以是O(n),但运行时间应该更快。请注意,可以删除和插入间隔 然而,我刚刚发现Boost有interval\u

我想做的是有效地处理时间间隔。例如,在我的示例中,间隔如下所示:

[10,20]、[15,25]、[40100]、[5,14]

区间是闭合的和整数的,有些区间可能是重叠的。我想高效地找到给定查询的重叠间隔。例如,如果给出了
[16,22]

[10,20],[15,25]

上述间隔应计算为超高间隔

我目前正在写一个基于红黑树的区间树(参考:CLRS,算法简介)。虽然查找所有重叠的间隔可以是O(n),但运行时间应该更快。请注意,可以删除和插入间隔


然而,我刚刚发现Boost有
interval\u map
interval\u set

我试过了,但这种行为对我来说很奇怪。例如,如果先插入
[2,7]
,然后再插入
[3,8]
,则生成的映射将具有
[2,3)
[3,7]
(7,8]
。也就是说,插入新间隔时,将自动完成拆分


我可以关闭此功能吗?或者,Boost的
interval\u map
符合我的目的吗?

您要求提供一个能够有效查找重叠的数据结构。这可以通过在数据结构中存储重叠来实现。现在您似乎在抱怨它已经这样做了

此示例解释了逻辑:

typedef std::set<string> guests;
interval_map<time, guests> party;
party += make_pair(interval<time>::right_open(time("20:00"), time("22:00")),
guests("Mary"));
party += make_pair(interval<time>::right_open(time("21:00"), time("23:00")),
guests("Harry")); 
// party now contains
[20:00, 21:00)->{"Mary"} 
[21:00, 22:00)->{"Harry","Mary"} //guest sets aggregated on overlap
[22:00, 23:00)->{"Harry"}
typedef std::设置来宾;
间隔图党;
第三方+=配对(间隔:右开门(时间(“20:00”)、时间(“22:00”),
嘉宾("玛丽);;
参与方+=配对(间隔:右开门(时间(“21:00”)、时间(“23:00”),
嘉宾("哈利");;
//党现在包含
[20:00,21:00)->{“玛丽”}
[21:00,22:00)->{“哈里”,“玛丽”}//重叠上聚集的来宾集
[22:00,23:00)->{“哈利”}
当添加两个重叠的间隔时,实际上创建了三个具有不同属性的间隔。重叠在两个原始间隔中,使其在逻辑上不同于原始间隔中的任何一个。两个原始间隔现在跨越具有不同属性的时间(一些重叠原始间隔,一些不重叠)。这种拆分可以有效地查找重叠,因为它们在地图中是自己的间隔


在任何情况下,Boost都允许您选择。因此,如果您想要强制一个结构,使其更难找到重叠,您可以这样做。

我认为您可以使用
间隔映射
。每当您想要添加间隔
I
,只需添加
生成对(I,II)
到地图,其中
II
是只包含
I
集合

#include <iostream>
#include <boost/icl/interval_map.hpp>

using namespace boost::icl;

typedef std::set<discrete_interval<int> > intervals;

intervals singleton(const discrete_interval<int> &value) {
    intervals result = { value };
    return result;
}

int main() {
    interval_map<int, intervals> mymap;
    discrete_interval<int> i1 = discrete_interval<int>(2, 7);
    discrete_interval<int> i2 = discrete_interval<int>(3, 8);
    mymap.add(make_pair(i1, singleton(i1)));
    mymap.add(make_pair(i2, singleton(i2)));

    for (int i = 0; i < 10; ++i) {
        std::cout << "i: " << i << ", intervals: " << mymap(i) << std::endl;
    }
}
#包括
#包括
使用名称空间boost::icl;
typedef std::设置间隔;
区间单态(常数离散区间和值){
间隔结果={value};
返回结果;
}
int main(){
区间图mymap;
离散时间间隔i1=离散时间间隔(2,7);
离散时间间隔i2=离散时间间隔(3,8);
添加(make_pair(i1,singleton(i1));
add(make_pair(i2,singleton(i2));
对于(int i=0;i<10;++i){

std::cout我尝试了boost interval\u map和interval\u set。它们效率非常低。设置成本非常高,因为实现基本上将每个子间隔(交叉点)映射到包含它的所有间隔


我认为CLRS“算法简介”中的实现基于红黑树要好得多。奇怪的是,尽管std::set和std::map基于RB树,但没有红黑树实现允许扩展。

谢谢,但我需要保持原始间隔。所有支持的连接操作都会破坏原始间隔。谢谢,thoguh!原始间隔仍然存在。如果你看这个例子,你可以很容易地看到“Mary”的间隔是20-22。它们只是以一种使重叠有效的方式进行编码。我知道这是如何满足OPs请求的,但是有人能解释为什么Boost文档会说:注意,我们使用字符串集的间隔映射来引入间隔映射,因为它是s的教学优势。party示例用于立即了解区间映射和重叠聚合的基本思想。对于实际应用程序,不一定建议使用集合的区间映射。它与std::集合的std::映射具有相同的效率问题。我尝试了此代码,但它似乎无法编译。这是错误:“运算符+=”不匹配(操作数类型为“boost::icl::interval_-map”和“std::pair”)mymap+=make_-pair(i1,i1);啊,谢谢——我想我应该在那里的某个地方放一个集合。威尔编辑。实际上,我会很感激有一个编译示例。看我的问题:嗯,你叫我出来,这是我应得的。我假设页面上更高的代码实际上可以工作,并对其进行了修改;但现在我重写了示例,并实际编译和运行了它。通过“编译并运行”是指成功还是失败?