Deterministischer linearer Zeitalgorithmus zur Überprüfung, ob ein Array eine sortierte Version des anderen ist

19

Betrachten Sie das folgende Problem:

Eingabe: zwei Arrays A und B der Länge n , wobei B in sortierter Reihenfolge ist.

Frage: Sie A und B enthalten die gleichen Elemente (mit ihrer Vielfalt)?

Was ist der schnellste deterministische Algorithmus für dieses Problem?
Kann es schneller gelöst werden als sie zu sortieren? Kann dieses Problem in deterministischer linearer Zeit gelöst werden?

Albert Hendriks
quelle
1
FWIW der probabilistische Ansatz ist Hashing mit einer auftragsunabhängigen Hash-Funktion. Carter und Wegman haben eine der Originalarbeiten dazu geschrieben ( sciencedirect.com/science/article/pii/0022000081900337 ), aber ich habe in den Zitaten dieser Arbeit nichts gesehen, was auf einen deterministischen Algorithmus hindeutet (bis jetzt).
KWillets
1
Die Aussage, die Sie zitieren, bezieht sich auf das Turing-Maschinenmodell, das nur theoretisch von Interesse ist. Algorithmen werden normalerweise in Bezug auf das RAM-Modell analysiert.
Yuval Filmus
ah, dann ist das das Modell, das ich suche. Ich habe die Frage angepasst.
Albert Hendriks
Warum summieren Sie nicht einfach die Elemente im Array und vergleichen dann die Summe? In Bezug auf Ihren Titel ist er linear und beantwortet die Frage: Ist ein Array die sortierte Version des anderen? '. Mir ist bewusst, dass es sich nicht um das Turing-Maschinenmodell handelt, sondern um eine praktische Lösung.
Atayenel
1
@ AlbertHendriks Sie können (höchstwahrscheinlich) kein Array in auf einer Turing-Maschine sortieren . Einige Untergrenzen für SAT (z. B. cs.cmu.edu/~ryanw/automated-lbs.pdf ) gelten tatsächlich für den RAM-Rechner, entschuldigen Sie meinen irreführenden früheren Kommentar. O(nLogn)
Yuval Filmus

Antworten:

14

Sie haben Ihr Berechnungsmodell nicht angegeben, daher nehme ich das Vergleichsmodell an.

Betrachten Sie den Sonderfall, in dem das Array aus der Liste { 1 , 2 } × { 3 , 4 } × × { 2 n - 1 , 2 n } genommen wird . In Worten ist das i- te Element entweder 2 i - 1 oder 2 i .B

{1,2}×{3,4}××{2n1,2n}.
i2i12i

Ich behaupte, wenn der Algorithmus zu dem Schluss kommt, dass und B dieselben Elemente enthalten, hat der Algorithmus jedes Element in B mit seinem Gegenstück in A verglichen . Tatsächlich wird angenommen , dass der Algorithmus schließt daraus , dass A und B die gleichen Elemente enthalten, aber nie vergleicht das erste Element B zu seinem Gegenstück in A . Wenn wir das erste Element umschalten, würde der Algorithmus genauso vorgehen, auch wenn die Antwort unterschiedlich ist. Dies zeigt, dass der Algorithmus das erste Element (und jedes andere Element) mit seinem Gegenstück in A vergleichen muss .ABBAABBAA

Dies bedeutet, dass, wenn und B dieselben Elemente enthalten, der Algorithmus nach Überprüfung die sortierte Reihenfolge von A kennt . Daher muss es mindestens n haben ! verschiedene Blätter, und so dauert es Zeit Ω ( n log n ) .ABAn!Ω(nlogn)

Yuval Filmus
quelle
Ich hätte gedacht, dass dies bedeuten würde, dass im Allgemeinen, aber anscheinend ist das Vergleichsmodell damit unterschiedlich. P=Ω(nLogn)
Albert Hendriks
@ AlbertHendriks, es ist dasselbe Modell, das verwendet wird, um die untere Grenze für die Sortierung anzuzeigen. Dies bedeutet, dass Sie nur einen Vergleich durchführen können, ohne ihn zu verbessern. Ich denke, das beantwortet Ihre Frage.
Kaveh
[Cntd] wir haben nicht einmal für das Sortieren stärkere Grenzen! und wenn Sie schneller sortieren können als n lg n, können Sie das zur schnelleren Lösung des Problems als n lg n verwenden.
Kaveh
1
@ AlbertHendriks, kennen Sie sich mit linearen Zeitalgorithmen zum Sortieren von ganzen Zahlen aus? Schlagen Sie es in CLRS nach. Ihr Fall könnte einer der Fälle sein, in denen wir in linearer Zeit sortieren können.
Kaveh
6
Ganzzahlen können in (siehe nada.kth.se/~snilsson/fast-sorting ) oder in der erwarteten Zeit O ( n ) sortiert werdenO(nloglogn)(sieheieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1181890) oder sogar in linearer Zeit, wenn die Wortgröße groß genug ist (siehe LNCS 8503, S. 26ff). O(nloglogn)
Yuval Filmus
10

