题目意思大概是这样的:给定两个大数组(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; }
返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 数组
, 求代码
, codeblocks
, 求注释
, 两个
, 一个
, 指向
, 求数组长度
, 交集
, 求交集
, 两个数组
, 数组交集
交集数组
求两个数组的交集、两个数组求交集、js求两个数组的交集、java求两个数组的交集、ios 两个数组求交集,以便于您获取更多的相关知识。