在两个容器C ++中搜索匹配项

时间:2013-11-06 12:19:38

标签: c++ algorithm search

我有一个关于如何有效搜索两个容器以便找到相同项目的问题。

例如,我有two list A, B,我想找出列表B中列表A的所有匹配项目。

在这种情况下,我需要有两个loopS,一个在另一个内。这不好,因为对于A的每个项目,我在B中进行了整个搜索。

你有一些想法或标准的lib(提升可以)来解决它;)?

非常感谢!

5 个答案:

答案 0 :(得分:4)

你可以std::sort()容器然后使用std::set_intersection()(我不完全确定这个算法的名称)。复杂度为O(n ln n + m ln m),而不是O(n * m),其中nm是序列的大小。

答案 1 :(得分:4)

从不同的答案中可以看出,有多种方法。任何这些都可以是正确的,具体取决于您的容器是什么,如果范围是排序和范围的典型大小,并且如果排序范围是一个选项。

  • 如果两个容器都已排序,std::set_intersection是最好的方法,它的复杂性为O(n+m)
  • 在比较和交换方面,对大小为n的容器进行排序具有复杂度O(n log(n))。对列表进行排序意味着交换列表节点,这很便宜。对矢量进行排序意味着实际交换元素,而成本取决于元素类型。
  • 对于一个已排序和一个未排序的容器,最好为排序范围中未排序范围的每个元素执行std::binary_search。其复杂性为O(n log(m)),其中n是排序范围的未排序m的大小。首先对未排序范围进行排序,然后使用set_intersection进行排序,其复杂度为O(n log(n) + m),这会更糟。
  • 如果有两个未分类的容器,则需要对其中一个进行排序,然后将binary_search应用于另一个的元素,复杂度为O((m+n) log(m)),因此如果两个容器都相同类型,对较小的容器进行分类更好。

答案 2 :(得分:3)

如果您有两个列表A(大小n)和B(大小为m),那么使用嵌套循环查找A中存在的B中的每个元素都是O(nm)。

我建议使用哈希集。如果你用B中的元素构建一个哈希集,你将花费O(m)构建集合,然后O(n)在hash_set(B)中查找A的每个元素。因此,复杂性将是O(n + m)

答案 3 :(得分:0)

也许你可以先在数组中对A和B进行排序。然后计算相同的元素。它是O(n * log(n)),但需要更多空间。

答案 4 :(得分:0)

如果您希望优化解决方案,则应该共享有关问题域的更多信息。例如,如果您知道列表中的所有项都是1到100之间的整数,那么您可以使用简单的布尔数组[100],并通过在A上运行一次(提升相应的标志)然后执行一次来完成任务在B(测试旗帜)。

如果列表具有任意内容,则必须满足通用解决方案。天真的解决方案是像你建议的那样有一个双循环,这不一定是那么糟糕。您可以进行一些实际的优化:

  1. 外循环应该在较短的列表上完成(前提是你知道它们的长度)。这意味着一旦找到你的物品,你的内环就会破裂(如果你发现它......)。
  2. 如果内存不是问题,你可以对两个列表进行排序,然后并行进行两个列表的进展,只要另一个列表的项目更大(就像你在它们之间进行排序合并一样),就在一个列表上前进。这具有O的数量级(NlogN + MlogM + max(N,M)),其可能优于O(N * M),但在存储器方面也是浪费的。