Ah, mi cerebro acaba de ponerse en marcha, tengo una sugerencia sensata ahora. Probablemente demasiado tarde si hubiera sido una entrevista, pero no importa:
La máquina 1 se denominará "máquina de control" y, por el bien del argumento, comienza con todos los datos y los envía en parcelas iguales a las otras 99 máquinas, o bien los datos comienzan distribuidos de manera uniforme entre las máquinas, y envía 1/99 de sus datos a cada uno de los otros. Las particiones no tienen que ser iguales, solo cercanas.
Cada otra máquina clasifica sus datos, y lo hace de una manera que favorece encontrar primero los valores más bajos. Entonces, por ejemplo, una selección rápida, siempre ordenando primero la parte inferior de la partición [*]. Escribe sus datos de nuevo en la máquina de control en orden creciente tan pronto como sea posible (usando E / S asíncronas para continuar ordenando, y probablemente con Nagle encendido: experimente un poco).
La máquina de control realiza una fusión de 99 vías en los datos a medida que llegan, pero descarta los datos combinados, simplemente manteniendo el recuento del número de valores que ha visto. Calcula la mediana como la media de los valores de 1/2 billonésima y 1/2 billón más uno.
Esto sufre del problema "más lento en el rebaño". El algoritmo no puede completarse hasta que una máquina de clasificación haya enviado cada valor inferior a la mediana. Existe una posibilidad razonable de que uno de esos valores sea bastante alto dentro de su paquete de datos. Entonces, una vez que se completa la partición inicial de los datos, el tiempo de ejecución estimado es la combinación del tiempo para clasificar 1/99 de los datos y enviarlos de regreso a la computadora de control, y el tiempo para que el control lea la mitad de los datos . La "combinación" está en algún lugar entre el máximo y la suma de esos tiempos, probablemente cerca del máximo.
Mi instinto es que para enviar datos a través de una red sea más rápido que ordenarlos (y mucho menos solo seleccionar la mediana) debe ser una red bastante rápida. Podría ser una mejor perspectiva si se presume que la red es instantánea, por ejemplo, si tiene 100 núcleos con igual acceso a la RAM que contiene los datos.
Dado que es probable que la E / S de la red sea el límite, puede haber algunos trucos que puede jugar, al menos para los datos que regresan a la máquina de control. Por ejemplo, en lugar de enviar "1,2,3, .. 100", quizás una máquina de clasificación podría enviar un mensaje que signifique "100 valores inferiores a 101". Luego, la máquina de control podría realizar una fusión modificada, en la que encuentra el menor de todos esos valores superiores de rango, luego le dice a todas las máquinas de clasificación qué era, para que puedan (a) decirle a la máquina de control cómo muchos valores para "contar" por debajo de ese valor, y (b) reanudar el envío de sus datos ordenados desde ese punto.
En términos más generales, es probable que haya un juego de adivinanzas de desafío-respuesta inteligente que la máquina de control puede jugar con las 99 máquinas de clasificación.
Sin embargo, esto implica viajes de ida y vuelta entre las máquinas, lo que evita mi primera versión más simple. Realmente no sé cómo estimar a ciegas su rendimiento relativo, y dado que las compensaciones son complejas, imagino que existen soluciones mucho mejores que cualquier cosa que piense de mí, suponiendo que esto sea un problema real.
[*] la pila disponible lo permite: tu elección de qué parte hacer primero está limitada si no tienes espacio adicional O (N). Pero si tiene suficiente espacio extra, puede elegir, y si no tiene suficiente espacio, al menos puede usar lo que tiene para cortar algunas esquinas, haciendo primero la parte pequeña para las primeras particiones.