¿Cuál es el algoritmo más eficiente para encontrar el késimo elemento más pequeño en una matriz que tiene n elementos desordenados?

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.

  1. Divida la matriz en n / 5 listas de 5 elementos cada una.
  2. Encuentre la mediana en cada subconjunto de 5 elementos.
  3. Encuentre recursivamente la mediana de todas las medianas, llamémosla M
  4. 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.
  5. Si k <= | a1 |, devuelve la selección (a1, k).
  6. Si k− 1 = | a1 |, devuelve M.
  7. 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.

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

Lo que está buscando se llama estadística de orden [matemática] k [/ matemática].

Hay algunos algoritmos para resolver esto en tiempo lineal (tanto determinista como no determinista). Esos algoritmos son:

  • Selección rápida
  • Mediana de medianas (también conocida como BFPRT)
  • Introselect
  • Algoritmo sin nombre usando montones suaves

Selección rápida
Quickselect es un algoritmo aleatorio que resuelve el problema en el tiempo esperado [matemático] O (n) [/ matemático]. Quickselect es una adaptación del algoritmo de clasificación rápida.

Más información: http://en.wikipedia.org/wiki/Qui

Mediana de medianas (BFPRT)
El algoritmo de mediana de medianas resuelve el problema de manera determinista en [math] \ Theta (n) [/ math] time. Sin embargo, el valor constante para el algoritmo de mediana de medianas es bastante alto.

Más información: http://en.wikipedia.org/wiki/Med

Introselect
El algoritmo de introselección comienza usando la selección rápida, pero tan pronto como se desvía de las operaciones O (n), por defecto usa el algoritmo de mediana de medianas, asegurando el peor tiempo de ejecución de [matemáticas] \ Theta (n )[/mates].

Más información: http://en.wikipedia.org/wiki/Int

Algoritmo sin nombre usando montones suaves
Este algoritmo de selección implica insertar y eliminar elementos de un montón dinámico y se ejecuta de manera determinista en tiempo [matemático] \ Theta (n) [/ matemático].

Más información: http://en.wikipedia.org/wiki/Sof

—————————————–

Para referencia:
http://en.wikipedia.org/wiki/Sel
estadísticas de orden k

¡Hola!

Este programa está en java para Determinar k elemento más pequeño en una matriz sin clasificar .

  import java.util.Scanner;

 clase pública KthSmallestElement {

	
 public static void main (String [] args) {
		 Scanner sc = nuevo escáner (System.in);
		 System.out.print ("Ingrese tamaño:");
		 int n = sc.nextInt ();
		
		 int a [] = nuevo int [n];
		 para (int i = 0; i  = k)
			 {
				 mientras que (a [i]  x)
					 j--;
				 int t = a [i];
				 a [i] = a [j];
				 a [j] = t;
				 i ++;
				 j--;
			 }
			 si (j  k)
				 u = j;
		 }
		
	
	 System.out.println ("kth Elemento más pequeño:" + a [k]);
	 sc.close ();
	 }

 }

Hay dos formas de hacerlo, dependiendo de la disponibilidad de memoria, puede elegir una.
Primero es usar la ordenación rápida donde, según la posición de pivote después de cada iteración, sabemos cuántos elementos son más pequeños que el pivote y son mayores que él. Según la posición del pivote, buscamos a la izquierda o derecha del pivote el k-ésimo elemento más pequeño. Este método funciona cuando podemos traer todos los elementos en la memoria a la vez.
Encuentra el elemento Kth más pequeño en la matriz: aplicación de ordenación rápida

El segundo método es usar montones. Cree un montón máximo de elementos K y luego verifique cada elemento, si es mayor que la raíz del montón, saque la raíz y agregue un nuevo elemento al montón. Una vez que hayamos terminado con todos los elementos, nos quedaremos con k elementos más pequeños.
Montones: Encuentra el elemento K más pequeño de una matriz dada

Construir un montón mínimo = Θ (n)
Eliminar elementos superiores (k-1) veces del montón = O ((k-1) log n)
Entonces, el tiempo total = Θ (n) + O ((k-1) log n) = O (n + k.logn) = O (n)

Hay muchas soluciones O (n log (n)), pero a veces si los elementos de la matriz son distintos, resolver este problema en O (max (arr [i]) – min (arr [i])) será lo suficientemente rápido .

Definirá una matriz booleana llamada encontrado con un tamaño igual a max (arr [i]) – min (arr [i]) + 1 y con valores iniciales de false y tendrá una variable llamada offset = -min (arr [ i]), luego realizará un bucle en los elementos de matriz dados y para cada elemento x establecerá encontrado [x + offset] = verdadero. Entonces tendrá otro ciclo para devolver el valor Y – desplazamiento donde Y es K-ésimo encontrado [i] como verdadero.

Encuentra Kth más pequeño con K = N / 2.
Aplique la lógica de partición del algoritmo de clasificación rápida para resolver este problema.
Seleccione un pivote y colóquelo en el lugar correcto en el índice J usando la lógica de partición.
Si J = K devuelve el elemento Jth.
Si K De lo contrario, resuelva el segundo subproblema de forma recursiva.

Cree un montón con todos los números y elimine la mitad de los números del montón. El siguiente número como raíz en el árbol será la mediana. (si el número de números es impar, entonces hay una mediana, de lo contrario dos medianas, lo que supongo que debería entenderse).

Usar el algoritmo de selección #Median_selection_as_pivot_strategy