Làm cách nào tôi có thể tìm thấy số lượng tối thiểu cần thiết để thêm vào chuỗi sao cho xor của chúng trở thành số không


8

Cho một dãy số tự nhiên, bạn có thể thêm bất kỳ số tự nhiên nào vào bất kỳ số nào trong dãy sao cho xor của chúng trở thành số không. Mục tiêu của tôi là để giảm thiểu tổng số các số được thêm vào.

Hãy xem xét các ví dụ sau:

  1. Cho câu trả lời là ; thêm vào ta được .1,32 1 3 3 = 022133=0

  2. Cho câu trả lời là ; thêm 3 đến 103 đến 5 ta được 13 \ oplus 4 \ oplus 8 \ oplus 1 = 0 .6 3 1010,4,5,163103513481=0

  3. Với 4,4 câu trả lời là 0 , vì 44=0 .

Tôi đã thử làm việc trên các biểu diễn nhị phân của số thứ tự nhưng nó rất phức tạp. Tôi muốn biết nếu có bất kỳ cách đơn giản và hiệu quả để giải quyết vấn đề này.


2
Một tuyên bố rõ ràng hơn về cùng một vấn đề từ một poster khác về math.SE có thể được tìm thấy ở đây , cùng với một câu trả lời khác.
Dilip Sarwate

Vấn đề thú vị. Có vẻ như là một vấn đề tổng của tập hợp con trong đó toán tử tổng được thay thế bằng XOR và do đó (nếu tập hợp con không XOR thành 0) thì tập tự nó được XOR với một tập khác ...{ 0 , 1 } n( k , k , ... , k )(s1,s2,,sn){0,1}n(k,k,,k)
user13675

Câu trả lời:


5

Dường như với tôi rằng chứa tất cả thông tin cần thiết: bit trong là các bit bạn cần để lật (chính xác) một trong số . Vì bạn chỉ được phép thêm , bạn phải tìm một trong đó bit tương ứng là và lật nó - điều này gây ra cùng một chi phí cho tất cả , đó là , vì vậy lựa chọn không thành vấn đề. Rắc rối bắt đầu nếu không có như vậy .a=aian1aaiaij0ai2jai

Đó là lý do tại sao bạn phải làm điều này lặp đi lặp lại và làm việc từ bit ít quan trọng nhất trở lên. Tiến hành như trên; nếu không có phù hợp , hãy chọn với số lượng tối đa bit còn lại của vị trí hiện tại - điều này làm tăng cơ hội tìm ứng viên phù hợp trong các lần lặp lại trong tương lai -, lật bit và tiếp tục, đó là lật tất cả những người ở bên trái cho đến khi bạn lật một số không. Lưu ý rằng chúng tôi vẫn thêm ). Vì mang truyền chỉ ở bên trái, các lựa chọn trước đó không bị vô hiệu. Tính toán lại và tiếp tục với ; lặp đi lặp lại cho đến khi bạn có .aiai12jaj+1a=0

Lưu ý rằng đây chỉ là một heuristic theo như tôi có thể nói: sự lựa chọn của có thể là tối ưu nếu nó khiến nhiều bit trong trở thành khác không. Tôi không chắc chắn nếu điều này có thể tránh được.ia


0

Tôi thực sự không có giải pháp, nhưng đây là một vài ý tưởng được đưa ra.

Nếu bạn nhìn vào kết quả XORing tất cả các số trong chuỗi, điều đó đưa ra giới hạn trên về số lượng bổ sung bạn cần làm. Ví dụ: trong ví dụ , chúng tôi có , vì vậy bạn biết rằng bạn không phải thêm nhiều hơn (vì 8 bit là bộ cao nhất). Phân phối tối đa tám "cái" được phân phối bốn cách, là một tập hợp kết hợp khá nhỏ. Tôi không thể nhớ công thức này vào đêm khuya, nhưng có mộttrong đó ở đâu đó10 4 5 1 = 10 8 n !10,4,5,110451=108n!

Để đưa ra tuyên bố đó có căn cứ hơn một chút, hãy xem xét các số nguyên tùy ý sao cho . Các bit cao hơn bit 3 rõ ràng là tất cả hủy bỏ, vì vậy bạn có thể bỏ qua chúng. Đối với bốn bit thấp hơn, chúng XOR thành 8, vì vậy trường hợp xấu nhất có thể xảy ra (về số lượng bạn cần thêm) là nếu và (tất cả các số 0 trừ bit cao nhất) bởi vì bạn sẽ cần thêm +8 vào B để có được tập bit trên cùng. Nếu có bất kỳ một bit nào được đặt trong một trong hai số, bạn cần thêm ít hơn.A B = 8 A = 8 B = 0A,BAB=8A=8B=0

Có lẽ bạn có thể bắt đầu từ điều này, và phát triển số tiền tối đa chặt chẽ hơn để thêm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.