如何快速求两个数组的交集?
现有数组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)那么这个方法就太糟糕了。