Comment puis-je trouver le nombre minimum requis pour ajouter à la séquence de telle sorte que leur xor devienne zéro


8

Étant donné une séquence de nombres naturels, vous pouvez ajouter n'importe quel nombre naturel à n'importe quel nombre dans la séquence de sorte que leur xor devienne zéro. Mon objectif est de minimiser la somme des nombres ajoutés.

Considérez les exemples suivants:

  1. Pour la réponse est ; en ajoutant à nous obtenons .1,322133=0

  2. Pour la réponse est ; en ajoutant à et à nous obtenons .dix,4,5,163dix3513481=0

  3. Pour la réponse est , car .4,4044=0

J'ai essayé de travailler sur des représentations binaires du numéro de séquence mais c'est devenu si complexe. Je veux savoir s'il existe un moyen simple et efficace de résoudre ce problème.


2
Une déclaration plus claire du même problème à partir d'une autre affiche sur math.SE peut être trouvée ici , avec une autre réponse.
Dilip Sarwate

Problème intéressant. Il ressemble à un problème de somme de sous-ensemble où l'opérateur de somme est remplacé par XOR et tel que (si le sous-ensemble ne fait pas XOR à 0) l'ensemble est lui-même XORé avec un autre ensemble ...(s1,s2,,sn){0,1}n(k,k,,k)
user13675

Réponses:


5

Il me semble que contient toutes les informations nécessaires: les bits dans sont les bits dont vous avez besoin pour retourner (exactement) l'un des . Comme vous n'êtes autorisé qu'à ajouter , vous devez trouver un où le bit correspondant est et le retourner - cela entraîne le même coût pour tous les , c'est-à-dire , donc le choix n'a pas d'importance. Le problème commence s'il n'y a pas un .une=unejeunen1uneunejeunejej0uneje2juneje

C'est pourquoi vous devez le faire de manière itérative et travailler du moins important vers le haut. Procédez comme ci-dessus; s'il n'y a pas approprié , choisissez l' avec le nombre maximum de bits restant de la position actuelle - cela augmente les chances de trouver un candidat approprié dans les futures itérations -, retournez le bit et continuez, c'est-à-dire retournez tout ceux à gauche jusqu'à ce que vous retourniez un zéro à un. Notez que nous ajoutons toujours ). Comme le report se propage uniquement vers la gauche, les choix antérieurs ne sont pas invalidés. Recalculez et continuez avec ; itérer jusqu'à ce que vous ayez .unejeuneje12junej+1une=0

Notez que ce n'est qu'une heuristique pour autant que je sache: le choix de peut être sous-optimal s'il fait que de nombreux bits dans deviennent non nuls. Je ne sais pas si cela peut être évité.jeune


0

Je n'ai pas vraiment de solution, mais voici quelques idées qui ont surgi.

Si vous regardez les résultats de XORing tous les nombres dans la séquence, cela donne une limite supérieure sur le nombre d'ajouts que vous devez faire. Par exemple, dans votre exemple de , nous avons , donc vous savez que vous n'avez pas besoin d'en ajouter plus de (car le 8 bits est le plus haut ensemble). Distribuer jusqu'à huit "uns" répartis de quatre façons, est un ensemble assez petit de combinaisons. Je ne me souviens pas de cette formule si tard dans la nuit, mais il y a unquelque part.dix,4,5,1dix451=dix8n!

Pour donner à cette déclaration un peu plus de mise à la terre, considérons les entiers arbitraires tels que . Les bits supérieurs au bit 3 s'annulent tous, vous pouvez donc les ignorer. Pour les quatre bits inférieurs, ils XOR à 8, donc le pire cas possible (en termes de nombre de ceux que vous devez ajouter) est si et (tous les zéros sauf le bit le plus élevé) parce que vous besoin d'ajouter +8 à B pour obtenir ce bit supérieur défini. S'il y a des bits définis dans l'un ou l'autre des nombres, vous devez en ajouter moins.UNE,BUNEB=8UNE=8B=0

Vous pouvez peut-être partir de là et développer un montant maximum plus serré à ajouter.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.