【发布时间】:2012-04-27 15:10:15
【问题描述】:
一个被问了很多次的问题似乎即将在 40 亿个数字中检测到一个缺失的数字。
推荐的方法似乎是使用位集(当内存限制是问题的一部分时)。
一个示例帖子是这样的:find-an-integer-not-among-four-billion-given-ones,我也可以在 SO 中链接到更多。
我的问题如下:bitset 方法似乎隐含地假设数字是非-负数。作为我链接到的帖子中的一个例子,Java中有这个代码sn-p:
int radix = 8;
byte[] bitfield = new byte[0xffffffff/radix];
void F() throws FileNotFoundException{
Scanner in = new Scanner(new FileReader("a.txt"));
while(in.hasNextInt()){
int n = in.nextInt();
bitfield[n/radix] |= (1 << (n%radix));
}
for(int i = 0; i< bitfield.lenght; i++){
for(int j =0; j<radix; j++){
if( (bitfield[i] & (1<<j)) == 0) System.out.print(i*radix+j);
}
}
}
但是在 Java 中所有的整数都是有符号的。结果,发布的代码将因负数而中断。这个int n = in.nextInt(); 可以返回负数。
所以我想不知何故我的困惑是关于这种问题/练习的两个部分:
1)可以使用位集来表示负数吗?怎么样?
2)问题的解决方案是否与特定的编程语言有关?例如。在有无符号数字的 C++ 中,我想人们可以接受范围是非负数的假设。
有人可以帮我理解这个吗?
【问题讨论】:
-
是什么阻止您将数字简单地视为
long,并添加 2^31 以使它们全部为正数? -
@OliCharlesworth:如果我这样做了,我不会得到 2 个数字(一个正数和一个负数)的相同位索引吗?然后我将如何找到丢失的一个?扫描时相应的位索引将设置为 true 但只有一个会出现
-
我建议为 all 值添加偏移量,而不仅仅是负值。
-
@OliCharlesworth:我明白你的意思。但在这种情况下,我是对的。我链接到的帖子代码有问题。对吧?
标签: java algorithm optimization bit-manipulation