集合论数据结构

Set theory data structure

本文关键字:数据结构 集合论      更新时间:2023-10-16

我有函数式编程背景,不习惯(高效的)c++数据结构。我需要一个数据结构,保持多个元素,如在struct element描述。在集合中,字段id必须是唯一的。

我想执行一个非常快速的集合比较,就像在集合理论中,例如,当比较集合{x1,x2,x3}{x4,x5}时,我想确定交集集{x5}(或{x2},在这种情况下是相等的),并从其他集合中减去集合,如{x1,x2,x3} {x5} = {x1,x3}

有没有……c++世界里的"集合论"数据结构?

struct element {
int id;
float value;
};
struct element x1 = {1, 1.0};
struct element x2 = {2, 2.0};
struct element x3 = {3, 3.0};
struct element x4 = {3, 3.1};
struct element x5 = {2, 2.0};

std::set,它实现了动态集合(动态意味着元素可以插入或删除)。为了使它与element结构一起工作,您需要一个只查看id的自定义比较函数。或者,您可以使用std::map<int, float>,这可能更适合您的问题。

要找到两个集合的交集,使用std::set_intersection算法。这需要排序范围,其中包括std::setstd::map中的迭代器范围。对于差异,使用std::set_difference

我只是想提一下,因为在处理集合时有一个非常好的数据结构,但它并不能满足你的所有需求,

但是你仍然可以记住它,如果你有这样的要求,

1)查询一个元素属于哪个集合

2)不同集合

的并集

都在次对数时间内,即几乎是常数。它叫做不相交集数据结构http://en.wikipedia.org/wiki/Disjoint-set_data_structure

struct element {
    int id;
    float value;
    element(int id_=0, float value_=0.0) : id(id_), value(value_) {}
    bool& operator==(const element& e) const
    {
        return id==e.id && value==e.value;
    }
};
element e1(1,1.0);
std::set<element> set_;
set_.insert(e1);

检查std算法可以执行的操作。http://www.cplusplus.com/reference/algorithm/