Collections 打印两个数组差异的最有效方法?

Collections 打印两个数组差异的最有效方法?,collections,compare,complexity-theory,assert,Collections,Compare,Complexity Theory,Assert,最近,我的一位同事问我如何测试两个数组的相等性。他有两个Address的来源,并希望断言这两个来源包含完全相同的元素,尽管顺序并不重要。 在Java中使用Array或类似的List或IList都可以,但由于可能有两个相等的Address对象,因此不能使用Set之类的对象 在大多数编程语言中,List已经有了一个equals方法来进行比较(假设在进行比较之前对集合进行了排序),但是没有关于实际差异的信息;只是有一些,或者没有 输出应该通知在一个集合中但不在另一个集合中的元素,反之亦然 一种明显的方

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

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

输出应该通知在一个集合中但不在另一个集合中的元素,反之亦然

一种明显的方法是迭代其中一个集合(如果其中一个是),然后在另一个集合上调用
contains(element)
,然后以另一种方式执行。假设
包含的
的复杂性为
O(n)
,如果我是正确的,那将导致
O(2n²)


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

首先想到的是使用集合差异

在伪python中

addr1 = set(originalAddr1)
addr2 = set(originalAddr2)
in1notin2 = addr1 - addr2
in2notin1 = addr2 - addr1
allDifferences = in1notin2 + in2notin1
从中可以看出,集合差是
O(len(set))
,联合是
O(len(set1)+len(set2))
为您提供了一个与python特定的
set
实现相关的线性时间解,而不是您所建议的二次时间解

我相信其他流行的语言倾向于以几乎相同的方式实现这些类型的数据结构,但不能确定这一点

是否值得对集合进行排序[…]


比较原始方法
O(n²)
将两个列表排序在
O(n logn)
中,然后在
O(n)
中比较它们,或者将一个列表排序在
O(n logn)
中,然后在
O(n)
中迭代另一个列表。您所描述的问题似乎适合使用集合。不要丢弃它们,因为它们有时非常有效且易于使用。我又回答了几个问题details@Davide对数组进行排序比在集合上插入和迭代快几个数量级——只是为了保持一致mind@BeyelerStudios你不必对集合进行排序和迭代来找出它们的差异…@BeyelerStudios对不起,我不是说“对集合排序”这太愚蠢了,因为布景里没有order@Davide当不是作为a)哈希表(查找的空间位置不好)或b)排序数组或列表(即树/堆)时,您认为如何实现一个集合?构建集合等于排序。构建集合的成本是多少?但是
set
将无法处理重复的集合?拥有Collection1:
e1e1
和Collection2:
E1
-输出应该像第二个集合中缺少
E1
@stuXnet哦,如果这真的是你想要的,那么集合肯定是不存在的。尽管第二个集合中缺少
E1
显然是误导性的,因为
E1
实际上在第二个集合中……你是对的,像
这样的措辞发现了一个不在第二个集合中的E1
或类似的东西会更清楚,但这并不需要改变算法:)@AndréR。我不知道,也找不到答案,但我最好的猜测是,从列表到集合的转换是
O(n)
,但这只是直觉。