使用集合测试关联的对称性

时间:2019-03-19 18:52:36

标签: c++ algorithm set relationship discrete-mathematics

我正在处理无符号typedef pair<unsigned, unsigned> OP;类型的有序对和有序对typedef set<OP> SOP;的集合。

我的程序的最终目标是检查set(relation)是否为等价关系。

我的问题:我已经设法检查集合是否自反,但目前我正在尝试检查集合(关系)中的有序对是否对称。我目前已经构造了两个for循环,以将有序对彼此进行比较,但是在比较中却陷入了死胡同。

我的代码:

for (auto it3 = sop.begin(); it3 != sop.end(); it3++) { // loop through each pair in set
        for (auto it4 = sop.begin(); it4 != sop.end(); it4++) { // compare with other pairs
           // make sure first and second items in pair are different
            while (it3->first != it3->second) {
               //If the case is that there is not an instance of 
               //symmetric relation return false  
                if (!((it3->first == it4->second) && (it3->second == it4->first))) {
                    return false;
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您的循环逻辑是完全有缺陷的。

内部while不会更改it3或it4。因此,它将返回false或将永远循环。另外,内部的for循环不利用集合有序的事实。

您正在寻找的测试要简单得多

sop上循环就足够了,并检查对称项是否也位于集合中。如果不是,那不是对称关系。如果所有人都成功找到了反面,那很好:

bool is_symetric (SOP sop) {
    for (auto it3 = sop.begin(); it3 != sop.end(); it3++) { // loop through each pair in set
        if (it3->first != it3->second) {
            if (sop.find({it3->second,it3->first })==sop.end()) {
                return false;
            }
        }
    }
    return true; 
}

Online demo

如果允许使用算法库,甚至还有一个更酷的解决方案:

bool is_symetric (SOP sop) {
    return all_of(sop.cbegin(), sop.cend(),
        [&sop](auto &x){ return x.first==x.second || sop.find({x.second,x.first })!=sop.end();}) ;
}

Online demo 2

更酷的是,如果您将其设为模板,则不仅可以与unsigned一起使用,而且可以与其他任何类型一起使用:

template <class T>
bool is_symetric (set<pair<T,T>> sop) {
    return all_of(sop.cbegin(), sop.cend(),
        [&sop](auto &x){ return x.first==x.second || sop.find({x.second,x.first })!=sop.end();}) ;
}

Online demo 3 (with unsigned long long)