打印两个阵列差异的最有效方法?

时间:2015-06-12 09:06:40

标签: collections compare complexity-theory assert

最近,我的一位同事问我如何测试两个数组的相等性。他有两个Address来源,并想断言两个来源都包含完全相同的元素,尽管顺序并不重要。 在Java中使用Array或类似ListIList都可以,但由于可能有两个相等的Address对象,Set之类的内容可以不会被使用。

在大多数编程语言中,List已经有一个equals方法进行比较(假设在执行之前已经订购了集合),但是没有关于实际差异的信息;只是有一些,或没有。

输出应该告知一个集合中的元素,而不是另一个集合中的元素,反之亦然。

一种显而易见的方法是遍历其中一个集合(如果其中一个集合),并在另一个集合上调用contains(element),然后以相反的方式执行此操作。假设O(n)的复杂度为contains,如果我是正确的,则会产生O(2n²)

是否有更有效的方式获取信息“A1和A2不在List1中,A3和A4不在List2中”?有没有比列表更适合做这项工作的数据结构?是否值得在之前对集合进行排序并使用自定义二进制搜索包含?

2 个答案:

答案 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}}