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-kth
que 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,R
tal que todos los elementos en R
son mayores que pivot
y L
todos 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 A
de 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.