两个数组取交集算法的一些想法

转载 2016年08月31日 16:01:57

比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}。


算法一:在大多数情况,也就是一般的情况下,大家都能想出最暴力的解法,通常也就是采用遍历或者枚举的办法来解决问题。

该题需要找出两个数组的交集,最简单的一个办法就是用A数组里面的所有数去匹配B数组里面的数。假设两个数组的大小都是n,那么这种遍历的时间复杂度为O(n^2)。这个也是最复杂的情况了。


算法二:通常下,除了用暴力枚举的问题,还有另外一种外万金油的解法----预处理。其实思想和C语言中的预处理一样,对数据记性归一化处理。说白了,在这里就是对数组排序。我们知道数组排序的算法时间复杂度最低是O(nlogn),可以看到数量级已经低于算法一的时间复杂度。

那么在排好序好,怎么得到数组的交集呢?

假设我们已经有了两个排好序的数组:

A={1,2,4,6}
B={2,3,4,9}

那么我们只要分别对A和B设置两个指针i,j(或者直接说是下标),进行循环,伪代码如下:

int count()
{
total=i=j=0;

while(i<n && j<n)

{

if(a[i]<b[j]) i++;

else if(a[i]>b[j])j++

else
    total++;
}

    return total;

}

时间复杂度为O(n)

综合排序的时间复杂度则整体复杂度为:O(nlogn)



算法三:如果只是会了上面两种,还只能说是计算机的菜鸟,而且一般面试或者笔试题也不会这么简单。那么比O(nlogn)时间复杂度更低的是多少呢?一般就是O(n)。我们可以思考一下计数排序的算法。也就是把两个数组A和B都遍历到一个新的数组里,然后在统计重复的数字即可,这个时间复杂度就是O(n)。当然,计数排序是有条件的,也就是要求数组内数字的范围是已知并且不是很大。



算法四:上面的算法实现简单,也很容易达到题目的要求,但是还是有一些瑕疵,也就是非完美方案,同样根据算法三我们可以想出用哈希函数或者哈希表来解决问题。也就是将数组A哈希到哈希表中,然后继续将数组B哈希到哈希表中,如果发生哈希碰撞则统计加1,最后可以得出数组的交集。时间复杂度也就是哈希所有元素的复杂度O(n)。

最快速度求两个数组之交集算法与hash

该题目来自58同城的二面,用最快速度求两个数组之交集算法。 比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}。 算法一:在大多数情况,也就是一般的情况下,大家都能想...
  • Richard_More
  • Richard_More
  • 2016年04月04日 21:22
  • 7066

最快速度求两个数组之交集算法

该题目来自58同城的二面,用最快速度求两个数组之交集算法。 比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}。 文中总结出了四种解法,供大家分享探讨...
  • jianghuihong2012
  • jianghuihong2012
  • 2014年03月05日 20:09
  • 7211

js取数组两个数组的交集|差集|并集|补集|去重

/** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算,并将计算得的结果集返回 {%example ...
  • a597926661
  • a597926661
  • 2013年03月08日 13:02
  • 31632

求两个数组的交集和并集

晚上闲来无事,想起前两天查资料时候,看到别人一篇博客标题关于数组的交集和并集,晚上也随便写写,权当督促自己坚持经常练习练习写写小Demo。如下,先来一段求有序数组的交集的代码,代码如下:...
  • Johnnyz1234
  • Johnnyz1234
  • 2014年12月23日 19:08
  • 2427

求两个有序整型数组的交集

1. 问题描述  有两个有序的整型数组a和b(没有重复元素),他们的长度分别为lenA和lenB,求出他们的共同元素。   例如:a = 0,1,3,5,7,9,11;b = 2,3,4,7,11;...
  • Jeanphorn
  • Jeanphorn
  • 2015年06月06日 22:55
  • 11913

求两个数组的交集

问题: 给你两个排序的数组,求两个数组的交集。 比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5. 思路: 1. 每一次从B数组中取一值,然后...
  • xdrt81y
  • xdrt81y
  • 2014年08月12日 21:53
  • 1534

算法5:求两个已排序数组的交集和并集

问题描述求两个已排序数据的交集和并集,要求时间复杂度为O(m+n).解题思路A数组和B数组,A数组大小为m,B数组大小为n。 1、查找B数组的每个成员是否在A数组中,时间复杂度为O(mn) 2、由...
  • pplin
  • pplin
  • 2017年03月06日 14:47
  • 458

算法兴趣-----求两个已排序数组的交集和并集(算法复杂度O(N+M))

算法博客:http://blog.csdn.net/beiyeqingteng/article/category/710777 问题: 给你两个排序的数组,求两个数组的交集。 ...
  • buster2014
  • buster2014
  • 2015年11月28日 16:55
  • 2178

求两个数组的交集

原址:http://blog.csdn.net/itbuluoge/article/details/20566007?utm_source=tuicool 比如A={6,2,4,1}...
  • superleexpert
  • superleexpert
  • 2015年02月05日 18:38
  • 1634

golang set集合去重以及交叉并集计算

golang set集合去重以及交叉并集计算 转自:http://xiaorui.cc/?p=2944 我这边有个场景是针对数据去重,但又不是简单的去重,是有时间区间范围内的交集、并集计算...
  • yueguanyun
  • yueguanyun
  • 2017年03月21日 09:28
  • 1250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两个数组取交集算法的一些想法
举报原因:
原因补充:

(最多只允许输入30个字)