查找给定数组中是否重复任何元素的最佳最佳方法是什么?
答案 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)。