高效检查子集

时间:2016-02-19 19:20:52

标签: bitarray

给出两个长度为'n'的bitset对象'B1'和'B2'。什么是有效的方式来说明'B2'中设置的所有位是否也在'B1'?

示例:

B1 = 110111
B2_bad = 011001
B2_good = 100001

那么,'B1'和'B2_good'是好的但不是'B1'和'B2_bad'?

1 个答案:

答案 0 :(得分:0)

嗯,我想以下两种方法可能有所帮助。您可能需要对它们进行基准测试,因为它更快。

std::bitset<6> B1 (std::string("110111"));
std::bitset<6> B2_bad (std::string("011001"));
std::bitset<6> B2_good (std::string("100001"));
    //////////////One way/////////////////////////
    if ( (~B1 &= (B2_bad)).any()) std::cout << "No" << std::endl;
    else std::cout << "Yes" << std::endl;

    if ( (~B1 &= (B2_good)).any()) std::cout << "No" << std::endl;
    else std::cout << "Yes" << std::endl;

    ///////////////Second way//////////////////
    int i =0;
    for (i = 0; i < B1.size(); ++i) if (B2_bad[i] == 1 && B1[i] == 0) break;
    if (i == B1.size()) std::cout << "Yes" << std::endl;
    else std::cout << "No" << std::endl;

    for (i = 0; i < B1.size(); ++i) if (B2_good[i] == 1 && B1[i] == 0) break;
    if (i == B1.size()) std::cout << "Yes" << std::endl;
    else std::cout << "No" << std::endl;`

可能比我更熟练的人可以评论他们的表现。但我最好的猜测是第一种方法利用库函数,它应该提供最佳性能,但是如果你的大多数查询都有'结果否'而B1-B2不会在早期位之一上达成一致,那么第二种方法可能会有更好的运行时间。因为,涉及的库函数具有最差的运行时复杂度O(n)。