Arrays 判断两个数组是否相同的方法?

Arrays 判断两个数组是否相同的方法?,arrays,algorithm,Arrays,Algorithm,相同的意思是两个数组包含相同的元素,数组中元素的顺序在这里并不重要 我提出的解决方案是这样的,正如评论中指出的那样,这是一种错误的方法: 但是,就时间复杂度而言,是否有更好的算法?根据严格的顺序对两个数组进行排序,并逐项比较它们 更新:总结已经提出的一些要点,这里是您通常可以期望的效率: 严格排序:Olog N用于排序,并逐项比较 相等和哈希函数可用:逐项比较哈希计数,以及哈希冲突事件中的实际对象比较。 只有相等,没有可用的散列:必须计算每个元素或复制一个容器,移除效率取决于容器。 在第一次不

相同的意思是两个数组包含相同的元素,数组中元素的顺序在这里并不重要

我提出的解决方案是这样的,正如评论中指出的那样,这是一种错误的方法:


但是,就时间复杂度而言,是否有更好的算法?

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

更新:总结已经提出的一些要点,这里是您通常可以期望的效率:

严格排序:Olog N用于排序,并逐项比较 相等和哈希函数可用:逐项比较哈希计数,以及哈希冲突事件中的实际对象比较。 只有相等,没有可用的散列:必须计算每个元素或复制一个容器,移除效率取决于容器。
在第一次不匹配的位置,逐项比较的复杂性是线性的。

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

更新:总结已经提出的一些要点,这里是您通常可以期望的效率:

严格排序:Olog N用于排序,并逐项比较 相等和哈希函数可用:逐项比较哈希计数,以及哈希冲突事件中的实际对象比较。 只有相等,没有可用的散列:必须计算每个元素或复制一个容器,移除效率取决于容器。
在第一次失配的位置,逐项比较的复杂性是线性的。

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


然后,在lgn上对两个数组进行排序。现在,只需在上逐个元素检查两个数组。排序时,如果它们相等,则它们在每个位置都相等。

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


然后,在lgn上对两个数组进行排序。现在,只需在上逐个元素检查两个数组。当它们被排序时,如果它们相等,那么它们在每个位置都相等。

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


如果内容是可排序的,当然,您可以对两者进行排序,然后逐个元素进行比较。但是,这只有在您可以为元素提供总排序的情况下才有效。

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


如果内容是可排序的,当然,您可以对两者进行排序,然后逐个元素进行比较。但这只有在您可以为元素提供总排序的情况下才有效。

如果您不介意额外的空间,您可以执行一些类似HashMap的操作来存储元素,计算第一个数组的对数,然后检查第二个数组是否匹配;在最大数组的N个大小中这将是线性的

如果你不介意额外的空间,你可以做一些类似HashMap的事情来存储元素,计算第一个数组的对数,然后检查第二个数组是否匹配;如果数组大小相同且数组A中的所有元素都在数组B中,则无需验证数组B中的所有元素是否都在数组A中。因此,至少可以省略该步骤


编辑:取决于问题的定义。当且仅当其原始解决方案有效时,此解决方案才有效。如果阵列可以有重复的项,并且您没有将它们计数或标记为已用项,则此解决方案将无效。

如果阵列大小相同且阵列A中的所有元素都在阵列B中,那么就不需要验证数组B中的所有元素是否都在数组A中。因此,至少可以省略该步骤

编辑:取决于问题的定义。当且仅当其原始解决方案有效时,此解决方案才有效。如果阵列可以有重复项,并且您没有将它们计数或标记为已使用,则此解决方案将无效。

假设您有一个用户[]数组1和用户[]数组2。您可以遍历数组1并将它们添加到字典中,其中键是用户,值是计数。然后循环第二个数组,对于数组2中的每个用户,如果count大于1,则减少字典中的计数;如果count为1,则删除元素。如果用户不在字典中,则可以停止,因为数组不匹配

如果到了末尾,并且之前检查过数组的长度是否相同,则数组匹配。如果 您之前没有检查长度,当然您仍然应该检查长度,然后您可以在完全循环数组2之后验证字典现在是否为空

我不知道这到底是什么性能,但它比排序两个列表并逐个元素进行比较要快。虽然需要更多的内存,但是如果数组不是超大的,那么内存使用就不成问题。

假设您有一个用户[]数组1和用户[]数组2。您可以遍历数组1并将它们添加到字典中,其中键是用户,值是计数。然后循环第二个数组,对于数组2中的每个用户,如果count大于1,则减少字典中的计数;如果count为1,则删除元素。如果用户不在字典中,则可以停止,因为数组不匹配

如果到了末尾,并且之前检查过数组的长度是否相同,则数组匹配。如果您之前没有检查长度,当然您仍然应该检查长度,那么您可以在完全循环数组2之后验证字典现在是否为空


我不知道这到底是什么性能,但它比排序两个列表并逐个元素进行比较要快。虽然需要更多内存,但是如果数组不是超大的,那么内存使用就不成问题。

