Tôi nghĩ rằng tôi có một thuật toán O (n lg U) cho điều này, trong đó U là số lớn nhất. Ý tưởng này tương tự như của user949300, nhưng với một chút chi tiết hơn.
Trực giác như sau.Khi bạn XORing hai số với nhau, để có được giá trị tối đa, bạn muốn có 1 ở vị trí cao nhất có thể, và sau đó của các cặp có 1 ở vị trí này, bạn muốn ghép đôi với 1 ở vị trí tiếp theo vị trí cao nhất có thể, v.v.
Vì vậy, thuật toán như sau. Bắt đầu bằng cách tìm 1 bit cao nhất ở bất kỳ đâu trong các con số (bạn có thể làm điều này trong thời gian O (n lg U) bằng cách thực hiện công việc O (lg U) cho mỗi số n). Bây giờ, chia mảng thành hai phần - một trong những số có 1 trong bit đó và nhóm có 0 trong bit đó. Bất kỳ giải pháp tối ưu nào cũng phải kết hợp một số với số 1 ở vị trí đầu tiên với một số có 0 ở vị trí đó, vì điều đó sẽ đặt một bit cao nhất có thể. Bất kỳ cặp đôi nào khác có 0 ở đó.
Bây giờ, đệ quy, chúng tôi muốn tìm ghép các số từ nhóm 1 và 0 có số cao nhất trong số đó. Để làm điều này, trong hai nhóm này, chia chúng thành bốn nhóm:
- số bắt đầu với 11
- số bắt đầu với 10
- số bắt đầu với 01
- số bắt đầu với 00
Nếu có bất kỳ số nào trong nhóm 11 và 00 hoặc trong 10 và 01 nhóm, XOR của chúng sẽ là lý tưởng (bắt đầu bằng 11). Do đó, nếu một trong hai cặp nhóm đó không có sản phẩm nào, hãy tính toán giải pháp lý tưởng một cách đệ quy từ các nhóm đó, sau đó trả về tối đa các giải pháp dưới đây. Nếu không, nếu cả hai nhóm trống, điều này có nghĩa là tất cả các số phải có cùng chữ số ở vị trí thứ hai của chúng. Do đó, XOR tối ưu của một số bắt đầu bằng 1 và một số bắt đầu bằng 0 sẽ kết thúc có bit thứ hai tiếp theo bị hủy, vì vậy chúng ta chỉ cần nhìn vào bit thứ ba.
Điều này cho phép các thuật toán đệ quy sau đó, bắt đầu với hai nhóm số phân chia bởi MSB của họ, cung cấp cho câu trả lời:
- Với nhóm 1 và nhóm 0 và một chỉ số chút i:
- Nếu chỉ số bit bằng số bit, trả về XOR của số (duy nhất) trong nhóm 1 và số (duy nhất) trong nhóm 0.
- Tạo nhóm 11, 10, 01 và 00 từ các nhóm đó.
- Nếu nhóm 11 và nhóm 00 không có giá trị, đệ quy tìm XOR tối đa của hai nhóm đó bắt đầu từ bit i + 1.
- . bắt đầu từ bit i + 1.
- Nếu một trong các cặp trên có thể xảy ra, sau đó trả lại cặp tối đa do đệ quy tìm thấy.
- Nếu không, tất cả các con số phải có chút tương tự ở vị trí i, nên trả lại cặp tối đa tìm thấy bằng cách nhìn vào chút i + 1 vào nhóm 1 và 0.
Để bắt đầu ra khỏi thuật toán, bạn thực sự có thể phân vùng các số từ nhóm ban đầu thành hai nhóm - các số có MSB 1 và các số có MSB 0. Sau đó bạn sẽ thực hiện cuộc gọi đệ quy đến thuật toán trên với hai nhóm số.
Ví dụ, hãy xem xét các số 5 1 4 3 0 2.Những có cơ quan đại diện
101 001 100 011 000 010
Chúng tôi bắt đầu bằng cách tách chúng thành 1 nhóm và nhóm 0:
101 100
001 011 000 010
Bây giờ, chúng tôi áp dụng các thuật toán ở trên. Chúng tôi chia nhóm này thành các nhóm 11, 10, 01 và 00:
11:
10: 101 100
01: 011 010
00: 000 001
Bây giờ, chúng tôi không thể ghép nối bất kỳ 11 phần tử với 00 yếu tố, vì vậy chúng tôi chỉ recurse trên 10 và 01 nhóm. Điều này có nghĩa là chúng tôi xây dựng các nhóm 100, 101, 010 và 011:
101: 101
100: 100
011: 011
010: 010
Bây giờ, chúng tôi chỉ cần kiểm tra các cặp 101 và 010 (cung cấp 111) và 100 và 011 (cho 111). Hoặc tùy chọn hoạt động ở đây, vì vậy chúng tôi nhận được câu trả lời tối ưu là 7.
Hãy suy nghĩ về thời gian chạy của thuật toán này. Lưu ý rằng độ sâu đệ quy tối đa là O (lg U), vì chỉ có các bit O (log U) trong các số. Ở mỗi cấp trong cây, mỗi số xuất hiện chính xác trong một cuộc gọi đệ quy, và mỗi cuộc gọi đệ quy làm việc tỷ lệ thuận với tổng số các số trong nhóm 0 và 1, bởi vì chúng ta cần phân phối chúng theo bit của chúng. Do đó, có O (log U) cấp trong cây đệ quy, và mỗi cấp độ O (n) làm việc, cho một tổng công việc của O (n log U).
Hy vọng điều này sẽ hữu ích! Đây là một vấn đề tuyệt vời!
Một cược tốt là lấy giá trị lớn nhất và nhỏ nhất kể từ bit giá trị nhỏ của thì khó có khả năng 'tiêu diệt' các 'tốt' bit cao của cao giá trị trong quá trình xor. –
không thành công cho câu trả lời arr = {8,4,2} là 8^4 và 4 không phải là nhỏ nhất ... –
@ 500-InternalServerError: Đó chắc chắn sẽ là một cặp số, một trong số đó có bộ bit đầu và người kia đã thiết lập lại. –