Penso di avere un algoritmo O (n Lg U) per questo, dove U è il numero più grande. L'idea è simile a quella di user949300, ma con qualche dettaglio in più.
L'intuizione è la seguente.Quando stai XORando due numeri insieme, per ottenere il valore massimo, vuoi avere un 1 nella posizione più alta possibile, e quindi degli abbinamenti che hanno un 1 in questa posizione, vuoi un abbinamento con un 1 alla successiva possibile posizione più alta, ecc.
Quindi l'algoritmo è il seguente. Iniziate trovando il massimo 1 bit in qualsiasi punto dei numeri (potete farlo nel tempo O (n lg U) eseguendo il lavoro O (lg U) per ciascuno dei n numeri). Ora, dividi l'array in due parti: uno dei numeri che hanno un 1 in quel bit e il gruppo con 0 in quel bit. Qualsiasi soluzione ottimale deve combinare un numero con un 1 nel primo punto con un numero con uno 0 in quel punto, poiché ciò metterebbe un 1 bit più alto possibile. Qualsiasi altro accoppiamento ha uno 0 lì.
Ora, in modo ricorsivo, vogliamo trovare l'accoppiamento di numeri dal gruppo 1 e 0 che ha il più alto 1 in essi. Per fare questo, di questi due gruppi, dividerle in quattro gruppi:
- numeri che iniziano con 11
- numeri che iniziano con 10
- numeri che iniziano con 01
- numeri che iniziano con 00
Se ci sono numeri nel gruppo 11 e 00 o nei gruppi 10 e 01, il loro XOR sarebbe ideale (iniziando con 11). Di conseguenza, se una di queste coppie di gruppi non è vuota, calcola ricorsivamente la soluzione ideale da quei gruppi, quindi restituisce il massimo di tali soluzioni per sottoproblemi. Altrimenti, se entrambi i gruppi sono vuoti, significa che tutti i numeri devono avere la stessa cifra nella loro seconda posizione. Di conseguenza, lo XOR ottimale di un numero che inizia con 1 e un numero che inizia con 0 finirà con l'annullamento del secondo bit successivo, quindi dovremmo solo guardare il terzo bit.
Questo dà il seguente algoritmo ricorsivo che, a partire dai due gruppi di numeri partizionata da loro MSB, dà la risposta:
- Dato gruppo 1 e gruppo 0 e un indice di bit i:
- Se l'indice di bit è uguale al numero di bit, restituire lo XOR del numero (univoco) nel gruppo 1 e il numero (univoco) nel gruppo 0.
- Costruisci i gruppi 11, 10, 01 e 00 da quei gruppi.
- Se il gruppo 11 e il gruppo 00 sono non vuota, in modo ricorsivo trovare il XOR massimo di questi due gruppi a partire da po 'i + 1.
- Se il gruppo 10 e il gruppo 01 sono non vuota, in modo ricorsivo trovare la XOR massimo di questi due gruppi, a partire dal bit i + 1.
- Se uno degli accoppiamenti precedenti era possibile, restituire la coppia massima trovata dalla ricorsione.
- In caso contrario, tutti i numeri devono avere lo stesso bit in posizione i, in modo da restituire la coppia massima trovato, cercando in bit i + 1 sui gruppi 1 e 0.
per iniziare la Algoritmo, puoi effettivamente suddividere i numeri dal gruppo iniziale in due gruppi: i numeri con MSB 1 e i numeri con MSB 0. Quindi fai una chiamata ricorsiva all'algoritmo sopra con i due gruppi di numeri.
Ad esempio, considerare i numeri 5 1 4 3 0 2.Questi hanno rappresentazioni
101 001 100 011 000 010
Cominciamo, dividendoli in 1 gruppo e il gruppo 0:
101 100
001 011 000 010
Ora, applichiamo l'algoritmo di cui sopra. Ci siamo divisi in gruppi questo 11, 10, 01 e 00:
11:
10: 101 100
01: 011 010
00: 000 001
Ora, non possiamo abbinare ogni 11 elementi con 00 elementi, quindi abbiamo recurse sui gruppi 10 e 01. Ciò significa che costruire i 100, 101, 010, e 011 gruppi:
101: 101
100: 100
011: 011
010: 010
Ora che siamo giù a secchi con un solo elemento in esse, possiamo solo controllare le coppie di 101 e 010 (che dà 111) e 100 e 011 (che dà 111). Entrambe le opzioni funzionano qui, quindi la risposta ottimale è 7.
Pensiamo al tempo di esecuzione di questo algoritmo. Si noti che la profondità massima di ricorsione è O (lg U), poiché ci sono solo bit O (log U) nei numeri. Ad ogni livello dell'albero, ogni numero appare esattamente in una chiamata ricorsiva, e ciascuna delle chiamate ricorsive funziona in modo proporzionale al numero totale di numeri nei gruppi 0 e 1, perché è necessario distribuirli per i loro bit. Di conseguenza, ci sono livelli O (log U) nell'albero di ricorsione, e ogni livello fa O (n) funziona, dando un lavoro totale di O (n log U).
Spero che questo aiuti! Questo è stato un grosso problema!
Una buona scommessa sta prendendo la più grande e più piccolo valore in quanto i bit della piccola di valore sono quindi improbabile che 'distruggere' i 'buoni' bit alti della alta valore durante il processo xor. –
non riuscito per arr = {8,4,2} la risposta è 8^4 e 4 non è la più piccola ... –
@ 500-InternalServerError: Sarà sicuramente una coppia di numeri, uno dei quali ha il bit più alto impostato e l'altro ha resettato. –