C ++设置如何检查集合列表是否包含子集

C++ set how to check if a list of sets contains a subset

我有一个集合列表,现在列表是一个向量,但它不需要是。

vector<unordered_set<int>> setlist;

然后我用一些数据填充它,举个例子,它看起来像这样:

[ {1, 2}, {2, 3}, {5, 9} ]

现在我有另一套,可以这样说:{1, 2, 3}

我想检查列表中的这些集合是否是上述集合的子集。例如,setlist[0] 和 setlist[1] 都是子集,因此输出为 true

我的想法是遍历整个向量并使用 std::includes 函数检查是否有任何索引是子集,但我正在寻找一种更快的方法。这可能吗?

考虑改用 set<int> 列表。这允许您使用 std::include。 运行 在按集合中的元素数排序后(即从元素数最少的集合到项目数最多的集合)对向量进行循环。内部循环将从当前索引开始。这可以避免您检查较小集合中是否包含较大集合。

如果整数的范围不是太大,可以考虑用std::bitset实现集合(如果包含n则位n为真)。然后通过非常快速的逻辑运算(例如 subset & large_set == subset)完成包含测试。您仍然可以按 count 对向量进行排序,但不确定是否需要考虑逻辑运算的速度。