小编典典

C ++测试2套不相交

algorithm

我知道STL具有set_difference,但我只需要知道2
sets是否不相交即可。我已经配置了我的代码,这使我的应用程序运行速度大大降低。有没有一种简单的方法来查看2个集合是否不相交,还是我只需要滚动自己的代码?

编辑:我也尝试过,set_intersection但花了相同的时间…


阅读 208

收藏
2020-07-28

共1个答案

小编典典

修改了hjhill的代码,以通过消除count()调用将复杂度降低O(log n)。

template<class Set1, class Set2> 
bool is_disjoint(const Set1 &set1, const Set2 &set2)
{
    if(set1.empty() || set2.empty()) return true;

    typename Set1::const_iterator 
        it1 = set1.begin(), 
        it1End = set1.end();
    typename Set2::const_iterator 
        it2 = set2.begin(), 
        it2End = set2.end();

    if(*it1 > *set2.rbegin() || *it2 > *set1.rbegin()) return true;

    while(it1 != it1End && it2 != it2End)
    {
        if(*it1 == *it2) return false;
        if(*it1 < *it2) { it1++; }
        else { it2++; }
    }

    return true;
}

我已经编译并测试了此代码,因此它应该很好。

2020-07-28