如何求两个数组的交集2015-09-04题目意思大概是这样的:给定两个大数组(1w以上1亿以下),用最有效的方法找出来两个数组的交集。对于这道题,我有一个思路就是,先对数组进行排序,然后用两个指针在已排序的数组上轮流指向头结点,进行比较。比较亮的地方,就是在于这个比较的方式了。首先,比较的时候,要先确定两个指针指向的内用是否一致。如果一致,那么这个点,就是交集的一个元素,没问题吧?这里有一个问题就是,接下来如何比较?步骤是这样的:先比较两个指针指向内容的大小,指向结果小的指针,开始递增,直到较小的指针指向的值大于或等于另一个指针。而接下来另一个指针也采用同样的方法,此时这个较大的指针已经变成了较小的指针,递增,直到比大于或等于另一个指针。上面两轮比较完成后,如果指向的值相等,那么,保存这个数据,同时进行相同数据的处理,代码中会有体现。然后两个指针++,接着进行下一轮比较就可以了。采用这种方法,就能够求出两个大数组的交集,效率还是不错的。如果两个数组的长度分别为m和n,算上快排所需的时间,那么总时间效率为:O(nlog(n) + mlog(m) + m + n)应该说还不错。空间效率则为O(1)//不算交集的数据存储首先说下:如果你觉得代码中出现了英文注释就觉得代码不是我写的,那么我只能说:你out了~其实主要的原因还是方便,而且codeblocks上的汉子很难看……另外我的这个代码先用一个程序生成了两个比较大的随机数据文件,个数分别是1w和2w。随机数据文件生成代码如下:
#include <iostream>#include <fstream>#include <vector>#include <cstdlib>#include <ctime>using namespace std;int main(){cout << "Hello world!" << endl;ofstream fout;vector<int> ArrayOne;vector<int> ArrayTwo;int n = 10000;int m = 20000;srand(time(NULL));for(int i = 0;i < n;++ i)ArrayOne.push_back(rand());for(int i = 0;i < m;++ i)ArrayTwo.push_back(rand());fout.open("A.txt", ios_base::out | ios_base::trunc);for(int i = 0;i < n;++ i)fout << ArrayOne[i] << ends;fout.close();fout.open("B.txt", ios_base::out | ios_base::trunc);for(int i = 0;i < m;++ i)fout << ArrayTwo[i] << ends;fout.close();return 0;}