数据结构和算法—如何快速求组两个数组的交集

如何快速求两个数组的交集?

现有数组A、B ,数组长度分别为M、N,并且都是未排序的,如何快速两个数组的交集


说明:对于求数据交集的问题,那么每一个数组中可能会有重复元素,但是重复元素对求交集其实没有太大意义。

思路一:

              采用一个set 去存储一个数组,假定为A,然后用再从set中逐个查找B的元素。查到了就放入交集数组。

              当然采用哈希(hash_set)的的方式也能达到同样的效果。

              说明: 在STL中,set是以红黑树(RB-tree)作为底层数据结构,在时间复杂度为O(logN)情况下插入、删除和查找数据,hash_set操作的时间复杂度则比较复杂,这                 取决于哈希函数和哈希表的负载情况。一般来说,查询的数据量越大,hash_set的性能优势越明显。

              时间复杂度:O(Mlog(n))

             空间复杂度:o(min(M,N))


思路二:

             去长度小的数组A排序,对大数组B,直接用二分查找。

             时间复杂度:O(mlog(n))

              

思路三:(受限方法)

            如果知道元素上限为MaxElem,那么可以用bitset,对两个数组建立两个bitset,然后将两个bitset求与,得到的就是两个数组的交集。

            时间复杂度为O(m+n),空间复杂度为(MaxElem/8)。

            缺点:很明显,如果A只有两个元素(1,INT_MAX)那么这个方法就太糟糕了。

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值