Diese Antwort betrachtet ein anderes Berechnungsmodell: das Stückkosten-RAM-Modell. In diesem Modell haben Maschinenwörter die Größe , und Operationen an ihnen dauern O ( 1 ) . Der Einfachheit halber nehmen wir auch an, dass jedes Array-Element in ein Maschinenwort passt (und daher höchstens n 0 ( 1 ) beträgt ).O(logn)O(1)nO(1)

Wir werden einen linearen, zeitlich zufälligen Algorithmus mit einseitigem Fehler konstruieren (der Algorithmus könnte erklären, dass die beiden Arrays dieselben Elemente enthalten, auch wenn dies nicht der Fall ist), um das schwierigere Problem zu lösen, ob zwei Arrays und b 1 , , b n enthalten die gleichen Elemente. (Wir brauchen keine Sortierung.) Unser Algorithmus wird mit einer Wahrscheinlichkeit von höchstens 1 / n einen Fehler machen .a1,,anb1,,bn1/n

Die Idee ist , dass die folgende Identität gilt iff die Anordnungen dieselben Elemente enthalten: Das genaue Berechnen dieser Polynome wird zu viel Zeit in Anspruch nehmen. Stattdessen wählen wir eine zufällige Primzahl p und eine zufällige x 0 und testen, ob n i = 1 ( x 0 - a i ) n ∏ ist

