Entonces John Kurlak habló sobre 4 enfoques diferentes que Quick Select tiene
[matemática] O (n) [/ matemática] caso promedio pero [matemática] O (n ^ 2) [/ matemática] peor caso, aquí el algoritmo de mediana de medianas que toma [matemática] O (n) [/ matemática] en peores casos, lo que lo hace mucho mejor que la selección rápida
Algoritmo: Encuentra el kth más pequeño o más grande en una matriz sin clasificar
PD: Debajo de algo está el k-ésimo elemento más grande en la matriz que se puede modificar para el k-ésimo elemento más pequeño en la matriz con pequeños cambios.
- Divida la matriz en n / 5 listas de 5 elementos cada una.
- Encuentre la mediana en cada subconjunto de 5 elementos.
- Encuentre recursivamente la mediana de todas las medianas, llamémosla M
- Particione la matriz en dos sub-matrices La primera sub-matriz contiene los elementos más grandes que M, digamos que esta sub-matriz es a1, mientras que otra sub-matriz contiene los elementos más pequeños que M., llamemos a esta sub-matriz a2.
- Si k <= | a1 |, devuelve la selección (a1, k).
- Si k− 1 = | a1 |, devuelve M.
- Si k> | a1 | + 1, selección de retorno (a2, k −a1 – 1).
Veamos un ejemplo interesante de esto donde tenemos que encontrar la mediana de la matriz sin clasificar en tiempo lineal, esto puede sonar NO a primera vista porque la mediana de la matriz es el elemento medio en la matriz ordenada si la matriz es de longitud impar y media de dos medios elementos si la matriz tiene una longitud par.
- ¿Cómo se soluciona el problema de Little Red-Cap (TAP2013C) en SPOJ?
- ¿Qué puedo hacer para mejorar mi habilidad matemática en estructura de datos y programación general?
- ¿Qué tipo de ordenación usa C ++ para hacer múltiples clasificaciones?
- ¿Es posible implementar algoritmos de aprendizaje automático en lenguaje ensamblador?
- ¿Cómo se copia el contenido de un árbol de búsqueda binario que tiene emparejamientos K, V?
podemos hacerlo utilizando la ordenación rápida / montón que lleva tiempo [math] O (nlogn) [/ math] pero ¿podemos mejorar? Sí, ¿has oído hablar de contar? Lo que lleva tiempo [matemático] O (n) [/ matemático] pero espacio adicional [matemático] O (Máx-Mín + 1) [/ matemático], Máx. Y Mín. Son elementos de la matriz, y si la matriz es ar [] = {10000000 , 200000000}, pérdida de espacio ¿verdad? Pero si piensa en la mediana, que no es más que un elemento medio de la matriz donde k = n / 2 si la matriz tiene una longitud impar, ¿puede ver algo ahora? La mediana no es más que N / 2º elemento más pequeño en la matriz. Genial, así que lo obtuvimos, podemos llamar al algoritmo de la mediana de las medianas hasta k = n / 2 y podemos devolver ar [n / 2] como mediana. A continuación hay un pseudocódigo para lo mismo.
// selecciona la mediana de las medianas en una matriz selección int estática (int a [], int s, int e, int k) { // si la longitud de la partición es menor o igual a 5 // podemos ordenar y encontrar el elemento k de ella // de esta manera podemos encontrar la mediana de n / 5 particiones if (e-s + 1 <= 5) { Arreglos.sort (a, s, e); devuelve s + k-1; } / * si la matriz es más grande, la dividimos en sub-matrices de tamaño 5 no. de particiones = n / 5 = (e + 1) / 5 iterar a través de cada partición y recursivamente calcule la mediana de todos ellos y siga colocando las medianas en el inicio de la matriz * / para (int i = 0; i e) derecha = e; // left + (right-left) / 2 median será 3rd element egar [2] en una matriz basada en índice cero int mediana = selección (a, izquierda, derecha, 2); swap (a [mediana], a [i]); } / * ahora tenemos una matriz a [0] = mediana de la primera partición de tamaño 5 a [1] = mediana de Segunda partición de tamaño 5 y así sucesivamente hasta n / 5 para averiguar la mediana de estos n / 5 medianas necesitamos seleccionar el elemento n / 10 de este conjunto (es decir, en el medio) * / selección de retorno (a, 0, (e + 1) / 5, ((e + 1) / 10)); }
llame a esta selección de función (ar, 0, ar.length-1, k); // k = n / 2 que es mediana
Análisis de algoritmo:
Dividir la matriz por 5 asegura una división de 70-30 en el peor de los casos y al menos la mitad de las medianas son mayores que la mediana de las medianas, por lo tanto, al menos la mitad de los n / 5 bloques tienen al menos 3 elementos y esto da una división de 3n / 10, que
significa que la otra partición es 7n / 10 en el peor de los casos. Eso da complejidad de tiempo es
[matemáticas] T (n) = T (n / 5) + T (7n / 10) + O (n). [/mates]
Más información: Página en indstate.edu
El algoritmo de la mediana de las medianas | Noticias Hacker