给出一个整型数组,计算去重后元素个数
eg:
int a[] = {1,2,3,1,2,3,3};
去重后元素个数为3
方法1:
暴力check是否重复,复杂度O(n^2)
对于a[m],顺序比较a[m-1],a[m-2].....a[0],全部不重复,去重后元素个数+1
代码:
int uniq_element(int* a, int len)
{
if(len <= 1)
{
return len;
}
int num = 1; //保存独立元素个数
int i, j;
//暴力比较咯
for(i = 1; i < len; i++)
{
for(j = i - 1; j >= 0; j--)
{
if(a[j] == a[i])
{
break;
}
else
{
continue;
}
}
if(-1 == j)
{
num++;
}
}
return num;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {1,2,3,1,2,3,3};
int count = uniq_element(a, sizeof(a) / sizeof(int));
cout << count << endl;
system("pause");
return 0;
}
方法2:
排序,去重,复杂度O(nlogn)
第一步:排序
第二部:两两比较去重
可以使用stl的算法sort和unique
代码:
int uniq_element(int* a, int len)
{
if(len <= 1)
{
return len;
}
//数组存入vector容器
vector<int> myvector (a, a + len);
vector<int>::iterator it;
//排序
sort(myvector.begin(), myvector.end());
//去重
it = unique (myvector.begin(), myvector.end());
//重置size
myvector.resize( it - myvector.begin() );
return myvector.size();
}
方法3:
使用二叉搜索树,复杂度O(nlogn)
将数据插入二叉搜索树,最后统计二叉搜索树数据个数
可以使用STL容器set
代码:
int uniq_element(int* a, int len)
{
if(len <= 1)
{
return len;
}
set<int> myset;
//数据插入set
for (int i=0; i<len; i++)
myset.insert(a[i]);
return myset.size();
}
方法4:
使用hash表,复杂度O(n)-O(n^2)
可以使用STL非标准容器hash_set
代码:
int uniq_element(int* a, int len)
{
if(len <= 1)
{
return len;
}
hash_set<int> myset;
//数据插入hashset
for (int i=0; i<len; i++)
myset.insert(a[i]);
return myset.size();
}
还有很多方法,位图、bloom filter.......
抛砖引玉,期待牛人补充