在两个不同大小的数组中查找公共元素

时间:2013-08-22 09:38:50

标签: arrays search

我必须找到获得两个不同大小数组的公共元素的最佳方法。

阵列是无序的;公共元素位于不同的位置,但顺序相同(如果在数组中,公共元素 b 位于 a 之后,同样发生在数组B中)并且具有最大值距离N。

我不能使用更多额外的O(N)空间。

实际上我从数组A中提取N个元素,使用mergesort对它们进行排序,并使用数组B的N个元素执行双子搜索。然后,我从找到的匹配位置获取下一个N个元素,并执行另一个循环。

这应该是,使用 m 作为数组B的长度,O(m N log N)

我尝试过使用哈希表,但为了管理冲突,我必须实现一个List,效率会下降。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

假设你的匹配序列中有“洞”(A = [1,3,2] AND B = [1,4,2]那么MatchSet = {1,2})

也许我错了,但你可以尝试这个伪代码:

i <- 0; j <- 0; jHit <- -1
matchSet <- Empty
While i < Length(A) AND j < Length(B):
    If A[i] == B[j] Then
        matchSet.add(A[i])
        i <- i+1
        jHit <- j
    End If
    j <- j+1
    If j == Length(B) Then
        i <- i+1
        j <- jHit+1
    End If
End Loop

第一个索引(i)指向A中未找到的A的下一个元素,而(j)用于查找B的下一个元素(在A中找到最后一个元素之后)。

这将给你O(mN)的时间复杂度和O(N)的空间使用。

这里有一个Python实现:

def match(A,B):
    i = 0
    j = 0
    jHit = -1
    res = []
    while i < len(A) and j < len(B):
        if A[i] == B[j]:
            res.append(A[i])
            i += 1
            jHit = j
        j += 1
        if j == len(B):
            i += 1
            j = jHit+1
    return res