我有以下问题:我需要在两个无序的列表中找到相同元素对。关于这两个列表的事情是它们“大致相等” - 只有某些元素被移动了一些索引,例如(注意,这些对象不是整数,我在这个例子中只是使用整数):
[1,2,3,5,4,8,6,7,10,9]
[1,2,3,4,5,6,7,8,9,10]
我的第一次尝试是遍历这两个列表并根据每个对象的某个唯一键生成两个 HashMap。然后,在第二遍时,我会简单地从两个地图中提取元素。这产生O(2N)
了空间和时间。
我正在考虑一种不同的方法:我们将在两个列表中保留指向当前元素的指针,以及为每个列表设置 currentUnmatched 。伪代码将是以下类型:
while(elements to process)
elem1 = list1.get(index1)
elem2 = list2.get(index2)
if(elem1 == elem2){ //do work
... index1++;
index2++;
}
else{
//Move index of the list that has no unamtched elems
if(firstListUnmatched.size() ==0){
//Didn't find it also in the other list so we save for later
if(secondListUnamtched.remove(elem1) != true)
firstListUnmatched.insert(elem1)
index1++
}
else { // same but with other index}
}
以上可能不起作用......我只是想大致了解您对这种方法的看法。基本上,这会在每个列表的一侧维护一个哈希集,其大小 << 问题大小。对于少量错位元素和小的“间隙”,这应该是~O(N)。无论如何,我期待着您的回复。
编辑:我不能简单地返回两个对象列表的集合交集,因为我需要对我发现匹配/不匹配的对象执行操作(甚至多个操作)