i=1n(xai)=i=1n(xbi).
px0 Wenn die Arrays gleich sind, besteht der Test immer. Konzentrieren wir uns also auf die Fälle, in denen die Arrays unterschiedlich sind. Insbesondere einige Koeffizient Π n i = 1 ( x - a i ) - Π n i = 1 ( x - b i ) nicht Null. Da a i , b i die Größe n ) = n O ( n ) hat , hat es höchstens O ( n)
i=1n(x0ai)i=1n(x0bi)(modp).
i=1n(xai)i=1n(xbi)ai,bi , hat dieser Koeffizient die Größe 2 n n O (nO(1)2nnO(n)=nO(n) Primfaktoren der Größe Ω ( n ) . Dies bedeutet, dass, wenn wir eine Menge von mindestens n 2 Primzahlen p mit einer Größe von mindestens n 2 (etwa)wählen, für eine zufällige Primzahl p dieser Menge mit einer Wahrscheinlichkeit von mindestens 1 - 1 / n gilt, dass O(n)Ω(n)n2pn2p11/n Ein zufälliges x 0 Modulo p wird dies mit einer Wahrscheinlichkeit von 1 - n / p 1 - 1 / n bezeugen(da ein Polynom vom Grad höchstens n höchstens n Wurzeln hat).
i=1n(xai)i=1n(xbi)0(modp).
x0p1n/p11/nnn

Wenn wir also ein zufälliges einer Größe von ungefähr n 2 aus einer Menge von mindestens n 2 verschiedenen Primzahlen und ein zufälliges x 0- Modulo p auswählen , schlägt unser Test fehl, wenn die Arrays nicht dieselben Elemente enthalten Wahrscheinlichkeit 1 - O ( 1 / n ) . Das Ausführen des Tests benötigt die Zeit O ( n ), da p in eine konstante Anzahl von Maschinenwörtern passt.pn2n2x0p1O(1/n)O(n)p

Mit Polynom Primtests Zeit und da die Dichte der Primzahlen der Größe ungefähr ist Ω ( 1 / log n ) , können wir eine zufällige Primzahl wählen p in der Zeit ( log n ) O ( 1 ) . Die Wahl eines zufälligen x 0 modulo p kann auf verschiedene Arten implementiert werden und wird erleichtert, da wir in unserem Fall kein völlig gleichmäßiges zufälliges x 0 benötigen .n2Ω(1/logn)p(logn)O(1)x0px0

Zusammenfassend läuft unser Algorithmus in der Zeit , gibt immer JA aus, wenn die Arrays die gleichen Elemente enthalten, und gibt NEIN mit der Wahrscheinlichkeit 1 - O ( 1 / n ) aus, wenn die Arrays nicht die gleichen Elemente enthalten. Wir können die Fehlerwahrscheinlichkeit auf 1 - O verbessern ( 1O(n)1O(1/n)für jede Konstante C / n C ).1O(1/nC)C

Yuval Filmus
quelle
1
Während dieser Algorithmus randomisiert ist, wird erläutert, wie die Ideen in einigen anderen Antworten implementiert werden, damit sie tatsächlich funktionieren. Es hat auch einen Vorteil gegenüber dem Hashtable-Ansatz: Es ist vorhanden.
Yuval Filmus
Ich denke, das OP mag keine probabilistischen Algorithmen, da er den erwarteten linearen Zeitalgorithmus mit einer Hash-Tabelle nicht mag.
Kaveh
Kaveh, du hast recht. Aber natürlich ist diese Lösung auch interessant und sollte beibehalten werden, sie löst den Fall für probabilistische Algorithmen. Ich denke auch, dass es das Modell verwendet, das ich suche.
Albert Hendriks
1
Ich frage mich nur, ob die Notation O (1 / n) korrekt ist. Natürlich weiß ich, was du meinst, aber ich denke, nach der Definition von Big-O ist dies gleichbedeutend mit O (1).
Albert Hendriks
2
C/nnO(1)
-3

Ich werde einen anderen Algorithmus vorschlagen (oder zumindest ein Schema eines solchen Algorithmus)

[min,max]

  1. O(n)minmax

  2. Subtrahiere die minvon allen Werten von beiden Arrays (hier wird die Tatsache, dass ein Array bereits in sortierter Reihenfolge ist, nicht berücksichtigt, vermutlich kann dies verbessert werden)

  3. 1c>1

  4. max-minO((maxmin)n)

man beachte, dass das obige Algorithmusschema in vielen praktischen Situationen (deterministisch) ziemlich schnell sein kann.

Das obige Algorithmusschema ist eine Variation eines linearen Zeitsortieralgorithmus, der "sich bewegende Massen " verwendet. Die physikalische Intuition hinter dem Sortieralgorithmus " Moving Masses " lautet:

Nehmen Sie an, dass der Wert jedes Elements tatsächlich dessen Massengröße darstellt, und stellen Sie sich vor, Sie ordnen alle Elemente in einer Linie an und wenden dieselbe Beschleunigungskraft an.

Dann bewegt sich jeder Gegenstand in Bezug auf seine Masse um eine Distanz, massiver weniger Distanz und umgekehrt. Zum Abrufen der sortierten Artikel sammeln Sie die Artikel einfach in umgekehrter Reihenfolge nach zurückgelegter Entfernung.

Dieser Algorithmus ist linear und deterministisch , es gibt jedoch eine Einschränkung dahingehend, dass der Betrag der anfänglichen Beschleunigungskraft und der zurückzulegenden Strecke (oder die Wartezeit) mit der Verteilung der Werte (dh den " Massen ") zusammenhängtmeinx-michnFaktor oben). Man kann auch versuchen, den Raum zu diskretisieren, in dem die Elemente in ein Gitter wandern, und einen konstanten Faktor für die Algorithmusgeschwindigkeit erhalten (und eine schnelle Sortierroutine verwenden, um verschiedene Elemente in derselben Zelle zu sortieren ).

In dieser Hinsicht ähnelt der obige Algorithmus numerisch basierten Sortieralgorithmen (z. B. Radix-Sortierung , Zähl-Sortierung ).

Man könnte meinen, dass dieser Algorithmus nicht viel bedeutet, aber er zeigt mindestens eines. Das " fundamentale " Sortieren beliebiger Zahlen auf physikalischer Ebene ist eine linear-zeitliche Operation in Bezug auf die Anzahl der Elemente.

Nikos M.
quelle
Wenn Sie die Elemente in umgekehrter Reihenfolge der zurückgelegten Entfernung sammeln, würde dies nicht zu Vergleichen auf Implementierungsebene führen, und müssen Sie zu diesem Zeitpunkt die "Entfernungen" nicht sortieren?
JustAnotherSoul