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(x−ai)=∏i=1n(x−bi).
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(x0−ai)≡∏i=1n(x0−bi)(modp).
∏ni=1(x−ai)−∏ni=1(x−bi)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)n2pn2p1−1/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(x−ai)−∏i=1n(x−bi)≢0(modp).
x0p1−n/p≥1−1/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.pn2n2x0p1−O(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)1−O(1/n)für jede Konstante C / n C ).1−O(1/nC)C