提升不相交的区间集

时间:2015-04-19 23:47:10

标签: c++ boost intervals disjoint-sets

我正在尝试使用boost:disjoint_sets用于非重叠间隔(在我的情况下,集合中的间隔必须在其成员之间没有交集),由以下结构表示:

struct dataum {
  int x,y;
  bool operator< (const dataum& o) const { return   y < o.x ; }
  bool operator==(const dataum& o) const {
    if(x <= o.x && o.x <= y && y <= o.y )
        return true;
    if(x <= o.x && o.y <= y)
        return true;
    if(o.x <= x && y <= o.y)
        return true;
    if(o.x <= x && x <= o.y && o.y <= y )
        return true;
    return false;
  }
  bool operator!=(const dataum& o) const {
    return !operator==(o);
  }
};

假设我有一个间隔列表,例如([1,3],[4,5],[6,10],[8,9])。我初始化一个不相交的集合如下:

    boost::disjoint_sets<
    associative_property_map<std::map<dataum,int>>,
    associative_property_map<std::map<dataum,dataum>> > ds(
            make_assoc_property_map(rank),
            make_assoc_property_map(parent));

然后我在列表的所有元素中执行make_set,这将导致4个不相交的集合,对吧?在此之后,我执行以下操作:

std::cout << ds.count_sets(S.begin(), S.end()) << std::endl;
ds.union_set(S[0],S[1]);
ds.union_set(S[1],S[2]);
std::cout << ds.count_sets(S.begin(), S.end()) << std::endl;

我不明白为什么最后一个cout说我只有一套,在我的理解中应该说我有2套{[1,3],[4,5],[6,10] ]}和{[8,9]}。

任何人都可以帮我理解发生了什么吗?

1 个答案:

答案 0 :(得分:0)

我不完全确定我会得到你想要做的,但是看看Boost ICL:

<强> Live On Coliru

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

using dset   = boost::icl::split_interval_set<int>;
using dataum = dset::interval_type;


int main() {
    dset data;
    for (auto i : {
            dataum::closed (1,3),
            dataum::closed (4,5),
            dataum::closed (6,10),
            dataum::closed (8,9),
            })
    {
        data.insert(i);
        std::cout << data << "\n";
    }
}

输出

{[1,3]}
{[1,3][4,5]}
{[1,3][4,5][6,10]}
{[1,3][4,5][6,8)[8,9](9,10]}