多くの場合、は40億の番号の中から欠けている番号を検出しようとしています。
推奨されるアプローチは、(メモリの制約が問題の一部である)ビットセットを使用するように見えます。
投稿の例はfind-an-integer-not-among-four-billion-given-onesで、私はここのSOにリンクすることもできます。40億からの欠けている番号を見つける
私の問題は次のとおりです。ビットセットのアプローチは暗黙のうちに数字がではない - 否定であると思われます。私がリンクしている記事の例として、Javaでこのコードスニペットがあります。
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();
は、ネガを返すことができます。
このような問題/演習では、何とか私の混乱は約2部です:
1)負数を表すためにビットセットを使用できますか?どうやって?
2)問題の解決策は、どういうわけか特定のプログラミング言語に関係していますか?例えば。 C++では、符号なしの数値があるので、範囲が負ではないという仮定を受け入れることができます。
誰かが私にこれを理解してもらえますか?
単純に数値を「long」として扱い、2^31を加算してすべて正の値にすることはできません。 –
@OliCharlesworth:これを行った場合、2つの数字(正と負)のビットインデックスは同じになりませんか?見つからない場合はどうすればよいでしょうか?スキャンの対応するビットインデックスはtrueに設定されますが、存在するでしょう – Cratylus
私は、すべての値に負の値だけでなく、オフセットを加えることを提案しています。 –