如何在数组中找到xor方法的重复项?算法复杂度O(n)

时间:2013-07-27 15:05:03

标签: arrays algorithm xor

如何在数组中查找重复项。在反问题的情况下,当您必须找到所有的唯一元素时,您只需清除所有元素,结果我们获得一个唯一元素。例如

int a[] = {2, 2, 3, 3, 4, 5, 5, 16, 16};
int res = a[0];
for(int i = 0; i < 9; ++i)
    res ^= a[i];

例如给定一个数组

int a[] = {2, 4, 7, 8, 4, 5};

这里副本是4,但不清楚如何找到数组的重复元素。

3 个答案:

答案 0 :(得分:4)

您正在描述Element Distinctness Problem

没有额外的空间(和散列),元素清晰度问题没有O(n)解决方案,因此您无法修改此问题的“xor算法重复”。

此问题的解决方案是:

  1. 对排序后的数组进行排序和迭代以找到dupes(在排序数组中很容易)。这是O(nlogn)时间。
  2. 构建histogram数据(基于散列)并在完成后迭代直方图,以验证直方图中所有元素的值是否为{ - {1}} 平均值案例,O(n)空间。

答案 1 :(得分:0)

我们可以使用以下算法在0(n)时间内找到数组中的重复项。

  traverse the list for i= 0 to n-1 elements
  {
//check for sign of A[abs(A[i])] ;
 if positive then
 make it negative by   A[abs(A[i])]=-A[abs(A[i])];
 else  // i.e., A[abs(A[i])] is negative
  this   element (ith element of list) is a repetition
  }

希望它有所帮助!

答案 2 :(得分:-1)

一种解决方案可以是构建Hashset。它如下 -

 1. Initialize an empty hashset.
 2. For each element in array,
     a. Check if it is present in the hashset.
        If yes, you found the duplicate
        If not, add it to the hashset.

这样你就可以找到数组中的所有重复项。

空间复杂度:O(n);时间复杂度:O(n)