判断两个阵列是否相同的方法?

时间:2011-07-01 16:35:45

标签: arrays algorithm

identical我的意思是两个数组包含相同的元素,数组中元素的顺序在这里无关紧要。

我想出的解决方案是这样的(,结果是错误的方法,如评论中所指出的):

 if the size of two Arrays are equal
 See True, find all elements of Array A in Array B
 All Found,  find all elements of Array B in Array A
 All Found, then I get conclusion two Arrays are identical

然而,在时间复杂度方面是否有更好的算法?

7 个答案:

答案 0 :(得分:2)

假设你有一个User[]数组1和User[]数组2.你可以跳过数组1并将它们添加到Dictionary<User, int>字典中,其中键是用户,值是伯爵。然后循环遍历第二个数组,并为数组2中的每个用户递减字典中的计数(如果count大于1)或删除元素(如果count为1)。如果用户不在字典中,则可以停止,数组不匹配。

如果到达最后并且之前检查过的数组长度相同,则数组匹配。如果你之前没有检查过长度(当然你还应该有),那么你可以在完全循环遍历数组2后验证字典现在是空的。

我不确切知道它的性能是什么,但它会比排序两个列表并循环比较逐个元素更快。虽然占用更多内存,但如果数组不是超大,那么内存使用不应成为问题。

答案 1 :(得分:1)

根据严格的排序对两个数组进行排序,并逐个比较它们。


更新:总结一些已经提出的要点,这里通常可以达到效率:

  • 严格的可用订购:O(log N)用于分类加上逐个比较
  • 可用的相等和散列函数:逐个比较散列计数,以及散列冲突时的实际对象比较。
  • 只有相等,没有散列可用:必须计算每个元素或复制一个容器并删除(效率取决于容器)。

逐项比较的复杂性在第一个不匹配的位置是线性的。

答案 2 :(得分:1)

首先,检查两个数组的大小。如果它们不相等则它们不包含相同的元素。

之后,在O(n lg(n))中对两个数组进行排序。现在,只需在O(n)中逐元素地检查数组。当它们被排序时,如果它们是相等的,那么它们在每个位置都是相等的。

答案 3 :(得分:1)

你的方法不起作用,因为它会将[0,1,1]视为等于[0,0,1]。 A中的每个项目都在B中,反之亦然。您需要计算A和B中每个项目的出现次数。(当然,如果您已经检查过长度,那么需要同时执行这两项操作。)< / p>

如果内容是可排序的,您可以对它们进行排序,然后逐个元素进行比较。只有在您可以为元素提供总排序时才有效。

答案 4 :(得分:1)

我的想法是遍历第一个数组并查找第二个数组中的项目。唯一的问题当然是你不能在第二个数组中使用两次项目。所以,制作第三列布尔值。此数组指示数组2'中的哪些项目已被使用'。

循环遍历第一个数组。在循环中,遍历第二个数组中的每个元素,以查看是否可以在第二个数组中“找到”该元素,还检查第三个数组以验证第二个数组中的位置是否未被使用。如果您在第三个数组中找到匹配更新并继续前进。

你应该只需要这样做一次。如果你完成并找到了数组2中所有项目的匹配项,那么阵列2中没有不匹配的项目。你不需要循环遍历数组2并查看数组1是否包含该项目。

当然,在你开始检查长度是否相同之前。

答案 5 :(得分:0)

如果你不介意额外的空间你可以做一些像HashMap来存储第一个数组的(元素,计数)对,然后检查第二个数组是否匹配;这在N(最大数组的大小)中是线性的

答案 6 :(得分:-1)

如果数组大小相同且数组A中的所有元素都在数组B中,那么就不需要验证数组B中的所有元素都在数组A中。所以至少你可以省略那一步。

编辑:取决于问题的定义。当且仅当他的原始解决方案能够工作时,此解决方案才有效,如果数组可以有重复的项目并且您没有计算或将它们标记为“已使用”,则不会有效。