Bei einem ganzzahligen Array (maximale Größe 50000) muss ich das minimale und maximale so finden, dass für einige , mit . p q p ≤ q
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 q ⊕ Summe p - 1
Aber dieser Prozess ist von . Wie kann ich das effizienter machen?
Antworten:
Wenn die Bitgröße der ganzen Zahlen ist, können Sie das Maximum in berechnen .O ( n k )k O(nk)
Grundsätzlich besteht das Problem darin, bei , Bit-Ganzzahlen so zu finden dass maximal ist.n k Si i,j Si⊕Sj
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.Si O(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.Sj Sj j′ Sj⊕Sj′
Tun Sie dies für jedes , und Sie finden die Antwort in Zeit.O ( n k )j O(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.
quelle
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.max x⊕¬x x=sumi ¬x O(nlogn)
quelle
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 , zmin sum ap,aq p<q ap=aq ap=ap+1 ap=x0y aq=x1z x,y,z . Angenommen, , und lassen Sie a p + 1 = x b w . Wenn b = 0, dann ist a p ⊕ a p + 1 < a p ⊕ a q , während wenn b = 1, dann ist a p + 1 ⊕ a q < a p ⊕ a q . Daher ist q = p + 1q>p+1 ap+1=xbw b=0 ap⊕ap+1<ap⊕aq b=1 ap+1⊕aq<ap⊕aq q=p+1 .
quelle