Questa risposta considera un diverso modello di calcolo: il modello di RAM a costo unitario. In questo modello, le parole macchine hanno dimensione e le operazioni su di esse richiedono O ( 1 ) . Supponiamo anche per semplicità che ogni elemento dell'array si adatti a una parola macchina (e così sia al massimo n O ( 1 ) in grandezza).O(logn)O(1)nO(1)
Costruiremo un algoritmo randomizzato a tempo lineare con errore unilaterale (l'algoritmo potrebbe dichiarare che i due array contengono gli stessi elementi anche se non è così) per il problema più difficile di determinare se due array e b 1 , … , b n contengono gli stessi elementi. (Non richiediamo che nessuno di questi sia ordinato.) Il nostro algoritmo commetterà un errore con probabilità al massimo 1 / n .a1,…,anb1,…,bn1/n
L'idea è che la seguente identità valga se gli array contengono gli stessi elementi:
Il calcolo esatto di questi polinomi richiederà troppo tempo. Invece, scegliamo un primo casuale p e un casuale x 0 e testiamo se
n ∏ i = 1 ( x 0 - a i ) ≡ n ∏
∏i=1n(x−ai)=∏i=1n(x−bi).
px0
Se gli array sono uguali, il test passerà sempre, quindi concentriamoci sui casi in cui gli array sono diversi. In particolare, un coefficiente di
∏ n i = 1 ( x - a i ) - ∏ n i = 1 ( x - b i ) è diverso da zero. Poiché
a i , b ho magnitudine
n O ( 1 ) , questo coefficiente ha magnitudine
2 n n O (∏i=1n(x0−ai)≡∏i=1n(x0−bi)(modp).
∏ni=1(x−ai)−∏ni=1(x−bi)ai,binO(1) , e quindi ha al massimo
O(n)fattori primi di dimensione
Ω(n). Questo significa che se si sceglie un set di almeno
n 2 numeri primi
pdi dimensioni di almeno
n 2 (ad esempio), poi per un primo caso
pdi questo set sarà tenere con probabilità di almeno
1-1 / nche
n Π i = 1 (x- a i )2nnO(n)=nO(n)O(n)Ω(n)n2pn2p1−1/n
Unmodulo
p casuale
x 0 lo vedrà con probabilità
1 - n / p ≥ 1 - 1 / n (poiché un polinomio di grado al massimo
n ha al massimo
n radici).
∏i=1n(x−ai)−∏i=1n(x−bi)≢0(modp).
x0p1−n/p≥1−1/nnn
pn2n2x0p1−O(1/n)O ( n )p
n2Ω ( 1 / logn )p( logn )O ( 1 )X0pX0
O ( n )1 - O ( 1 / n )1 - O ( 1 / nC)C