最近,我的一位同事问我如何测试两个数组的相等性。他有两个Address
来源,并想断言两个来源都包含完全相同的元素,尽管顺序并不重要。
在Java中使用Array
或类似List
或IList
都可以,但由于可能有两个相等的Address
对象,Set
之类的内容可以不会被使用。
在大多数编程语言中,List
已经有一个equals
方法进行比较(假设在执行之前已经订购了集合),但是没有关于实际差异的信息;只是有一些,或没有。
输出应该告知一个集合中的元素,而不是另一个集合中的元素,反之亦然。
一种显而易见的方法是遍历其中一个集合(如果其中一个集合),并在另一个集合上调用contains(element)
,然后以相反的方式执行此操作。假设O(n)
的复杂度为contains
,如果我是正确的,则会产生O(2n²)
。
是否有更有效的方式获取信息“A1和A2不在List1中,A3和A4不在List2中”?有没有比列表更适合做这项工作的数据结构?是否值得在之前对集合进行排序并使用自定义二进制搜索包含?
答案 0 :(得分:0)
首先想到的是使用设置差异
在伪python中
addr1 = set(originalAddr1)
addr2 = set(originalAddr2)
in1notin2 = addr1 - addr2
in2notin1 = addr2 - addr1
allDifferences = in1notin2 + in2notin1
从here,您可以看到设置差异为O(len(set))
,联合为O(len(set1) + len(set2))
,为您提供了一个线性时间解决方案,使用此特定于python的set
,而不是二次方你建议。
我相信其他流行语言倾向于以相同的方式实现这些类型的数据结构,但无法确定这一点。
答案 1 :(得分:0)
是否值得对集合进行排序[...]?
将天真的方法O(n²)
与O(n logn)
中的两个列表进行排序,然后在O(n)
中对它们进行比较 - 或者对O(n logn)
中的一个列表进行排序,并在O(n)
中迭代另一个列表{1}}