Finden des Maximums und Minimums aufeinanderfolgender XOR-Werte

8

Bei einem ganzzahligen Array (maximale Größe 50000) muss ich das minimale und maximale X so finden, dass für einige , mit . p q p qX=apap+1aqpqpq

Ich habe diesen Prozess ausprobiert: für alle . Ich habe es in vorberechnet und dann den Wert von für einige , so, dass ist: X = \ text {sum} _q \ oplus \ text {sum} _ {p- 1} . Somit: i O ( n ) X p q ( p q ) X = Summe qSumme p - 1sumi=a0a1aiiO(n)Xpq(pq)X=sumqsump1

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

Aber dieser Prozess ist von O(n2) . Wie kann ich das effizienter machen?

Palatok
quelle
1
Haben Sie darüber nachgedacht, Ihre Summenliste zu sortieren? Es scheint, als würden benachbarte Werte mit größerer Wahrscheinlichkeit viele Bits aufheben und nahe 0 enden.
Craig Gidney

Antworten:

7

Wenn die Bitgröße der ganzen Zahlen ist, können Sie das Maximum in berechnen .O ( n k )kO(nk)

Grundsätzlich besteht das Problem darin, bei , Bit-Ganzzahlen so zu finden dass maximal ist.nkSii,jSiSj

Sie behandeln jedes als eine binäre Zeichenfolge (mit Blick auf die binäre Darstellung) und erstellen aus diesen Zeichenfolgen einen Versuch. Dies dauert Zeit.SiO(nk)

Nun versuchen Sie für jedes , das Komplement von in dem von Ihnen erstellten Versuch zu (wobei Sie bei jedem Schritt im Grunde genommen den besten Zweig nehmen) und finden ein so dass maximal ist.SjSjjSjSj

Tun Sie dies für jedes , und Sie finden die Antwort in Zeit.O ( n k )jO(nk)

Da Ihre ganzen Zahlen begrenzt sind, ist dieser Algorithmus für max grundsätzlich linear, ebenso wie der Algorithmus für min, der durch Sortieren erhalten wird (da das Sortieren in linearer Zeit erfolgen kann).

Übrigens, wenn es keine Grenzen gab, können Sie die Elementunterscheidbarkeit auf die Min-Version reduzieren.

Aryabhata
quelle
"Grundsätzlich besteht das Problem darin, bei n, k-Bit-Ganzzahlen Si i, j so zu finden, dass Si⊕Sj maximal ist." Ich verstehe diese Zeile nicht. Ich möchte, dass Si⊕Si + 1⊕ ... ⊕ Sj maximal ist? Korrigieren Sie mich, wenn ich etwas vermisse
Palatok
1
@Aryabhata, es ist unfair, linear zu betrachten. Immerhin ist k log 2 n (es sei denn, die Liste kann Duplikate enthalten). Es ist trotzdem eine schöne Lösung. O(nk)klog2n
Karolis Juodelė
1
@Aryabhata, aufgrund dieser Grenze könnte man genauso gut sagen, dass der Algorithmus . Das ist allerdings nicht sehr beschreibend. O(1)
Karolis Juodelė
1
Die Frage besagt nicht , dass die ganzen Zahlen begrenzt sind; es heißt, dass das Array eine Größe von höchstens 50000 hat. Tatsächlich ist also konstant, nicht k !! nk
JeffE
1
@ JeffE: Oh! Und jetzt, wo Sie darauf hinweisen (und ich stimme dieser Interpretation zu), sind Karolis 'Kommentare für mich jetzt alle sinnvoll. Vielen Dank!
Aryabhata
5

Sortieren hilft auch bei . Zumindest ein bisschen. Es ist klar, dass das Maximum durch x ¬ x erreicht werden würde . Also mache ich für jede x = Summe eine binäre Suche nach ¬ x . Das ist O ( n log n ) Zeit, genau wie beim Sortieren, so dass die Komplexität des gesamten Verfahrens erhalten bleibt.maxx¬xx=sumi¬xO(nlogn)

Karolis Juodelė
quelle
Was ist mit dem Mindestwert?
Palatok
Was ist, wenn ich ¬x nicht finde?
Palatok
@palatok, min Wert wurde bereits erklärt. Wenn Sie nicht finden , überprüfen Sie die beiden Summen, die der Position am nächsten liegen. ¬x
Karolis Juodelė
sollte 0 oder 1 sein. Eine Hash-Tabelle wird ausreichen. sumi,sumj
Strin
@ Strin, ich verstehe nicht was du meinst. ist k Bits lang. Wie wäre eine Hash-Tabelle nützlich? Es werden enge, nicht genaue Werte benötigt. sumik
Karolis Juodelė
4

Hier ist, warum Strilancs Vorschlag für funktioniert . Betrachten Sie Ihr Array s u m und nehmen Sie an, dass das Minimum durch a p , a q erreicht wird , wobei p < q ist . Entweder a p = a q (in diesem Fall a p = a p + 1 ) oder a p = x 0 y , a q = x 1 z für einige x , y , zminsumap,aqp<qap=aqap=ap+1ap=x0yaq=x1zx,y,z. Angenommen, , und lassen Sie a p + 1 = x b w . Wenn b = 0, dann ist a pa p + 1 < a pa q , während wenn b = 1, dann ist a p + 1a q < a pa q . Daher ist q = p + 1q>p+1ap+1=xbwb=0apap+1<apaqb=1ap+1aq<apaqq=p+1.

Yuval Filmus
quelle