Ah, mon cerveau vient de s'activèrent, j'ai une suggestion sensée maintenant. Probablement trop tard, si cela avait été une entrevue, mais jamais l'esprit:
La Machine 1 est appelé le "contrôle de la machine", et pour la clarté de l'exposé, soit il commence avec toutes les données, et l'envoie dans l'égalité des colis pour les 99 autres machines, ou, sinon, les données commencent à être réparties entre les machines, et il envoie 1/99 de ses données à chacun des autres. Les partitions n'ont pas à être égaux, il suffit de fermer.
Chaque autre machine trie les données, et le fait d'une manière qui favorise trouver les valeurs plus faibles en premier. Ainsi, par exemple un tri rapide, toujours de tri de la partie inférieure de la partition de la première[*]. Il écrit ses données vers la machine de contrôle dans l'ordre croissant dès qu'il le peut (à l'aide asynchrone IO, de manière à continuer le tri, et probablement avec Nagle sur: expérimenter un peu).
Le contrôle de la machine effectue un 99-voie de fusion sur les données qu'elle arrive, mais supprime les données fusionnées, en gardant juste de compter le nombre de valeurs qu'il a vu. Il calcule la médiane, la moyenne de la 1/2 milliardième et 1/2 milliard de plus oneth valeurs.
Cette souffre de la "plus lente dans le troupeau" problème. L'algorithme ne peut pas complète jusqu'à ce que chaque valeur inférieure à la médiane a été envoyé par une machine de tri. Il y a une chance raisonnable que l'une de ces valeurs sera assez élevé au sein de sa parcelle de données. Donc, une fois le partitionnement des données est terminée, la durée estimée est la combinaison du temps de tri 1/99e des données et de l'envoyer à l'ordinateur de contrôle, et le temps pour le contrôle de lire 1/2 les données. La "combinaison" est quelque part entre le maximum et la somme de ces moments, sans doute proche du max.
Mon instinct me dit que pour l'envoi de données sur un réseau pour être plus rapide que le tri (laissez simplement en sélectionnant la médiane), il doit être sacrément rapide du réseau. Peut-être un meilleur prospect si le réseau peut être supposé instantané, par exemple, si vous avez 100 cores avec l'égalité d'accès à la RAM contenant les données.
Depuis les e/S réseau est susceptible d'être la limite, il pourrait y avoir quelques trucs que vous pouvez jouer, au moins pour les données de revenir à la machine de contrôle. Par exemple, au lieu de les envoyer "1,2,3,.. 100", peut-être une machine de tri pourrait envoyer un message signifiant "100 valeurs de moins de 101". Le contrôle de la machine pourrait alors effectuer une modification de la fusion, dans lequel il trouve le moins de tous ceux qui sont haut-de-gamme de valeurs, puis il dit à toutes les machines de tri de ce qu'il était, afin qu'ils puissent (a) indiquer le contrôle de la machine combien de valeurs "compter" en dessous de cette valeur, et (b) la reprise de l'envoi de leurs données triées à partir de ce point.
Plus généralement, il y a probablement un savant défi-réponse de la devinette que le contrôle de la machine peut jouer avec les 99 machines de tri.
Cela implique des allers-retours entre les machines, bien que, qui ma plus simple première version évite. Je ne sais pas vraiment comment l'aveugle-estimation de leurs performances relatives, et, puisque les échanges sont complexes, j'imagine qu'il ya beaucoup de meilleures solutions que rien de ce que je vais penser à moi-même, en supposant que c'est toujours un réel problème.
[*] disponible pile le permet - le choix de la partie à faire en premier est limité si vous n'avez pas de O(N) de l'espace supplémentaire. Mais si vous avez suffisamment d'espace supplémentaire, vous pouvez faire votre choix, et si vous n'avez pas assez d'espace, vous pouvez au moins utiliser ce que vous avez à couper quelques virages, en faisant la petite partie de la première pour la première quelques partitions.