Algorithm 理解在数组中查找重复项背后的概念

Algorithm 理解在数组中查找重复项背后的概念,algorithm,pseudocode,Algorithm,Pseudocode,我找到了一种方法,可以在从0到n-1的n个元素数组中查找重复项 Traverse the array. Do following for every index i of A[]. { 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])] i

我找到了一种方法,可以在从0到n-1的n个元素数组中查找重复项

Traverse the array. Do following for every index i of A[].
{
    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
}
这种方法效果很好。但我不明白怎么做。有人能解释一下吗

我基本上是在寻找这个算法的证明或更简单的理解

见 方法5


这里的示例可能会对您有所帮助。

该算法在数组中每个数字的符号中存储附加信息

登录
A[i]
存储处理过程中以前是否发生过
i
:如果是否定的,则发生一次


注意:“元素范围从0到n-1。”-哦,好吧,您不能在
0
中存储符号,因此这不是任务的正确算法。

您基本上是在欺骗,使用每个数组元素的符号位作为一个一位标志的数组,指示元素的存在或不存在。这可能比简单地使用单独的位集数组快,也可能不快,但它确实利用了一种特殊情况,即使用无符号值的有符号表示(int),因此每个数组上都有一个额外的未使用位。例如,如果您的值是有符号的,这将不起作用。

请尝试在大小为3的数组上手动执行此操作,然后增大大小。@Mark:我已经尝试过,效果很好。我只是想找一个更简单的解释/证明来清楚地理解!但是,您可以将
-(INT_MAX+1)
解释为
-0
,但这需要一些特殊的处理,而且可能最好只使用单独的位集。