我有一组std :: set集合,我想以最快的方式找到该集合中所有集合的交集。该集合中的集合数量通常非常小(〜5-10),每个集合中的元素数量通常少于1000,但有时可能会增加到约10000。但是,我需要执行这些交集数万次,尽可能快地完成。 我尝试了以下几种方法进行基准测试:
- 在std :: set对象中进行就地交集,该对象最初复制第一个集合。然后对于后续集合,它会遍历自身和集合的第i个元素,并根据需要从自身中删除项目。
- 使用std :: set_intersection进入临时std :: set,将内容交换到当前集合,然后再次查找当前集合与下一个集合的交集并插入临时集,依此类推。
- 像1)中一样手动迭代所有集合的所有元素,但是使用vector作为目标容器而不是std :: set。
- 与4相同,但使用std :: list而不是vector,怀疑list将提供更快的从中间删除。
- 使用哈希集(std :: unordered_set)并检查所有集合中的所有项。
std::unordered_map
并计算每个元素的出现次数。它在元素总数为O(N)的情况下运行。然后,您只需选择具有与集合数量相等的总数的元素,这在不同元素的数量为O(M)的情况下进行。不知道它的表现如何。 - Matthieu M.