我的想法是在第一个数组中循环,并在第二个数组中查找项目。当然,唯一的问题是不能在第二个数组中使用一个项两次。那么,制作第三个布尔数组。此数组表示数组2中“已使用”的项

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

你应该只需要做一次。如果完成并找到数组2中所有项目的匹配项,则数组2中不会保留任何不匹配的项目。然后不需要遍历数组2并查看数组1是否包含该项


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

我的想法是在第一个数组中循环,并在第二个数组中查找项目。当然,唯一的问题是不能在第二个数组中使用一个项两次。那么,制作第三个布尔数组。此数组表示数组2中“已使用”的项

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

你应该只需要做一次。如果完成并找到数组2中所有项目的匹配项,则数组2中不会保留任何不匹配的项目。然后不需要遍历数组2并查看数组1是否包含该项


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

这假设元素具有可比性。是的。如果它们不具有可比性,那么它们是否相同的问题有什么意义?@Kerrek SB:能够测试一个对象是否等于另一个对象,而不管所使用的算法是什么,这与能够测试一个对象是否大于或小于另一个对象是不同的。@LukeH:没错。您正在寻找类似于C++的无序_multiset——您基本上需要能够在每个bucket中找到弱排序或某种具有相等比较的散列。如果您可以使用指向对象的指针,那么这些指针将作为一个良好的顺序。由于问题是抽象地提出的,所以考虑我的答案,对一个严格的排序可以定义的情况下的部分答案,否则求助于效率较低的通用算法。如果它们不具有可比性,那么它们是否相同的问题有什么意义?@Kerrek SB:能够测试一个对象是否等于另一个对象,而不管所使用的算法是什么,这与能够测试一个对象是否大于或小于另一个对象是不同的。@LukeH:没错。您正在寻找类似于C++的无序_multiset——您基本上需要能够在每个bucket中找到弱排序或某种具有相等比较的散列。如果您可以使用指向对象的指针,那么这些指针将作为一个良好的顺序。既然这个问题是抽象地提出的,请考虑我的答案,对一个严格的排序可以定义的情况下的部分答案,否则求助于效率较低的一般算法。这假定元素是可比的。如果出于任何原因不希望对数组进行排序,另一种方法是

创建B的副本。然后对于a中的每个元素,在Bcopy中找到它并将其删除。如果在此过程中,在Bcopy中找不到中的任何项目,则它们不是等效的。如果A已用尽,但Bcopy仍有元素,则它们是不等价的。这假设元素是可比较的。我同意这个答案。如果出于任何原因,您不希望对数组进行排序,另一种方法是复制B。然后,对于a中的每个元素,在Bcopy中找到它并将其删除。如果在此过程中,在Bcopy中找不到中的任何项目,则它们不是等效的。如果A已耗尽,但Bcopy仍有元素,则它们是不等价的。您的算法可能会得出结论{x,y,y}和{x,x,x,y}相等。这是期望的行为吗?@LukeH,不,这不是期望的行为,我的方法是错误的。你的算法可能会得出结论,{x,y,y,y}和{x,x,x,y}是相等的。这就是我们想要的行为吗?@LukeH,不,这不是我们想要的行为,我的方法是错误的。我同意你的观点,但是他对相等的定义并不清楚:相同的意思是两个数组包含相同的元素。@aioobe:同意。如果他只是追求基于集合的相等,这是一种合理的方法……我同意你的观点,但是他对相等的定义并不清楚:相同的意思是两个数组包含相同的元素。@aioobe:同意。如果他只是追求基于集合的等式,这是一种合理的方法……几乎是模散列冲突。最坏的情况是,由于问题是一般性的,所以如果所有的哈希函数都是相同的,那么可能找不到更好的哈希函数,那么显然,您仍然处于效率低下的状态。在上,渐近地,如果你有一个合理的散列方案。我通常不赞成不合理的散列。我认为,随着数组大小逐渐变大,由于散列只能接受有限多个值,因此几乎完全会发生散列冲突。你的意思是说平均水平更高吗?好吧,再一次,这取决于你的负载系数。若它足够好,那个么检索的预期时间和键的值都是常量。实际上,使用java库中的一些函数,负载因子会相当好。几乎是模散列冲突。最坏的情况是,由于问题是一般性的,所以如果所有的哈希函数都是相同的,那么可能找不到更好的哈希函数,那么显然,您仍然处于效率低下的状态。在上,渐近地,如果你有一个合理的散列方案。我通常不赞成不合理的散列。我认为,随着数组大小逐渐变大,由于散列只能接受有限多个值,因此几乎完全会发生散列冲突。你的意思是说平均水平更高吗?好吧,再一次,这取决于你的负载系数。若它足够好,那个么检索的预期时间和键的值都是常量。实际上,使用java库中的一些函数,负载因子会相当好。这如何区分[0,0,1]和[0,1,1]?这如何区分[0,0,1]和[0,1,1]?
 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