Ricerca di valori XOR massimi e minimi consecutivi


8

Dato un array intero (dimensione massima 50000), devo trovare la minima e massima tale che per alcuni , con .XX=apap+1aqpqpq

Ho provato questo processo: per tutti . L'ho pre-calcolato in e quindi il valore di per alcuni , tale che è: . Così:sumi=a0a1aiiO(n)Xpq(pq)X=sumqsump1

MinAns=min(p,q) s.t. pqsumqsump1MaxAns=max(p,q) s.t. pqsumqsump1

Ma questo processo è di O(n2) . Come posso farlo in modo più efficiente?


1
Hai preso in considerazione l'ordinamento della tua lista 'somma'? Sembra che i valori adiacenti siano più propensi a cancellare molti bit e finire vicino a 0.
Craig Gidney,

Risposte:


7

Se è la dimensione in bit degli interi, è possibile calcolare il tempo Max in .kO(nk)

Fondamentalmente, il problema è, dato , -bit interi , trovare tale che è massimo.nkSii,jSiSj

ogni come una stringa binaria (guardando la rappresentazione binaria) e create un trie da quelle stringhe. Questo richiede tempo .SiO(nk)

Ora per ogni , stai provando a camminare il complemento di nel trie che hai creato (prendendo il ramo migliore ad ogni passo in pratica), trovando una tale che è il massimo.SjSjjSjSj

Fallo per ogni e trovi la risposta in tempo.jO(nk)

Poiché i tuoi numeri interi sono limitati, questo algoritmo per max è sostanzialmente lineare, così come l'algoritmo per min ottenuto per ordinamento (poiché l'ordinamento può essere eseguito in tempo lineare).

Per inciso, se non c'erano limiti, puoi ridurre la nitidezza degli elementi alla versione minima.


"Fondamentalmente, il problema è, dato n, k-bit interi Si, trova i, j tale che Si⊕Sj è massimo." Non capisco questa riga. voglio che Si⊕Si + 1⊕ ... ⊕ Sj sia il massimo? correggimi se mi manca qualcosa
palatok,

1
@Aryabhata, non è giusto considerare lineare. Dopotutto, , (a meno che l'elenco non possa avere duplicati). È comunque una bella soluzione. O(nk)klog2n
Karolis Juodelė,

1
@Aryabhata, a causa di quel limite potresti anche dire che l'algoritmo è . Questo non è molto descrittivo però. O(1)
Karolis Juodelė,

1
La domanda non dice che gli interi sono limitati; dice che l' array ha dimensioni al massimo di 50000. Quindi in realtà è costante, non !! nk
JeffE,

1
@JeffE: Oh! E ora che fai notare (e concordo con questa interpretazione), i commenti di Karolis hanno tutti un senso per me adesso. Grazie!
Aryabhata,

5

L'ordinamento aiuta anche con . Almeno un pochino. Chiaramente, il massimo sarebbe raggiunto da . Quindi per ogni faccio una ricerca binaria per . Questo è il tempo , uguale all'ordinamento, quindi rimane la complessità dell'intera procedura.maxx¬xx=sumi¬xO(nlogn)


che dire del valore minimo?
palatok,

cosa succede se non trovo ¬x?
palatok,

@palatok, il valore minimo era già stato spiegato. Se non trovi , controlla le due somme più vicine a dove sarebbe. ¬x
Karolis Juodelė,

sumi,sumj dovrebbe essere 0 o 1. La tabella hash sarà sufficiente.
Strin,

@Strin, non capisco cosa intendi. è lungo bit. Come sarebbe utile una tabella di hash - chiudi, non sono necessari valori esatti. sumik
Karolis Juodelė,

4

Ecco perché il suggerimento di Strilanc funziona per . Considera l'array e supponi che il minimo sia raggiunto da , dove . Sia (nel qual caso ), o , per qualche . Supponiamo che e che . Se allora , mentre se allora . Pertanto .minsumap,aqp<qap=aqap=ap+1ap=x0yaq=x1zx,y,zq>p+1ap+1=xbwb=0apap+1<apaqb=1ap+1aq<apaqq=p+1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.