L'algoritmo ingenuo per determinare da :BA
Per , determinare il valore di B ( k ) confrontando ogni A ( i ) con A ( k ) per
i = 1 , … , k e contando quelli che soddisfano A ( i ) < A ( k ) .k=1,…,nB(k)A(i)A(k)i=1,…,kA(i)<A(k)
Questo algoritmo confronta con tutti gli altri ( n - 1 volte), A ( 2 ) con n - 2 altri, ecc. Quindi il numero totale di confronti è ( n - 1 ) ( n - 2 )A(1)n−1A(2)n−2 . Ma non è il massimo che possiamo fare. Ad esempio, guardandoB(n), non dobbiamo fare paragoni! B(n)=A(n)-1perché sono ipriminnumeri naturali, ed è garantito (indipendentemente dalla permutazione) checi saranno i numeri naturali inferiorin-1. Che dire diB(n-1)? Invece di controllare daA(1)aA(n(n−1)(n−2)2B(n)B(n)=A(n)−1 nn−1B(n−1)A(1) , potremmo semplicemente controllare A ( n ) . Questo è:A(n−2)A(n)
Per , utilizzare l'algoritmo sopra; per
k=nk=1,…,n2usa l'algoritmo inverso: determinaB(k)impostandolo inizialmente suA(n)-1e quindi sottraendo1per ogni voceA(i)peri=k+1,…,nche è minore diA(k).k=n2,…,nB(k)A(n)−11A(i)i = k + 1 , … , nA ( k )
Ciò richiederebbe passaggi, che è ancoraO(n2). Nota anche che nel costruireAdaB, seB(n)=A(n)-1,alloraA(n)=B(n)+1.2 × ( n2- 1 ) ( n2- 2 )2= ( n - 2 ) ( n - 4 )4O ( n2)UNBB ( n ) = A ( n ) - 1A(n)=B(n)+1
Ma ora per più finezza. Se ci viene concesso dello spazio aggiuntivo o l'ordinamento sul posto, possiamo ordinare i numeri mentre li stiamo confrontando. Ad esempio:
∣∣∣∣ASB8904803701407332219166655∣∣∣∣
Invece di controllarli tutti (o controllarli in ordine), potremmo usare la ricerca binaria per determinare ogni . Tuttavia, l'ordinamento richiede ancora tempo O ( n registro n ) .B(k)O(nlogn)