Seleccionar eficientemente la mediana y los elementos a su izquierda y derecha

14

Supongamos que tenemos un conjunto de codificadores.S={un1,un2,un3,...,unnorte}norte

Cada codificador tiene una calificación de y el número de medallas de oro , que habían ganado hasta ahora.Ryomiyo

Una empresa de software quiere contratar exactamente tres codificadores para desarrollar una aplicación.

Para contratar a tres codificadores, desarrollaron la siguiente estrategia:

  1. Primero organizan los codificadores en orden ascendente de calificaciones y orden descendente de medallas de oro.
  2. De esta lista organizada, seleccionan los tres codificadores intermedios. Por ejemplo, si la lista organizada es seleccionan codificadores .(un5 5,un2,un3,un1,un4 4)(un2,un3,un1)

Ahora tenemos que ayudar a la empresa escribiendo un programa para esta tarea.

Entrada:

La primera línea contiene , es decir, el número de codificadores.norte

Luego, la segunda línea contiene las clasificaciones del th codificador.Ryoyo

La tercera línea contiene el número de medallas de oro que el codificador empacó .yo

Salida:

Muestre solo una línea que contenga la suma de las medallas de oro obtenidas por los tres codificadores que seleccionará la compañía.

Jack
fuente
3
Entonces, ¿los codificadores mejor calificados siempre ganan menos medallas? Si no, ¿qué orden estás usando para ordenar?
JeffE

Respuestas:

16

Se trata de un problema de seleccionar el -ésimo elemento más pequeño de la lista resuelto por una clase de algoritmos llamada la Selección Algoritmos . Existen algoritmos deterministas de selección de tiempo lineal para que su problema se pueda resolver en tiempo lineal seleccionando los elementos más pequeños º de la lista sin clasificar original.knorte/ /2,norte/ /2-1,norte/ /2+1

Optar
fuente
66
Si lo desea, puede ejecutar el algoritmo de selección una vez para encontrar la mediana, y luego encontrar el mínimo y el máximo en las particiones derecha e izquierda, respectivamente, de una sola vez.
Zach Langley
@Sid @ Zach Langley Hola, ¿puedes proporcionar el Pseudocódigo? I Pasé por la página wiki, pero se siente un poco difícil de entender. Entonces, ¿puedes proporcionar el Pseudocódigo? ¡Muchas gracias!
Jack
@ Jack, ¿estás familiarizado con cómo funciona Quicksort? El algoritmo de selección aleatoria es esencialmente el mismo, excepto que solo se repite en un lado de cada pivote.
Zach Langley
66
@Jack: El artículo de Wikipedia sobre algoritmos de selección (vinculado en la respuesta de Sid) contiene pseudocódigo. Google también funciona.
JeffE
@Sid :: Leí el algoritmo wiki (Algoritmo de selección general basado en particiones). ¿Tenemos que llamar a la función de selección tres veces con k = n / 2, k = n / 2-1, k / 2. También lo que será el valor de left, right mientras se llama a la función select.También en la función de partición, cuál será el valor del índice de partición.
Jack