鉴于两个未排序数组A
和B
具有不同的元素,请确定是否可以重新排列A
和B
以使它们相同。
我的策略如下:
A
和 Max 的最大 B
,如果他们没有相同的最大,我们可以自动声明他们不相同,否则,请转到第2步。C
。D
并扫描C
并撞击计数器D
中的适当索引(我们实际上不需要完成计数排序算法,我们只需要这个中间步骤)。D
阵列,如果有D[i] = 1
,我们知道阵列不相同,否则它们是相同的。声明:时间复杂度O(N),以及没有空间限制。
这是一个正确的算法吗?
答案 0 :(得分:1)
提前进行小幅修正(以及删除不必要的步骤):
找到最大值A和B的元素。如果不相等,则退出。
创建一个大小为max(A)的整数数组C,并将所有元素设置为0
迭代A的每个元素a并增加C [a]
迭代B的每个元素b并递减(!)C [b]。
检查C是否至少有一个非零值;如果是,则A和B具有相同的元素。
注意:
a)无需制作合并数组
b)增加阵列和检查
如果计数器为1或2,如果某些值多次出现则会失败
c)增加两个数组并检查计数器是否为奇数失败例如。如果有的话
值是A中的两倍,B中是0倍。因此1x递增,1x递减,并检查0.
现在它适用于整数数组,如果最大值。元素足够小,C可以适合内存。
如果A和B中有大的64位值,它将无法工作。如果A和B是例如。双阵列,它也不会工作。 (您可以将字节转换为int表示,但会再次出现大值。)
如果A和B是类对象的数组,它通常不会工作(通常)。您需要一个无冲突的哈希值,哈希值为max。例如。 4字节使得这4字节中的数字是可能的数组大小,并且根据类,这样的散列函数可能是不可能的。
答案 1 :(得分:0)
解决此任务的惯用方法是将第一个数组的元素添加到哈希表中。然后迭代第二个数组并检查哈希表中是否存在每个元素。
散列表已分摊插入和搜索时间O(1)(当使用足够好的散列时),因此整体算法将在O(N)时间运行并消耗O(N)额外空间。
此方法适用于所有元素类型(不仅仅是小的整数,按计数排序所需)。但是,如果您的元素是小的整数,则可以使用普通布尔数组替换哈希表。
此外,如果数组的元素不相同,则可以通过将计数器存储为哈希表中的值来修改此算法。
答案 2 :(得分:-4)
为什么不首先查看Array [] .length()以查看它们是否相同?
然后,编写一个哈希函数,无论顺序如何,都会产生相同的值。 (即对每个/所有项目进行异或)。在MOST计算语言中,比较哈希的结果应该与equals一致。