我找到了一个代码,用于检测未排序数组中的常见元素。该程序以线性时间运行!但我不明白该计划的逻辑。如果某人可以解释该计划的逻辑,那将是非常有帮助的。
以下是代码:
public class DeleteUnsortedDataFromArray {
public static List<Integer> findDuplicatesArray(int[] sequence){
int bitarray = 0;
for(int i=0; i< sequence.length; i++){
int x = 1;
x = x << sequence[i];
if((bitarray & x) != 0){
System.out.println("Duplicate found in given array: " + sequence[i]);
} else {
bitarray = bitarray | x;
}
}
return null;
}
public static void main(String[] args) {
int[] input = {1,1,2,3};
findDuplicatesArray(input);
}
}
答案 0 :(得分:2)
它的作用是将每个找到的值表示为组成整数(bitarray)的位的位置。
行:
x = 1;
x = x << sequence[i];
将1放在序列值+ 1(&lt;&lt;&lt; is a shift operator)给出的位置。
例如,如果sequence [i]值为4,则x将具有二进制值:... 010000
该行:
(bitarray & x) != 0
使用位操作AND检查位置是否已被占用,因此找到了值。
问题是该算法仅在 sequence 的值被限制为低时才有效:0到30之间,因为Java integer中有32位,值0是在bitarray的0位表示为1。
您应该考虑当序列值为负时会发生什么。
答案 1 :(得分:0)
只有当数组中的所有值都属于[0,int-number-of-int]时,它才有效。如果你当然可以说&#39;工作&#39;关于一个应该返回重复列表但总是返回null的函数。
答案 2 :(得分:0)
您可以将算法理解为使用布尔数组来测试数值是否先前已在数组中出现过。现在你不是使用一个布尔数组,而是使用int中的位来表示某个值是否先前发生过。代码称之为&#34; bitarray&#34;。
要在int中设置Ith位,请使用
x = (x | (1<< i));
这里&#39; |&#39;是bitwise or operator.
要测试是否已设置第I位,请检查条件
if((x & (1<< i)) != 0){
}
这里&#39;&amp;&#39;是bitwise and operator.
此外,algorithm used above will only work if the range of values in the array is between 0 and 31 inclusive.
那是因为java int用32位表示。但是它比其他替代方案(如使用HashSet或显式的布尔数组)消耗更少的空间。
但是,if space is at a premium, and you know that the range of data in the array is small, you can consider using Bitset class
(link)。