Este es un caso especial de un algoritmo de selección que se puede encontrar el -ésimo elemento más pequeño de una matriz con k es la media del tamaño de la matriz. Hay una implementación que es lineal en el peor de los casos.kk
Algoritmo de selección genérico
En primer lugar vamos a ver un algoritmo find-kthque encuentra el -ésimo elemento más pequeño de una matriz:k
find-kth(A, k)
pivot = random element of A
(L, R) = split(A, pivot)
if k = |L|+1, return pivot
if k ≤ |L| , return find-kth(L, k)
if k > |L|+1, return find-kth(R, k-(|L|+1))
La función split(A, pivot)devuelve L,Rtal que todos los elementos en Rson mayores que pivoty Ltodos los demás (menos una aparición de pivot). Entonces todo se hace de forma recursiva.
Esto es en promedio pero O ( n 2 ) en el peor de los casos.O ( n )O ( n2)
Un mejor pivote es la mediana de todas las medianas de subconjuntos Ade tamaño 5, al llamar al procedimiento en el conjunto de estas medianas.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
Esto garantiza en todos los casos. No es tan obvio. Estas diapositivas de PowerPoint son útiles tanto para explicar el algoritmo como para la complejidad.O ( n )
Tenga en cuenta que la mayoría de las veces el uso de un pivote aleatorio es más rápido.