【问题标题】:How do I check if one vector is a subset of another?如何检查一个向量是否是另一个向量的子集?
【发布时间】:2016-08-09 04:58:30
【问题描述】:

目前,我认为我最好的选择是使用std::set_intersection,然后检查较小输入的大小是否与set_intersection填充的元素数相同。

有没有更好的解决方案?

【问题讨论】:

标签: c++ subset set-intersection


【解决方案1】:

试试这个:

if (std::includes(set_one.begin(), set_one.end(),
                  set_two.begin(), set_two.end()))
{
// ...
}

关于includes()

includes() 算法比较两个 排序后的序列并返回 true if 范围内的每个元素 [start2, finish2) 包含在范围内 [开始1,结束1)。它返回假 否则。 includes() 假设 序列使用排序 operator

运行

最多 ((finish1 - start1) + (finish2 - start2)) * 执行 2 - 1 次比较。

加上 O(nlog(n)) 用于对向量进行排序。没有比这更快的了。

【讨论】:

  • 我相信 std::set_intersection 将执行与上述相同的操作(即 (2 * (count1 + count2)) - 1 次操作)
  • 好吧,最坏的情况是一样的,但如果结果为假,则包含会更快地完成它的工作。而且您还可以在交集处使用另一个向量。顾名思义,应该使用 set_intersection 来查找该交集,并包括用于检查一个集合是否是另一个集合的子集。
  • 如果你的数据在std::set,你可以使用std::set_difference
  • set_intersection 和 set_difference 是对称操作,其中 include 是不对称的。它们不能相互替代。
  • @Klark:那么 unordered_set 呢?假设哈希中没有冲突,您可以获得 O(n)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多