检查向量中的重复项

时间:2010-05-18 19:56:10

标签: c++

  

可能重复:
  Determining if an unordered vector<T> has all unique elements

我必须检查一个载体是否有重复。解决这个问题的最佳方式是什么:

我取第一个元素,将它与向量中的所有其他元素进行比较。然后采取下一个元素并执行相同的操作等等。

这是最好的方法,还是有更有效的方法来检查重复?

5 个答案:

答案 0 :(得分:14)

如果您的载体是STL容器,解决方案很简单:

std::sort(myvec.begin(), myvec.end());
std::erase(std::unique(myvec.begin(), myvec.end()), myvec.end());

根据cppreference(https://en.cppreference.com/w/cpp/algorithm/unique),元素会被移动,以便从myvec.begin()到返回值std::unique的值都是唯一的。 std::unique返回的迭代器之后的元素未指定(在我看过的每个用例中都没用),因此使用std::vector<A>std::vector<A>::erase中删除它们。

答案 1 :(得分:12)

使用插入每个元素的hash table。在插入元素之前,请检查它是否已存在。如果是,你自己就是副本。平均值为O(n) ,但最糟糕的情况与您当前的方法一样糟糕。

或者,您可以使用setO(n log n)最坏情况下执行相同的操作。这和排序解决方案一样好,除了它不会改变元素的顺序(因为你创建了一个集合后使用了更多的内存)。

另一种方法是将矢量复制到另一个矢量,对其进行排序并检查那里的相邻元素。我不确定这是否比设置解决方案更快,但我认为排序比一组使用的平衡搜索树增加了更少的开销,所以它在实践中应该更快。

当然,如果你不关心保持元素的原始顺序,只需对初始向量进行排序。

答案 2 :(得分:1)

排序然后比较相邻元素是要走的路。排序采用O(n log n)比较,然后是另外的n-1来比较相邻元素。

问题中的方案将进行(n ^ 2)/ 2次比较。

答案 3 :(得分:1)

如果您不关心偶尔的误报,可以使用Bloom Filter来检测集合中可能存在的重复项。如果无法接受误报,请获取未通过过滤器的值并对其执行第二次检测。失败值列表应该相当小,尽管需要根据完整输入进行检查。

答案 4 :(得分:0)

您也可以使用binary_search。

以下是两个可以帮助您的好例子:

http://www.cplusplus.com/reference/algorithm/binary_search/

http://www.cplusplus.com/reference/algorithm/unique_copy/