Cette réponse considère un modèle de calcul différent: le modèle RAM à coût unitaire. Dans ce modèle, les mots machine ont la taille et les opérations sur eux prennent . Nous supposons également par souci de simplicité que chaque élément du tableau tient dans un seul mot machine (et est donc au plus en magnitude).O ( 1 ) n O ( 1 )O(logn)O(1)nO(1)
Nous allons construire un algorithme aléatoire temporel linéaire avec une erreur unilatérale (l'algorithme peut déclarer que les deux tableaux contiennent les mêmes éléments même si ce n'est pas le cas) pour le problème plus difficile de déterminer si deux tableaux et contiennent les mêmes éléments. (Nous n'avons besoin d'aucun d'entre eux pour être triés.) Notre algorithme fera une erreur avec une probabilité au plus .b 1 , … , b n 1 / na1,…,anb1,…,bn1/n
L'idée est que l'identité suivante est valable si les tableaux contiennent les mêmes éléments:
Le calcul exact de ces polynômes prendra trop de temps. Au lieu de cela, nous choisissons un nombre premier aléatoire et un aléatoire et testons si
Si les tableaux sont égaux, le test réussira toujours, alors concentrons-nous sur les cas où les tableaux sont différents. En particulier, un certain coefficient de est non nul. Puisque ont une magnitude , ce coefficient a une magnitudepx0 n ∏ i = 1 (x0-ai)≡ n ∏ i = 1 (x0-bi)
∏i=1n(x−ai)=∏i=1n(x−bi).
px0∏i=1n(x0−ai)≡∏i=1n(x0−bi)(modp).
∏ni=1(x−ai)−∏ni=1(x−bi)ai,binO(1)2nnO(n)=nO(n), et donc il a au plus facteurs premiers de taille . Cela signifie que si nous choisissons un ensemble d'au moins nombres premiers de taille au moins (disons), alors pour un nombre premier aléatoire de cet ensemble, il tiendra avec probabilité au moins que
Un modulo aléatoire en sera témoin avec une probabilité de (puisqu'un polynôme de degré au plus a au plus racines).
O(n)Ω(n)n2pn2p1−1/n∏i=1n(x−ai)−∏i=1n(x−bi)≢0(modp).
x0p1−n/p≥1−1/nnn
En conclusion, si nous choisissons un aléatoire de taille à peu près parmi un ensemble d'au moins nombres premiers différents, et un modulo aléatoire , alors lorsque les tableaux ne contiennent pas les mêmes éléments, notre test échouera avec probabilité . L'exécution du test prend du temps car s'inscrit dans un nombre constant de mots machine.pn2n2x0p1−O(1/n)O(n)p
En utilisant le test de primalité temporelle polynomiale et comme la densité des nombres premiers de taille à peu près est , nous pouvons choisir un nombre premier aléatoire dans le temps . Le choix d'un modulo aléatoire peut être implémenté de différentes manières, et est facilité car dans notre cas, nous n'avons pas besoin d'un aléatoire complètement uniforme .n2Ω(1/logn)p(logn)O(1)x0px0
En conclusion, notre algorithme s'exécute dans le temps , génère toujours OUI si les tableaux contiennent les mêmes éléments et génère NON avec la probabilité si les tableaux ne contiennent pas les mêmes éléments. On peut améliorer la probabilité d'erreur de pour toute constante .O(n)1−O(1/n)1−O(1/nC)C