xorがゼロになるようにシーケンスに追加するために必要な最小数を見つけるにはどうすればよいですか


8

自然数のシーケンスを指定すると、xorがゼロになるように、シーケンス内の任意の数に任意の自然数を追加できます。私の目標は、追加された数値の合計を最小化することです。

次の例を検討してください。

  1. ために 1,3答えはです。を追加すると、ます。22133=0

  2. 以下のために答えは。からおよびからを追加すると、ます。10,4,5,163103513481=0

  3. 答えは以来、。4,4044=0

シーケンス番号のバイナリ表現に取り組んでみましたが、非常に複雑になりました。この問題を解決する簡単で効率的な方法があるかどうか知りたい。


2
math.SEの別の投稿者からの同じ問題についてのより明確な説明は、別の回答とともにここにあります。
Dilip Sarwate、2012

興味深い問題。これは、和演算子がXORに置き換えられ、(サブセットがXORしない場合に)セットが次のようになるサブセット和問題のように見えます(s1,s2,,sn) それ自体が別のセットとXORされている {0,1}n(k,k,,k)...
user13675 ​​2014年

回答:


5

それは私には思われる a=aian すべての必要な情報を保持します: 1ビットイン a あなたは(正確に)あなたが反転する必要があるビットです ai追加のみ許可されているため、1つを見つける必要がありますai ここで対応するビット j です 0 そしてそれを反転させます-これはすべての人に同じコストを引き起こします ai、 あれは 2jなので、選択は重要ではありません。無いと困るai

そのため、これを繰り返し実行し、最下位ビットから上に向かって作業する必要があります。上記のように進みます。適切なものがなければaiを選択します ai 最大数で 1現在の位置の左側のビット(これにより、将来の反復で適切な候補を見つける可能性が高くなります)。ビットを反転させて持ち越します。つまり、ゼロを1に反転させるまで、すべて1を左側に反転させます。追加することに注意してください2j)。キャリーは左側にのみ伝播するため、以前の選択は無効になりません。再計算a そして続けます j+1; あなたが持っているまで繰り返すa=0

これは私が知る限りヒューリスティックにすぎないことに注意してください。 i それが多くのビットを引き起こす場合、次善の可能性があります a非ゼロになる。これを回避できるかどうかはわかりません。


0

実際には解決策はありませんが、ここにいくつかのアイデアが浮かび上がりました。

シーケンス内のすべての数値のXORの結果を見ると、実行する必要がある加算の数に上限があります。たとえば、あなたの例では10,4,5,1、 我々は持っています 10451=10なので、追加する必要はありません 8(8ビットが最上位のセットであるため)。最大8つの「1」を4つの方法で配布するのは、かなり小さな組み合わせのセットです。このフォーミュラはこの夜遅くまで思い出せませんが、n! どこかに。

そのステートメントにもう少し根拠を与えるために、任意の整数を考えてください A,B そのような AB=8。ビット3より高いビットは明らかにすべて相殺されるため、無視できます。下位4ビットの場合、XORは8になるため、(追加する必要があるものの数に関して)最悪のケースは次の場合です。 A=8 そして B=0(最上位ビットを除いてすべてゼロ)その上位ビットセットを取得するにはBに+8を追加する必要があるため。ある場合は任意の数字のいずれかに設定された1ビットを、あなたは以下を追加する必要があります。

たぶん、これから始めて、追加するよりきつい最大量を開発することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.