确定两个未排序的数组是否相同?

时间:2015-10-22 03:30:44

标签: arrays algorithm time-complexity

鉴于两个未排序数组AB具有不同的元素,请确定是否可以重新排列AB以使它们相同。

我的策略如下:

  1. 首先,使用 O(N)时间的确定性选择算法来查找A Max 最大 B,如果他们没有相同的最大,我们可以自动声明他们相同,否则,请转到第2步。
  2. 将两个数组合并在一起,并创建一个大小为 2N 的数组C
  3. 使用计数排序算法,方法是创建一个大小为最大(A)的数组D并扫描C并撞击计数器D 中的适当索引(我们实际上不需要完成计数排序算法,我们只需要这个中间步骤)
  4. 扫描D阵列,如果有D[i] = 1,我们知道阵列不相同,否则它们是相同的。
  5. 声明:时间复杂度O(N),以及没有空间限制。

    这是一个正确的算法吗?

3 个答案:

答案 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)

该问题的O(n)部分意味着我们正在回答某人的家庭作业问题。在大多数现实世界的计算中,没有人关心这一点。

为什么不首先查看Array [] .length()以查看它们是否相同?

然后,编写一个哈希函数,无论顺序如何,都会产生相同的值。 (即对每个/所有项目进行异或)。在MOST计算语言中,比较哈希的结果应该与equals一致。