按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
然而,在时间复杂度方面是否有更好的算法?
答案 0 :(得分:2)
假设你有一个User[]
数组1和User[]
数组2.你可以跳过数组1并将它们添加到Dictionary<User, int>
字典中,其中键是用户,值是伯爵。然后循环遍历第二个数组,并为数组2中的每个用户递减字典中的计数(如果count大于1)或删除元素(如果count为1)。如果用户不在字典中,则可以停止,数组不匹配。
如果到达最后并且之前检查过的数组长度相同,则数组匹配。如果你之前没有检查过长度(当然你还应该有),那么你可以在完全循环遍历数组2后验证字典现在是空的。
我不确切知道它的性能是什么,但它会比排序两个列表并循环比较逐个元素更快。虽然占用更多内存,但如果数组不是超大,那么内存使用不应成为问题。
答案 1 :(得分:1)
根据严格的排序对两个数组进行排序,并逐个比较它们。
更新:总结一些已经提出的要点,这里通常可以达到效率:
逐项比较的复杂性在第一个不匹配的位置是线性的。
答案 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中。所以至少你可以省略那一步。
编辑:取决于问题的定义。当且仅当他的原始解决方案能够工作时,此解决方案才有效,如果数组可以有重复的项目并且您没有计算或将它们标记为“已使用”,则不会有效。