Método para encontrar el k-ésimo valor más pequeño
En informática , un algoritmo de selección es un algoritmo para encontrar el enésimo valor más pequeño en una colección de valores ordenados, como números. El valor que encuentra se llama estadístico de décimo orden . La selección incluye como casos especiales los problemas de encontrar el elemento mínimo , mediano y máximo en la colección. Los algoritmos de selección incluyen la selección rápida y el algoritmo de mediana de medianas . Cuando se aplican a una colección de valores, estos algoritmos toman tiempo lineal , expresado mediante notación O grande . Para datos que ya están estructurados, es posible que sean posibles algoritmos más rápidos; Como caso extremo, la selección en una matriz ya ordenada lleva tiempo .
Planteamiento del problema
Un algoritmo para el problema de selección toma como entrada una colección de valores y un número . Genera el enésimo más pequeño de estos valores o, en algunas versiones del problema, una colección de los valores más pequeños. Para que esto esté bien definido, debería ser posible ordenar los valores de menor a mayor; por ejemplo, pueden ser números enteros , números de punto flotante o algún otro tipo de objeto con una clave numérica. Sin embargo, no se supone que ya hayan sido ordenados. A menudo, los algoritmos de selección están restringidos a un modelo de cálculo basado en comparación , como en los algoritmos de clasificación por comparación , donde el algoritmo tiene acceso a una operación de comparación que puede determinar el orden relativo de dos valores cualesquiera, pero no puede realizar ningún otro tipo de aritmética . operaciones sobre estos valores. [1]
Para simplificar el problema, algunos trabajos sobre este problema suponen que todos los valores son distintos entre sí , [2] o que se ha utilizado algún método de desempate consistente para asignar un orden a pares de elementos con el mismo valor entre sí. . Otra variación en la definición del problema tiene que ver con la numeración de los valores ordenados: es el valor más pequeño que se obtiene estableciendo , como en la numeración de matrices basada en cero , o se obtiene configurando , siguiendo las convenciones habituales en inglés para el segundo más pequeño. -¿el más pequeño, etc.? Este artículo sigue las convenciones utilizadas por Cormen et al., según las cuales todos los valores son distintos y el valor mínimo se obtiene de . [2]
Con estas convenciones, el valor máximo, entre una colección de valores, se obtiene estableciendo . Cuando es un número impar , la mediana de la colección se obtiene estableciendo . Cuando es par, hay dos opciones para la mediana, que se obtienen redondeando esta elección hacia abajo o hacia arriba, respectivamente: la mediana inferior con y la mediana superior con . [2]
Algoritmos
Ordenar y seleccionar en montón
Como algoritmo de referencia, la selección del enésimo valor más pequeño de una colección de valores se puede realizar mediante los dos pasos siguientes:
Si la salida del algoritmo de clasificación es una matriz , recupere su enésimo elemento; de lo contrario, escanee la secuencia ordenada para encontrar el enésimo elemento.
El tiempo de este método está dominado por el paso de clasificación, que requiere tiempo mediante una clasificación por comparación . [2] [3] Incluso cuando se pueden usar algoritmos de clasificación de enteros , estos generalmente son más lentos que el tiempo lineal que se puede lograr usando algoritmos de selección especializados. Sin embargo, la simplicidad de este enfoque lo hace atractivo, especialmente cuando se proporciona una rutina de clasificación altamente optimizada como parte de una biblioteca en tiempo de ejecución, pero no un algoritmo de selección. Para entradas de tamaño moderado, la clasificación puede ser más rápida que los algoritmos de selección no aleatoria, debido a los factores constantes más pequeños en su tiempo de ejecución. [4] Este método también produce una versión ordenada de la colección, que puede ser útil para otros cálculos posteriores y, en particular, para la selección con otras opciones de . [3]
Para un algoritmo de clasificación que genera un elemento a la vez, como la clasificación por selección , el escaneo se puede realizar en conjunto con la clasificación, y la clasificación se puede finalizar una vez que se haya encontrado el ésimo elemento. Un posible diseño de un grupo de consolación en un torneo de eliminación simple , en el que los equipos que perdieron ante el eventual ganador juegan otro minitorneo para determinar el segundo lugar, puede verse como un ejemplo de este método. [5] La aplicación de esta optimización a heapsort produce el algoritmo heapselect , que puede seleccionar el enésimo valor más pequeño en el tiempo . [6] Esto es rápido cuando es pequeño en relación con , pero degenera para valores más grandes de , como la elección utilizada para encontrar la mediana.
Pivotando
Muchos métodos de selección se basan en elegir un elemento "pivote" especial de la entrada y usar comparaciones con este elemento para dividir los valores de entrada restantes en dos subconjuntos: el conjunto de elementos menores que el pivote y el conjunto de elementos mayores que el pivote. Luego, el algoritmo puede determinar dónde se puede encontrar el valor más pequeño, basándose en una comparación con los tamaños de estos conjuntos. En particular, si , el valor más pequeño está en , y se puede encontrar de forma recursiva aplicando el mismo algoritmo de selección a . Si es , entonces el valor más pequeño es el pivote y se puede devolver inmediatamente. En el caso restante, el valor más pequeño está en , y más concretamente es el elemento en posición de . Se puede encontrar aplicando un algoritmo de selección de forma recursiva, buscando el valor en esta posición en . [7]
Al igual que con el algoritmo de clasificación rápida basado en pivote relacionado , la partición de la entrada en y se puede realizar creando nuevas colecciones para estos conjuntos, o mediante un método que particione una lista o un tipo de datos de matriz determinados en el lugar. Los detalles varían dependiendo de cómo se representa la colección de entrada. [8] El tiempo para comparar el pivote con todos los demás valores es . [7] Sin embargo, los métodos de pivote difieren en cómo eligen el pivote, lo que afecta el tamaño de los subproblemas en cada llamada recursiva. La eficacia de estos métodos depende en gran medida de la elección del pivote. Si el pivote se elige mal, el tiempo de ejecución de este método puede ser tan lento como . [4]
Si el pivote estuviera exactamente en la mediana de la entrada, entonces cada llamada recursiva tendría como máximo la mitad de valores que la llamada anterior, y los tiempos totales se sumarían en una serie geométrica a . Sin embargo, encontrar la mediana es en sí mismo un problema de selección de toda la entrada original. Intentar encontrarlo mediante una llamada recursiva a un algoritmo de selección conduciría a una recursión infinita, porque el tamaño del problema no disminuiría en cada llamada. [7]
Quickselect elige el pivote de manera uniforme y aleatoria a partir de los valores de entrada. Puede describirse como un algoritmo de poda y búsqueda , [9] una variante de Quicksort , con la misma estrategia de pivote, pero donde Quicksort realiza dos llamadas recursivas para ordenar las dos subcolecciones y Quickselect solo realiza una de estas dos llamadas. Su hora prevista es . [2] [7] [9] Para cualquier constante , la probabilidad de que su número de comparaciones exceda es superexponencialmente pequeña en . [10]
El algoritmo Floyd-Rivest , una variación de la selección rápida, elige un pivote muestreando aleatoriamente un subconjunto de valores de datos, para algún tamaño de muestra , y luego seleccionando recursivamente dos elementos algo por encima y por debajo de la posición de la muestra para usarlos como pivotes. Con esta elección, es probable que quede intercalado entre los dos pivotes, de modo que después de pivotar solo quede una pequeña cantidad de valores de datos entre los pivotes para una llamada recursiva. Este método puede lograr un número esperado de comparaciones, es decir . [11] En su trabajo original, Floyd y Rivest afirmaron que el término podría hacerse tan pequeño como mediante un esquema de muestreo recursivo, pero se ha cuestionado la exactitud de su análisis. [12] [13] En cambio, un análisis más riguroso ha demostrado que una versión de su algoritmo logra este término. [14] Aunque el análisis habitual tanto de la selección rápida como del algoritmo Floyd-Rivest supone el uso de un generador de números aleatorios verdadero , se ha demostrado una versión del algoritmo Floyd-Rivest que utiliza un generador de números pseudoaleatorios sembrado solo logarítmicamente con muchos bits aleatorios verdaderos. ejecutarse en tiempo lineal con alta probabilidad. [15]
El método de mediana de medianas divide la entrada en conjuntos de cinco elementos y utiliza algún otro método no recursivo para encontrar la mediana de cada uno de estos conjuntos en tiempo constante por conjunto. Luego se llama a sí mismo de forma recursiva para encontrar la mediana de estas medianas. Usar la mediana resultante de medianas como pivote produce una partición con . Por lo tanto, un problema sobre elementos se reduce a dos problemas recursivos sobre elementos (para encontrar el pivote) y como máximo elementos (después de usar el pivote). El tamaño total de estos dos subproblemas recursivos es como máximo , lo que permite analizar el tiempo total como una serie geométrica que se suma a . A diferencia de la selección rápida, este algoritmo es determinista, no aleatorio. [2] [4] [5] Fue el primer algoritmo de selección determinista de tiempo lineal conocido, [5] y se enseña comúnmente en clases de algoritmos de pregrado como un ejemplo de divide y vencerás que no se divide en dos subproblemas iguales. [2] [4] [9] [16] Sin embargo, los altos factores constantes en su límite de tiempo lo hacen más lento que la selección rápida en la práctica, [3] [9] e incluso más lento que la clasificación para entradas de tamaño moderado. [4]
Los algoritmos de selección deterministas con el menor número de comparaciones conocido, para valores de que están lejos de o , se basan en el concepto de fábricas , introducido en 1976 por Arnold Schönhage , Mike Paterson y Nick Pippenger . [18] Estos son métodos que construyen órdenes parciales de ciertos tipos específicos, en pequeños subconjuntos de valores de entrada, mediante el uso de comparaciones para combinar órdenes parciales más pequeñas. Como ejemplo muy simple, un tipo de fábrica puede tomar como entrada una secuencia de pedidos parciales de un solo elemento, comparar pares de elementos de estos pedidos y producir como salida una secuencia de conjuntos totalmente ordenados de dos elementos. Los elementos utilizados como insumos para esta fábrica podrían ser valores de insumos que aún no se han comparado con nada o valores "de desecho" producidos por otras fábricas. El objetivo de un algoritmo basado en fábricas es combinar diferentes fábricas, con las salidas de algunas fábricas yendo a las entradas de otras, para eventualmente obtener un orden parcial en el que un elemento (el enésimo más pequeño ) es más grande que algún otro. elementos y más pequeño que otros. Un diseño cuidadoso de estas fábricas conduce a un algoritmo que, cuando se aplica a la búsqueda de la mediana, utiliza en la mayoría de las comparaciones. Para otros valores de , el número de comparaciones es menor. [19]
Algoritmos paralelos
Los algoritmos paralelos de selección se han estudiado desde 1975, cuando Leslie Valiant introdujo el modelo de árbol de comparación paralelo para analizar estos algoritmos, y demostró que en este modelo la selección utilizando un número lineal de comparaciones requiere pasos paralelos, incluso para seleccionar el mínimo o el máximo. [20] Posteriormente, los investigadores encontraron algoritmos paralelos para la selección en pasos, que coincidían con este límite. [21] [22] En un modelo de árbol de comparación paralelo aleatorio es posible realizar la selección en un número limitado de pasos y un número lineal de comparaciones. [23] En el modelo de computación RAM paralelo más realista , con acceso exclusivo a la memoria de lectura y escritura exclusiva, la selección se puede realizar en el tiempo con los procesadores, lo cual es óptimo tanto en el tiempo como en el número de procesadores. [24] Con el acceso concurrente a la memoria, en general es posible un tiempo paralelo ligeramente más rápido, [25] y el término en el límite de tiempo puede reemplazarse por . [26]
Estructuras de datos sublineales
Cuando los datos ya están organizados en una estructura de datos , es posible realizar una selección en un período de tiempo sublineal en el número de valores. Como un caso simple de esto, para los datos ya ordenados en una matriz, la selección del elemento ésimo se puede realizar mediante una única búsqueda en la matriz, en tiempo constante. [27] Para valores organizados en una matriz bidimensional de tamaño , con filas y columnas ordenadas, la selección se puede realizar en el tiempo , o más rápido cuando es pequeño en relación con las dimensiones de la matriz. [27] [28] Para una colección de matrices ordenadas unidimensionales, con elementos menores que el elemento seleccionado en la enésima matriz, el tiempo es . [28]
La selección de datos en un montón binario lleva tiempo . Esto es independiente del tamaño del montón y más rápido que el límite de tiempo que se obtendría con la búsqueda "mejor primero" . [28] [29] Este mismo método se puede aplicar de manera más general a datos organizados como cualquier tipo de árbol ordenado en montón (un árbol en el que cada nodo almacena un valor en el que el padre de cada nodo no raíz tiene un valor menor que su hijo). Este método de realizar la selección en un montón se ha aplicado a problemas de enumerar múltiples soluciones a problemas de optimización combinatoria, como encontrar los k caminos más cortos en un gráfico ponderado, definiendo un espacio de estados de soluciones en forma de un montón definido implícitamente. árbol ordenado, y luego aplicar este algoritmo de selección a este árbol. [30] En la otra dirección, se han utilizado algoritmos de selección de tiempo lineal como subrutina en una estructura de datos de cola de prioridad relacionada con el montón, mejorando el tiempo para extraer su ésimo elemento de a ; aquí está el logaritmo iterado . [31]
Para una colección de valores de datos que se someten a inserciones y eliminaciones dinámicas, el árbol de estadísticas de orden aumenta una estructura de árbol de búsqueda binaria autoequilibrada con una cantidad constante de información adicional por nodo del árbol, lo que permite inserciones, eliminaciones y consultas de selección que solicitan el elemento ésimo . en el conjunto actual para que todos se realicen a tiempo por operación. [2] Yendo más allá del modelo de comparación de cálculo, son posibles tiempos más rápidos por operación para valores que son números enteros pequeños, en los que se permiten operaciones aritméticas binarias. [32] No es posible que un algoritmo de transmisión con memoria sublineal en ambos y resuelva consultas de selección exactamente para datos dinámicos, pero el esquema de conteo mínimo se puede usar para resolver consultas de selección aproximadamente, encontrando un valor cuya posición en el orden de los elementos (si se les agregara) estaría dentro de pasos de , para un boceto cuyo tamaño está dentro de factores logarítmicos de . [33]
límites inferiores
El tiempo de ejecución de los algoritmos de selección descritos anteriormente es necesario, porque un algoritmo de selección que puede manejar entradas en un orden arbitrario debe tomar ese mismo tiempo para examinar todas sus entradas. Si alguno de sus valores de entrada no se compara, ese valor podría ser el que debería haberse seleccionado y se puede hacer que el algoritmo produzca una respuesta incorrecta. [28] Más allá de este simple argumento, se ha realizado una cantidad significativa de investigaciones sobre el número exacto de comparaciones necesarias para la selección, tanto en los casos aleatorios como en los deterministas.
Seleccionar el mínimo de valores requiere comparaciones, porque se debe haber determinado que los valores que no se seleccionan no son mínimos, al ser los más grandes en alguna comparación, y no hay dos de estos valores que puedan ser los más grandes en la misma comparación. El mismo argumento se aplica simétricamente a la selección del máximo. [14]
El siguiente caso más simple es seleccionar el segundo más pequeño. Después de varios intentos incorrectos, el primer límite inferior estricto de este caso fue publicado en 1964 por el matemático soviético Sergey Kislitsyn . Se puede demostrar observando que seleccionar el segundo valor más pequeño también requiere distinguir el valor más pequeño del resto, y considerando el número de comparaciones que involucran el valor más pequeño que realiza un algoritmo para este problema. Cada uno de los elementos que se compararon con el valor más pequeño es candidato para el segundo más pequeño, y de estos valores se debe encontrar mayor que otro valor en una segunda comparación para descartarlos como el segundo más pequeño. Si los valores son mayores en al menos una comparación y los valores son mayores en al menos dos comparaciones, hay un total de al menos comparaciones. Un argumento adversario , en el que el resultado de cada comparación se elige para maximizar (sujeto a la coherencia con al menos un orden posible) en lugar de por los valores numéricos de los elementos dados, muestra que es posible forzar a que sea al menos . Por lo tanto, el número de comparaciones necesarias en el peor de los casos para seleccionar el segundo más pequeño es , el mismo número que se obtendría si se celebrara un torneo de eliminación simple con un torneo de segunda vuelta entre los valores que perdieron ante el valor más pequeño. Sin embargo, el número esperado de comparaciones de un algoritmo de selección aleatoria puede ser mejor que este límite; por ejemplo, seleccionar el segundo elemento más pequeño de seis elementos requiere siete comparaciones en el peor de los casos, pero puede realizarse mediante un algoritmo aleatorio con un número esperado de 6,5 comparaciones. [14]
De manera más general, seleccionar el elemento número uno requiere al menos comparaciones; en el caso promedio, hacer coincidir el número de comparaciones del algoritmo Floyd-Rivest hasta su término. El argumento se hace directamente a favor de los algoritmos deterministas, con un número de comparaciones que se promedia sobre todas las permutaciones posibles de los valores de entrada. [1] Según el principio de Yao , también se aplica al número esperado de comparaciones para un algoritmo aleatorio en su entrada del peor de los casos. [34]
Para algoritmos deterministas, se ha demostrado que seleccionar el elemento ésimo requiere comparaciones, donde
Knuth proporciona el siguiente triángulo de números que resumen pares de y para los cuales se conoce el número exacto de comparaciones necesarias para un algoritmo de selección óptimo. La enésima fila del triángulo (comenzando en la fila superior) proporciona el número de comparaciones para entradas de valores, y el enésimo número dentro de cada fila proporciona el número de comparaciones necesarias para seleccionar el enésimo valor más pequeño de una entrada de ese tamaño. Las filas son simétricas porque seleccionar la enésima más pequeña requiere exactamente el mismo número de comparaciones, en el peor de los casos, que seleccionar la enésima más grande. [14]
0
1 1
2 3 2
3 4 4 3
4 6 6 6 4
5 7 8 8 7 5
6 8 10 10 10 8 6
7 9 11 12 12 11 9 7
8 11 12 14 14 14 12 11 8
9 12 14 15 16 16 15 14 12 9
La mayoría, pero no todas, las entradas en la mitad izquierda de cada fila se pueden encontrar usando la fórmula
Muy pocos idiomas tienen soporte incorporado para la selección general, aunque muchos brindan funciones para encontrar el elemento más pequeño o más grande de una lista. Una excepción notable es la Biblioteca de plantillas estándar para C++ , que proporciona un nth_elementmétodo basado en plantilla con una garantía del tiempo lineal esperado. [3]
La biblioteca estándar de Pythonheapq.nsmallest (desde 2.4) incluye subrutinas heapq.nlargestpara devolver los elementos más pequeños o más grandes de una colección, en orden. Diferentes versiones de Python han utilizado diferentes algoritmos para estas subrutinas. A partir de la versión 3.13 de Python, la implementación mantiene un montón binario, limitado a contener elementos e inicializado con los primeros elementos de la colección. Luego, cada elemento posterior de la colección puede reemplazar el elemento más grande o más pequeño en el montón (respectivamente para y ) si es más pequeño o más grande que este elemento. El peor momento para esta implementación es peor que el que se lograría con heapselect. Sin embargo, para secuencias de entrada aleatorias, es probable que haya pocas actualizaciones del montón y la mayoría de los elementos de entrada se procesan con una sola comparación. [39]heapq.nsmallestheapq.nlargest
Desde 2017, Matlab ha incluido funciones maxk()y mink()que devuelven los valores máximos (mínimos) en un vector, así como sus índices. La documentación de Matlab no especifica qué algoritmo utilizan estas funciones ni cuál es su tiempo de ejecución. [40]
Historia
Quickselect fue presentado sin análisis por Tony Hoare en 1965, [41] y analizado por primera vez en un informe técnico de 1971 por Donald Knuth . [11] El primer algoritmo de selección determinista de tiempo lineal conocido es el método de mediana de medianas , publicado en 1973 por Manuel Blum , Robert W. Floyd , Vaughan Pratt , Ron Rivest y Robert Tarjan . [5] Rastrean la formulación del problema de selección hasta el trabajo de Charles L. Dodgson (más conocido como Lewis Carroll ), quien en 1883 señaló que el diseño habitual de los torneos deportivos de eliminación simple no garantiza que gane el segundo mejor jugador. segundo lugar, [5] [42] y al trabajo de Hugo Steinhaus alrededor de 1930, quien siguió esta misma línea de pensamiento al pedir un diseño de torneo que pueda ofrecer esta garantía, con un número mínimo de juegos jugados (es decir, comparaciones ). [5]
Filtro de mediana , aplicación de algoritmos de búsqueda de mediana en el procesamiento de imágenes.
Referencias
^ ab Cunto, Walter; Munro, J. Ian (1989). "Selección de casos promedio". Revista de la ACM . 36 (2): 270–279. doi : 10.1145/62044.62047 . SEÑOR 1072421. S2CID 10947879.
^ abcd Skiena, Steven S. (2020). "17.3: Mediana y selección". El manual de diseño de algoritmos . Textos de Informática (Tercera ed.). Saltador. págs. 514–516. doi :10.1007/978-3-030-54256-6. ISBN978-3-030-54255-9. SEÑOR 4241430. S2CID 22382667.
^ abcde Erickson, Jeff (junio de 2019). "1.8: Selección de tiempo lineal". Algoritmos. págs. 35–39.
^ Brodal, Gerth Stølting (2013). "Una encuesta sobre colas prioritarias". En Brodnik, Andrej; López-Ortiz, Alejandro; Raman, Venkatesh; Viola, Alfredo (eds.). "Estructuras, flujos y algoritmos de datos eficientes en el espacio: artículos en honor a J. Ian Munro con motivo de su 66 cumpleaños ". Apuntes de conferencias sobre informática. vol. 8066. Saltador. págs. 150-163. doi :10.1007/978-3-642-40273-9_11.
^ abcd Kleinberg, Jon ; Tardos, Éva (2006). "13.5 Divide y vencerás aleatoriamente: búsqueda de medianas y clasificación rápida". Diseño de algoritmos . Addison-Wesley. págs. 727–734. ISBN9780321295354.
^ Por ejemplo, Cormen et al. use una partición de matriz in situ, mientras que Kleinberg y Tardos describen la entrada como un conjunto y usan un método que la divide en dos nuevos conjuntos.
^ Devroye, Luc (1984). "Límites exponenciales para el tiempo de ejecución de un algoritmo de selección" (PDF) . Revista de Ciencias de la Computación y de Sistemas . 29 (1): 1–7. doi :10.1016/0022-0000(84)90009-6. SEÑOR 0761047. Devroye, Luc (2001). "Sobre el peor momento probabilístico de 'hallazgo'" (PDF) . Algorítmica . 31 (3): 291–303. doi :10.1007/s00453-001-0046-2. SEÑOR 1855252. S2CID 674040.
^ ab Floyd, Robert W .; Rivest, Ronald L. (marzo de 1975). "Plazos de tiempo previstos para la selección". Comunicaciones de la ACM . 18 (3): 165-172. doi : 10.1145/360680.360691 . S2CID 3064709.Véase también "Algoritmo 489: el algoritmo SELECT, para encontrar el enésimo elemento más pequeño ", pág. 173, doi :10.1145/360680.360694.
^ Brown, Theodore (septiembre de 1976). "Observación sobre el algoritmo 489". Transacciones ACM sobre software matemático . 2 (3): 301–304. doi :10.1145/355694.355704. S2CID 13985011.
^ Karloff, Howard J.; Raghavan, Prabhakar (1993). "Algoritmos aleatorios y números pseudoaleatorios". Revista de la ACM . 40 (3): 454–476. doi : 10.1145/174130.174132 . SEÑOR 1370358. S2CID 17956460.
^ Gurwitz, Chaya (1992). "Sobre la enseñanza de algoritmos de búsqueda de medianas". Transacciones IEEE sobre educación . 35 (3): 230–232. Código Bib : 1992ITEdu..35..230G. doi :10.1109/13.144650.
^ Musser, David R. (agosto de 1997). "Algoritmos introspectivos de clasificación y selección". Software: práctica y experiencia . Wiley. 27 (8): 983–993. doi :10.1002/(sici)1097-024x(199708)27:8<983::aid-spe117>3.0.co;2-#.
^ Reischuk, Rüdiger (1985). "Algoritmos probabilísticos paralelos para ordenación y selección". Revista SIAM de Computación . 14 (2): 396–409. doi :10.1137/0214030. SEÑOR 0784745.
^ Chaudhuri, Shiva; Hagerup, Torben; Raman, Rajeev (1993). "Selección paralela determinista aproximada y exacta". En Borzyszkowski, Andrzej M.; Sokolowski, Stefan (eds.). Fundamentos matemáticos de la informática 1993, 18.º Simposio internacional, MFCS'93, Gdansk, Polonia, 30 de agosto - 3 de septiembre de 1993, Actas . Apuntes de conferencias sobre informática. vol. 711. Saltador. págs. 352–361. doi :10.1007/3-540-57182-5_27. hdl : 11858/00-001M-0000-0014-B748-C .
^ Dietz, Paul F.; Raman, Rajeev (1999). "Selección de rango pequeño en paralelo, con aplicaciones a la construcción de pilas". Revista de algoritmos . 30 (1): 33–51. doi :10.1006/jagm.1998.0971. SEÑOR 1661179.
^ abcd Kaplan, Haim; Kozma, László; Zamir, o; Zwick, Uri (2019). "Selección de montones, matrices ordenadas por filas y uso de montones suaves". En Fineman, Jeremy T.; Mitzenmacher, Michael (eds.). Segundo Simposio sobre simplicidad en algoritmos, SOSA 2019, 8 al 9 de enero de 2019, San Diego, CA, EE. UU . OASics. vol. 69. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. págs. 5:1–5:21. arXiv : 1802.07041 . doi :10.4230/OASIcs.SOSA.2019.5.
^ Frederickson, Greg N. (1993). "Un algoritmo óptimo para la selección en un montón mínimo". Información y Computación . 104 (2): 197–214. doi : 10.1006/inco.1993.1030 . SEÑOR 1221889.
^ Babenko, Máxima; Kolesnichenko, Ignat; Smirnov, Iván (2019). "Montón en cascada: hacia extracciones en el tiempo óptimo". Teoría de los Sistemas Computacionales . 63 (4): 637–646. doi :10.1007/s00224-018-9866-1. SEÑOR 3942251. S2CID 253740380.
^ Pătraşcu, Mihai ; Thorup, Mikkel (2014). "Conjuntos de enteros dinámicos con clasificación, selección y búsqueda de predecesores óptimos". 55.º Simposio anual del IEEE sobre fundamentos de la informática, FOCS 2014, Filadelfia, PA, EE. UU., 18 al 21 de octubre de 2014 . Sociedad de Computación IEEE. págs. 166-175. arXiv : 1408.3045 . doi :10.1109/FOCS.2014.26.
^ Cormode, Graham; Muthukrishnan, S. (2005). "Un resumen mejorado del flujo de datos: el boceto del conteo mínimo y sus aplicaciones". Revista de algoritmos . 55 (1): 58–75. doi :10.1016/j.jalgor.2003.12.001. SEÑOR 2132028.
^ Doblado, Samuel W.; Juan, Juan W. (1985). "Encontrar la mediana requiere comparaciones". En Sedgewick, Robert (ed.). Actas del 17º Simposio Anual de la ACM sobre Teoría de la Computación, 6 al 8 de mayo de 1985, Providence, Rhode Island, EE. UU . Asociación para Maquinaria de Computación. págs. 213-216. doi : 10.1145/22145.22169 .
^ Hadián, Abdollah; Sobel, Milton (mayo de 1969). Seleccionar el -ésimo más grande mediante comparaciones binarias sin errores (Informe). Informes Técnicos de la Escuela de Estadística. vol. 121. Universidad de Minnesota. hdl :11299/199105.
^ Gasarch, William ; Kelly, Wayne; Pugh, William (julio de 1996). "Encontrar el décimo mayor para el pequeño ". Noticias ACM SIGACT . 27 (2): 88–96. doi :10.1145/235767.235772. S2CID 3133332.
^ "código fuente del paquete heapq". Biblioteca de Python . Consultado el 6 de agosto de 2023 .; consulte también la comparación vinculada del rendimiento del algoritmo en los datos del mejor de los casos.
^ "visón: encuentre k elementos más pequeños de la matriz". Documentación de Matlab R2023a . Trabajos de matemáticas . Consultado el 30 de marzo de 2023 .
^ Dodgson, Charles L. (1883). Torneos de tenis sobre césped: el verdadero método de asignación de premios con una prueba de la falacia del método actual . Londres: Macmillan and Co.Véase también Wilson, Robin; Moktefi, Amirouche, eds. (2019). "Torneos de tenis sobre hierba". El mundo matemático de Charles L. Dodgson (Lewis Carroll) . Prensa de la Universidad de Oxford. pag. 129.ISBN 9780192549013.