自然数のシーケンスを指定すると、xorがゼロになるように、シーケンス内の任意の数に任意の自然数を追加できます。私の目標は、追加された数値の合計を最小化することです。
次の例を検討してください。
ために 答えはです。を追加すると、ます。
以下のために答えは。からおよびからを追加すると、ます。
答えは以来、。
シーケンス番号のバイナリ表現に取り組んでみましたが、非常に複雑になりました。この問題を解決する簡単で効率的な方法があるかどうか知りたい。
自然数のシーケンスを指定すると、xorがゼロになるように、シーケンス内の任意の数に任意の自然数を追加できます。私の目標は、追加された数値の合計を最小化することです。
次の例を検討してください。
ために 答えはです。を追加すると、ます。
以下のために答えは。からおよびからを追加すると、ます。
答えは以来、。
シーケンス番号のバイナリ表現に取り組んでみましたが、非常に複雑になりました。この問題を解決する簡単で効率的な方法があるかどうか知りたい。
回答:
それは私には思われる すべての必要な情報を保持します: ビットイン あなたは(正確に)あなたが反転する必要があるビットです 。追加のみ許可されているため、1つを見つける必要があります ここで対応するビット です そしてそれを反転させます-これはすべての人に同じコストを引き起こします 、 あれは なので、選択は重要ではありません。無いと困る。
そのため、これを繰り返し実行し、最下位ビットから上に向かって作業する必要があります。上記のように進みます。適切なものがなければを選択します 最大数で 現在の位置の左側のビット(これにより、将来の反復で適切な候補を見つける可能性が高くなります)。ビットを反転させて持ち越します。つまり、ゼロを1に反転させるまで、すべて1を左側に反転させます。追加することに注意してください)。キャリーは左側にのみ伝播するため、以前の選択は無効になりません。再計算 そして続けます ; あなたが持っているまで繰り返す。
これは私が知る限りヒューリスティックにすぎないことに注意してください。 それが多くのビットを引き起こす場合、次善の可能性があります 非ゼロになる。これを回避できるかどうかはわかりません。
実際には解決策はありませんが、ここにいくつかのアイデアが浮かび上がりました。
シーケンス内のすべての数値のXORの結果を見ると、実行する必要がある加算の数に上限があります。たとえば、あなたの例では、 我々は持っています なので、追加する必要はありません (8ビットが最上位のセットであるため)。最大8つの「1」を4つの方法で配布するのは、かなり小さな組み合わせのセットです。このフォーミュラはこの夜遅くまで思い出せませんが、 どこかに。
そのステートメントにもう少し根拠を与えるために、任意の整数を考えてください そのような 。ビット3より高いビットは明らかにすべて相殺されるため、無視できます。下位4ビットの場合、XORは8になるため、(追加する必要があるものの数に関して)最悪のケースは次の場合です。 そして (最上位ビットを除いてすべてゼロ)その上位ビットセットを取得するにはBに+8を追加する必要があるため。ある場合は任意の数字のいずれかに設定された1ビットを、あなたは以下を追加する必要があります。
たぶん、これから始めて、追加するよりきつい最大量を開発することができます。