如何求两个数组的交集

题目意思大概是这样的:给定两个大数组(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 两个数组求交集,以便于您获取更多的相关知识。

时间: 2024-08-01 19:33:48

如何求两个数组的交集的相关文章

SQLServer中求两个字符串的交集_MsSql

使用javascript的数组来计算,代码如下: 复制代码 代码如下: use tempdb go if (object_id ('fn_getArray' ) is not null ) drop function dbo . fn_getArray go create function fn_getArray (@ inStr1 varchar (8000 ), @ inStr2 varchar (8000 )) returns varchar (8000 ) as begin declar

SQLServer中求两个字符串的交集

使用javascript的数组来计算,代码如下: 复制代码 代码如下: use tempdb go if (object_id ('fn_getArray' ) is not null ) drop function dbo . fn_getArray go create function fn_getArray (@ inStr1 varchar (8000 ), @ inStr2 varchar (8000 )) returns varchar (8000 ) as begin declar

JavaScript获取两个数组交集的方法_javascript技巧

本文实例讲述了JavaScript获取两个数组交集的方法.分享给大家供大家参考.具体如下: 这里传入的数组必须是已经排过序的 /* finds the intersection of * two arrays in a simple fashion. * * PARAMS * a - first array, must already be sorted * b - second array, must already be sorted * * NOTES * * Should have O(

两个数组比较的问题?

问题描述 int [] a={1,3,5,6,7,8,9,10} int [] b={1,2,3,4,5,6,7,8,9,10}如题,两个数组a数组八个数,b数组十个数,并且这两个数组都是按从小到大顺序排列的,咋用程序算出b数组比a数组多的两个数并且输出? (用肉眼一下就看出结果是2和4,可咋用程序实现呢, 想不出来) 解决方案 public class Test1 {/** * @param args */public static void main(String[] args) {int

JavaScript获取两个数组交集的方法

  本文实例讲述了JavaScript获取两个数组交集的方法.分享给大家供大家参考.具体如下: 这里传入的数组必须是已经排过序的 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /* finds the intersection of * two arrays in a simple fashion. * * PARAMS * a - first array, must alre

php数组函数序列之array_intersect() 返回两个或多个数组的交集数组_php技巧

array_intersect() 定义和用法 array_intersect() 函数返回两个或多个数组的交集数组. 结果数组包含了所有在被比较数组中,也同时出现在所有其他参数数组中的值,键名保留不变. 注释:仅有值用于比较. 语法 array_intersect(array1,array2,array3...) 参数 描述 array1 必需.与其他数组进行比较的第一个数组. array2 必需.与第一个数组进行比较的数组. array3 可选.与第一个数组进行比较的数组.可以有多个. 例子

python获得两个数组交集、并集、差集的方法_python

本文实例讲述了python获得两个数组交集.并集.差集的房部分.分享给大家供大家参考.具体如下: 1. 获取两个list 的交集 #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] #方法二 print list(set(a).intersection(set(b))) 2. 获取两个list 的并集 print list(set(a).union(set(b))) 3. 获取两个

sql 求两表交集两种方法

sql 求两表交集两种方法 dept表 id deptid 1 20 2 20 3 20 user表 id userid 1 33 2 34 3 34 方法一 select distinct userid from user u where id in (select id from dept where deptid=20) and not exists (select 1 from user where id in (select id from dept deptid=20) and us

输入集合A、B和全集C,求两集合的交集、并集、补集、差集

//输入集合A.B和全集C,求两集合的交集.并集.补集.差集 /* 并集:以属于A或属于B的元素为元素的集合成为A与B的并(集) 交集: 以属于A且属于B的元素为元素的集合成为A与B的交(集) 差:以属于A而不属于B的元素为元素的集合成为A与B的差(集) 补集:A的补集C-B */ /* 例如:A={1,2,3} B={2,3,4} C={1,2,3,4,5} AB并集为={1,2,3,4} 交集为={2,3} A补集={4,5} AB差集为={1} */ #include <iostream>