我必须找到获得两个不同大小数组的公共元素的最佳方法。
阵列是无序的;公共元素位于不同的位置,但顺序相同(如果在数组中,公共元素 b 位于 a 之后,同样发生在数组B中)并且具有最大值距离N。
我不能使用更多额外的O(N)空间。
实际上我从数组A中提取N个元素,使用mergesort对它们进行排序,并使用数组B的N个元素执行双子搜索。然后,我从找到的匹配位置获取下一个N个元素,并执行另一个循环。
这应该是,使用 m 作为数组B的长度,O(m N log N)
我尝试过使用哈希表,但为了管理冲突,我必须实现一个List,效率会下降。
有更好的方法吗?
答案 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