编程题:给定两个集合,求两个集合的交集
题目:给定两个整数集合,求两个集合的交集。
法一:排序法(先将集合排序,在找交集)
排序时间复杂度O(nlogn),对集合遍历查找O(n);总的时间复杂度O(nlogn);
void main()
{
int a[] = { 1, 5, 9, 8, 6, 4 };
int b[] = { 9, 4, 2, 0, 5, 11, 12 };
int alen = sizeof(a) / sizeof(int);
int blen = sizeof(b) / sizeof(int);
sort(a, a + alen);//排序
sort(b, b + blen);
vector<int> res; //保存结果
if (a[0] > b[blen - 1] || b[0] > a[alen - 1])
return;
int i = 0,j = 0;
while (i < alen &&j < blen) //查找
{
if (a[i]>b[j])
j++;
else if (a[i] < b[j])
i++;
else
{
res.push_back(a[i]);
cout << a[i] << " ";
i++; j++;
}
}
cout << endl;
}法二:位图法(很巧妙啊)
时间复杂度:O(n) ,空间复杂度取决于最短数组的最大值和最小值差O((max-min)/32);
void AndNums(int* a, int* b, int alen, int blen)
{
int min = 0, max = 0;
int *ps = NULL, *pl = NULL;
int len = 0, longlen = 0;
if (alen < blen)
{
ps = a;
len = alen;
longlen = blen;
pl = b;
}
else
{
ps = b;
len = blen;
longlen = alen;
pl = a;
}
min = max = ps[0];
for (int i = 1; i < len; ++i)
{
if (ps[i] < min)
min = ps[i];
if (ps[i]>max)
max = ps[i];
}
int gap = max - min;
gap = gap / 32 + 1; //存储差值要gap个int 类型的数
int *extra = new int[gap];
for (int i = 0; i < gap; ++i) extra[i] = 0;
int outInd, inInd;
for (int i = 0; i < len; ++i)
{
outInd = (ps[i] - min) / 32;
inInd = (ps[i] - min) % 32;
extra[outInd] |= 1 << inInd;
}
vector<int> res;
for (int i = 0; i < longlen; ++i)
{
if ((pl[i] - min >= 0) && (pl[i] - min <= max - min))
{
outInd = (pl[i] - min) / 32;
inInd = (pl[i] - min) % 32;
if (0 != (extra[outInd] & (1 << inInd)))
{
res.push_back(pl[i]);
cout << pl[i] << endl;
}
}
}
cout << endl;
}
void main()
{
int a[] = { 1, 5, 9, 8, 6, 4 };
int b[] = { 9, 4, 2, 0, 5, 11, 12 };
int alen = sizeof(a) / sizeof(int);
int blen = sizeof(b) / sizeof(int);
AndNums(a, b,alen,blen);
}
这种位图法,其实在空间要求不高的情况下,还有一种解法;
开始时A[max]=B[max]={0};
A={ 1 5 9 8 6 4};则令 A[1]=1 A[5]=1 A[9]=1 A[8]=1 A[6]=1 A[4]=1
然后遍历B i=1:lenth,判断A[ B[i] ]是否为1,若是,则为交集,反之就不是;(但是,这种方法,当元素值为负数的时候就不好办了)
法三:集合压缩法:见网址:http://blog.csdn.net/jie1991liu/article/details/13168255
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
