首页 > 编程语言 >最快速度求两个数组之交集算法

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

时间:2023-04-03 13:02:26浏览次数:34  
标签:数组 交集 复杂度 算法 哈希 排序


该题目来自58同城的二面,用最快速度求两个数组之交集算法。


比如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)。



标签:数组,交集,复杂度,算法,哈希,排序
From: https://blog.51cto.com/u_15990596/6166079

相关文章

  • 从C#中的数组中删除指定元素的几种方法,超简单
    最近小编同事面试遇到了一道面试题,题目是有个int数组,把输入包含的指定元素删除。这道题主要考察C#基础知识和编码动手能力。小编将以如下几种方法实现,供大家参考。(注:文末还有扩展问题。)1、使用临时数组copy后替换这种方法涉及创建一个比原始数组小一个元素的新数组。然后,将原始......
  • 220602-多维数组的Jaccard指数计算
    背景:计算两个多维数据的交并商a=np.arange(0,9).reshape(-1,3)print(a)b=np.arange(4,13).reshape(-1,3)print(b)c=np.random.rand(4,3)print(c,'\n')A=np.concatenate([a,c],axis=0)B=np.concatenate([b,c],axis=0)print(A)print(B)defjaccard_ind......
  • js数组详解(四):排序API
    1.排序:   自定义排序:冒泡  排序API:arr.sort();    大问题:默认将所有元素转为字符串再按字符串排列         只能对字符串类型的元素正确排序    解决:自定义比较规则:      比较器函数:专门比较任意两值大小的......
  • day 34 1005.K次取反后最大化的数组和 | 134. 加油站 | 135. 分发糖果
    1005.K次取反后最大化的数组和给定一个整数数组A,我们只能用以下方法修改该数组:我们选择某个索引i 并将A[i]替换为-A[i],然后总共重复这个过程K次。(我们可以多次选择同一个索引i。)以这种方式修改数组后,返回数组可能的最大和。示例1:输入:A=[4,2,3],K=1输出:5解释:......
  • php查找判断二维数组中是否含有某个值
    $arr=array(array('a','b'),array('c','d'));in_array('a',$arr);//此时返回的永远都是falsedeep_in_array('a',$arr);//此时返回true值functiondeep_in_array($value,$array){forea......
  • 算法杂记 2023/04/02
    算法杂记2023/04/02目录算法杂记2023/04/02网易笔试第二题输入:输出:例子:6329.MakeK-SubarraySumsEqual网易笔试第二题给定一棵中序遍历的二叉树,如果当前树为空则表示为X,如果不为空则表示为(left_tree)cur_value(right_tree),其中left_tree和right_tree分别表示按此规则序......
  • 分治(Divide and Conquer)算法之归并排序
    顾名思义,分治问题由“分”(divide)和“治”(conquer)两部分组成,通过把原问题分为子问题,再将子问题进行处理合并,从而实现对原问题的求解。我们在排序章节展示的归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为1的子数组;“......
  • 树状数组
    当使用前缀和或者差分数组的时候,一般会遇到O(n2)的时间复杂度,此时我们可以使用树状数组来对时间复杂度进行优化。树状数组主要是利用树形结构来优化我们前缀和或差分数组的计算复杂度使得O(n)的时间复杂度变为O(logn),使用总的时间复杂度减少到O(nlogn).。构建树状数组的核心是lo......
  • C语言逆向——数组和结构体,数组多维只是一个编译构造的假象,本质会转成一维数组,结构体
    数组数组是C语言中非常重要的一个概念,学习C语言主要就是两个知识点:数组、指针,学好这两个,那么你的C语言一定也会很好。什么是数组?或者说什么情况下我们需要使用数组,比如说我们需要定义一个人的年龄,我们可以定义一个变量来表示,但是如果我们需要定义三个人的年龄呢?那就需要三个变......
  • Python 数据结构与算法详解
    一、数据结构与算法1、算法提出1.算法概念算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机按照确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。算法是独立......