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
对向量进行排序,但不确定是否需要考虑逻辑运算的速度。
我有一个集合列表,现在列表是一个向量,但它不需要是。
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
对向量进行排序,但不确定是否需要考虑逻辑运算的速度。