两个整数集合最快算法求交集

这是来自腾讯2014年软件开发笔试题: AB两个整数集合,设计一个算法求他们的交集,尽可能的高效。

一、第一种算法,暴力求解,直接采用遍历或者枚举的方法,这种办法最简单易想,但是时间复杂度比较高,为
O(n^2),这是最复杂的情况。

二、
预处理。其实思想和C语言中的预处理一样,对数据记性归一化处理。说白了,就是对数组先进行排序。数组排序的算法时间复杂度最低是O(nlogn),数量级已经低于第一种算法的时间复杂度。
   例如已经排序好的两个数组A,B,使用下列伪代码进行判断交集:
int Find()
{
    result=i=j=0;
    while(i
    {
        if(a[i]
            i++;
        else if(a[i]>b[j])
            j++
        else
            result++;
    }
        return result;
}
时间复杂度为O(n),综合排序的时间复杂度则整体复杂度为:O(nlogn)

三、计数排序。也就是把两个数组A和B都遍历到一个新的数组里,然后在统计重复的数字即可,这个时间复杂度就是O(n)。当然,计数排序是有条件的,也就是要求数组内数字的范围是已知并且不是很大,否则使用这种办法得不偿失。

四、根据算法三应该大家能够想到用哈希函数或者哈希表来解决问题。也就是将数组A哈希到哈希表中,然后继续将数组B哈希到哈希表中,如果发生哈希碰撞则统计加1,最后可以得出数组的交集。时间复杂度也就是哈希所有元素的复杂度O(n)。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值