El algoritmo ingenuo para determinar de :ABA
Para , determine el valor de comparando cada con para
y contando los que satisfacen .B ( k ) A ( i ) A ( k ) i = 1 , … , k A ( i ) < A ( k )k=1,…,nB(k)A(i)A(k)i=1,…,kA(i)<A(k)
Este algoritmo compara con todos los demás ( veces), con otros, etc., por lo que el número total de comparaciones es . Pero eso no es lo mejor que podemos hacer. Por ejemplo, mirando , ¡no tenemos que hacer ninguna comparación! porque son los primeros números naturales, y está garantizado (independientemente de la permutación) que los números naturales más bajos estarán allí. ¿Qué pasa con ? En lugar de verificar a , podríamos simplemente verificar . Es decir:A(1)n−1A(2)n−2(n−1)(n−2)2B(n)B(n)=A(n)−1 nn−1B(n−1)A(1)A(n−2)A(n)
Para , use el algoritmo anterior; para
use el algoritmo inverso: determine configurándolo inicialmente en y luego restando para cada entrada para que es menor que .k=1,…,n2k=n2,…,nB(k)A(n)−11A(i)i=k+1,…,nA(k)
Esto llevaría pasos, que sigue siendo . Tenga en cuenta también que al construir partir de , si entonces .2×(n2−1)(n2−2)2=(n−2)(n−4)4O(n2)ABB(n)=A(n)−1A(n)=B(n)+1
Pero ahora por más delicadeza. Si se nos permite espacio adicional u ordenar in situ, podemos ordenar los números a medida que los comparamos. Por ejemplo:
∣∣∣∣ASB8904803701407332219166655∣∣∣∣
En lugar de verificarlos todos (o verificarlos en orden), podríamos usar la búsqueda binaria para determinar cada . Sin embargo, la clasificación todavía lleva tiempo .B(k)O(nlogn)