查找给定数组中是否重复任何元素的最佳方法?

时间:2010-01-25 05:37:20

标签: c arrays

查找给定数组中是否重复任何元素的最佳最佳方法是什么?

6 个答案:

答案 0 :(得分:5)

将元素放在哈希表中,对任何冲突进行值相等比较。

答案 1 :(得分:3)

如果我们认为重复项可能超过两个,例如:{2,3,2,2,2,5,5,7,7},这里我们需要构建一个哈希表,然后查找非重复

使用STL地图容器它变得非常容易:(问题没有标记为C ++,但STL会使哈希工作变得干净)它还可以处理案例所有独特的案例。

  #include <iostream>
  #include <vector>
  #include <iterator>
  #include <map>
  using namespace std;

 int main(void){
      map<int,int> array;
      map<int,int>::iterator ii;

    int arr[] = {2,3,5};
    vector<int> unique_list;
    int size = sizeof(arr)/sizeof(arr[0]);

    for(int i = 0; i<size; i++)
          ++array[arr[i]];

     bool flag = false;

    for(ii=array.begin();ii != array.end(); ++ii)
     if(ii->second == 1){
         flag = true;
         unique_list.push_back(ii -> first);
       }

   if(flag == true){
      cout<<"Unique element(s): ";
      copy(unique_list.begin(),unique_list.end(),ostream_iterator<int>(cout," "));
     }
   else
     cout<<"All elements have dulicate"<<endl;

   return 0;
 }

复杂度为O(n),因此仍处于线性时间。

答案 2 :(得分:3)

大多数其他答案都提到哈希表,并且实际上是最优的,因为它在O(n)中完成了工作。

另一种方法,不使用哈希表。只需对数组进行排序(使用qsort)并迭代元素,检查两个相邻元素是否相同。排序使相同的元素组合在一起,因此可以轻松检查重复项。当然,这是O(nlog)并且将改变原始数组的顺序,但是更短并且省去了编写哈希表的麻烦。

答案 3 :(得分:2)

一般来说,这是一个O(n)问题。您需要检查每个元素,通常使用哈希表。如果它已排序,您可以只看一个左侧和一个右侧。

答案 4 :(得分:0)

我认为Bloom Filter很适合这个问题,可能是空间要求低于哈希表所需要的。 (虽然它确实有误报)

答案 5 :(得分:0)

可能不是您正在寻找的解决方案,但是:

  • 如果元素是整数
  • 如果您知道其最大可能值MAX

构建一个大小为DUPS的数组[MAX],其中每个元素为零;解析原始数组ORIG,并为每个元素i

int i;
for ( i = 0 ; i < DUPS_SIZE ; i++ )
    if ( DUPS[ORIG[i]] == 1 ) 
        return true; /* the original array has duplicate elements */
    else
        DUPS[ORIG] = 1;
return false;

或者您可以按随机顺序迭代ORIG。最坏的情况仍然是O(DUPS_SIZE)。