Ah, meu cérebro acabou de funcionar, tenho uma sugestão sensata agora. Provavelmente tarde demais se tivesse sido uma entrevista, mas não importa:
A máquina 1 deve ser chamada de "máquina de controle" e, por uma questão de argumento, começa com todos os dados e a envia em parcelas iguais às outras 99 máquinas, ou então os dados começam distribuídos igualmente entre as máquinas e envia 1/99 de seus dados para cada um dos outros. As partições não precisam ser iguais, apenas fechadas.
As outras máquinas classificam seus dados e o fazem de uma maneira que favorece encontrar os valores mais baixos primeiro. Por exemplo, uma classificação rápida, sempre classificando a parte inferior da partição primeiro [*]. Ele grava seus dados de volta na máquina de controle em ordem crescente o mais rápido possível (usando E / S assíncronas para continuar classificando e, provavelmente, com Nagle ativado: experimente um pouco).
A máquina de controle executa uma mesclagem de 99 vias nos dados à medida que chegam, mas descarta os dados mesclados, apenas mantendo a contagem do número de valores que viu. Ele calcula a mediana como a média dos valores de 1/2 bilhões e 1/2 bilhões mais oneth.
Isso sofre com o problema "mais lento no rebanho". O algoritmo não pode ser concluído até que todo valor menor que a mediana tenha sido enviado por uma máquina de classificação. Há uma chance razoável de que um desses valores seja bastante alto em sua parcela de dados. Portanto, assim que o particionamento inicial dos dados estiver concluído, o tempo de execução estimado é a combinação do tempo para classificar 1/99 dos dados e enviá-los de volta ao computador de controle, e o tempo para o controle ler 1/2 dos dados . A "combinação" está entre o máximo e a soma desses tempos, provavelmente próximo ao máximo.
Meu instinto é que, para enviar dados através de uma rede para ser mais rápido do que classificá-los (quanto mais para selecionar apenas a mediana), ele precisa ser uma rede muito rápida. Pode ser uma perspectiva melhor se se presume que a rede é instantânea, por exemplo, se você tiver 100 núcleos com acesso igual à RAM contendo os dados.
Como é provável que a E / S da rede seja o limite, pode haver alguns truques que você pode executar, pelo menos para os dados que retornam à máquina de controle. Por exemplo, em vez de enviar "1,2,3, .. 100", talvez uma máquina de classificação possa enviar uma mensagem que significa "100 valores menores que 101". A máquina de controle poderia, então, executar uma mesclagem modificada, na qual encontra o menor de todos esses valores de topo de faixa, e depois informar a todas as máquinas de classificação o que era, para que elas possam (a) dizer à máquina de controle como muitos valores para "contar" abaixo desse valor e (b) retomar o envio dos dados classificados a partir desse ponto.
De um modo mais geral, provavelmente existe um jogo de adivinhação inteligente de resposta a desafios que a máquina de controle pode jogar com as 99 máquinas de classificação.
Isso envolve viagens de ida e volta entre as máquinas, o que minha primeira versão mais simples evita. Realmente não sei como estimar às cegas o desempenho relativo deles, e como as compensações são complexas, imagino que haja soluções muito melhores do que qualquer coisa que eu pense, assumindo que esse seja um problema real.
[*] permissão de pilha disponível - sua escolha de qual parte primeiro será restringida se você não tiver espaço extra de O (N). Mas se você tiver espaço extra suficiente, poderá fazer a sua escolha e, se não tiver espaço suficiente, poderá pelo menos usar o que precisa para cortar alguns cantos, fazendo a pequena parte primeiro nas primeiras partições.