繁体   English   中英

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] 都是子集,因此 output 为true

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM