Bagaimana saya bisa menemukan angka minimum yang diperlukan untuk menambah urutan sehingga xor mereka menjadi nol

8

Diberikan urutan bilangan alami, Anda dapat menambahkan bilangan alami ke bilangan apa pun dalam urutan sedemikian sehingga xornya menjadi nol. Tujuan saya adalah untuk meminimalkan jumlah angka yang ditambahkan.

Perhatikan contoh-contoh berikut:

  1. Untuk 1,3jawabannya adalah ; menambahkan ke kita mendapatkan .22133=0

  2. Untuk jawabannya adalah ; menambahkan ke dan ke kita mendapatkan .10,4,5,163103513481=0

  3. Untuk jawabannya adalah , karena .4,4044=0

Saya mencoba bekerja pada representasi biner dari nomor urut tetapi menjadi sangat kompleks. Saya ingin tahu apakah ada cara sederhana dan efisien untuk menyelesaikan masalah ini.

Pravin Gadakh
sumber
2
Pernyataan yang lebih jelas tentang masalah yang sama dari poster yang berbeda tentang matematika. SE dapat ditemukan di sini , bersama dengan jawaban lain.
Dilip Sarwate
Masalah menarik. Sepertinya masalah jumlah subset di mana operator jumlah diganti dengan XOR dan sedemikian rupa sehingga (jika subset tidak XOR ke 0) set itu sendiri XORed dengan set yang lain ...(s1,s2,,sn){0,1}n(k,k,,k)
user13675

Jawaban:

5

Tampaknya bagi saya bahwa a=aian memegang semua informasi yang diperlukan: 1bit dalam a adalah bit yang Anda butuhkan untuk memasukkan (tepatnya) salah satunya ai. Karena Anda hanya diperbolehkan menambahkan , Anda harus menemukannyaai di mana bit yang sesuai j adalah 0 dan balikkan - ini menyebabkan biaya yang sama untuk semua ai, itu adalah 2j, jadi pilihannya tidak masalah. Masalah dimulai jika tidak ada yang seperti ituai.

Itulah sebabnya Anda harus melakukan ini secara berulang dan bekerja dari bagian paling tidak penting ke atas. Lanjutkan seperti di atas; jika tidak ada yang cocokai, memilih ai dengan jumlah maksimum 1bit yang tersisa dari posisi saat ini - ini meningkatkan peluang untuk menemukan kandidat yang cocok di iterasi masa depan -, balikkan bit dan bawa, yang membalik semua yang ke kiri sampai Anda membalikkan nol ke yang satu. Perhatikan bahwa kami masih menambahkan2j). Sebagai carry hanya menyebar ke kiri, pilihan sebelumnya tidak valid. Hitung ulangSebuah dan lanjutkan dengan j+1; ulangi sampai Anda milikia=0.

Perhatikan bahwa ini hanya heuristik sejauh yang saya tahu: pilihan i mungkin suboptimal jika menyebabkan banyak bit amenjadi tidak nol. Saya tidak yakin apakah ini bisa dihindari.

Raphael
sumber
0

Saya sebenarnya tidak punya solusi, tetapi di sini ada beberapa ide yang muncul.

Jika Anda melihat hasil XORing semua angka dalam urutan, yang memberi batas atas jumlah penambahan yang perlu Anda lakukan. Misalnya, dalam contoh Anda10,4,5,1, kita punya 10451=10, jadi Anda tahu Anda tidak perlu menambahkan lebih dari 8(karena 8-bit adalah set tertinggi). Mendistribusikan hingga delapan "yang" didistribusikan empat cara, adalah satu set kombinasi yang cukup kecil. Saya tidak ingat formula itu selarut ini, tapi adan! di suatu tempat di sana.

Untuk memberikan landasan itu sedikit lebih banyak landasan, pertimbangkan bilangan bulat sewenang-wenang A,B seperti yang AB=8. Bit yang lebih tinggi dari bit 3 jelas semua dibatalkan, sehingga Anda dapat mengabaikannya. Untuk empat bit yang lebih rendah, mereka XOR ke 8, jadi kasus terburuk yang mungkin (dalam hal jumlah yang Anda perlu tambahkan) adalah jika A=8 dan B=0(semua nol kecuali untuk bit tertinggi) karena Anda harus menambahkan +8 ke B untuk mendapatkan set bit atas. Jika ada salah satu bit di dalam salah satu nomor, Anda perlu menambahkan kurang.

Mungkin Anda bisa mulai dari ini, dan mengembangkan jumlah maksimum yang lebih ketat untuk ditambahkan.

Mark Bessey
sumber