Ah, mein Gehirn hat gerade einen Gang eingelegt, ich habe jetzt einen vernünftigen Vorschlag. Wahrscheinlich zu spät, wenn dies ein Interview gewesen wäre, aber egal:
Maschine 1 wird als "Steuermaschine" bezeichnet, und aus Gründen der Argumentation beginnt sie entweder mit allen Daten und sendet sie in gleichen Paketen an die anderen 99 Maschinen, oder die Daten werden gleichmäßig zwischen den Maschinen verteilt, und sie sendet 1/99 seiner Daten an die anderen. Die Partitionen müssen nicht gleich sein, sondern nur schließen.
Jede andere Maschine sortiert ihre Daten auf eine Weise, die es bevorzugt, zuerst die niedrigeren Werte zu finden. Zum Beispiel eine Quicksortierung, bei der immer zuerst der untere Teil der Partition sortiert wird [*]. Es schreibt seine Daten so schnell wie möglich in aufsteigender Reihenfolge auf die Steuerungsmaschine zurück (unter Verwendung von asynchronem E / A, um die Sortierung fortzusetzen, und wahrscheinlich mit eingeschaltetem Nagle: Experimentieren Sie ein wenig).
Die Steuerungsmaschine führt beim Eintreffen eine 99-Wege-Zusammenführung der Daten durch, verwirft jedoch die zusammengeführten Daten und zählt nur die Anzahl der Werte, die sie gesehen hat. Der Median wird als Mittelwert aus den Werten 1/2 1/2 und 1/2 Milliarde plus 1 berechnet.
Dies leidet unter dem Problem "am langsamsten in der Herde". Der Algorithmus kann erst abgeschlossen werden, wenn jeder Wert, der unter dem Median liegt, von einer Sortiermaschine gesendet wurde. Es besteht eine vernünftige Wahrscheinlichkeit, dass ein solcher Wert in seinem Datenpaket ziemlich hoch ist. Sobald die anfängliche Partitionierung der Daten abgeschlossen ist, ist die geschätzte Laufzeit die Kombination aus der Zeit, um 1/99 der Daten zu sortieren und an den Steuercomputer zurückzusenden, und der Zeit, die die Steuerung benötigt, um die Hälfte der Daten zu lesen . Die "Kombination" liegt irgendwo zwischen dem Maximum und der Summe dieser Zeiten, wahrscheinlich nahe am Maximum.
Mein Instinkt ist, dass es ein verdammt schnelles Netzwerk sein muss, damit Daten über ein Netzwerk schneller gesendet werden als sortiert werden (geschweige denn nur der Median ausgewählt wird). Könnte eine bessere Perspektive sein, wenn davon ausgegangen werden kann, dass das Netzwerk sofort verfügbar ist, z. B. wenn Sie über 100 Kerne mit gleichem Zugriff auf den RAM verfügen, der die Daten enthält.
Da Netzwerk-E / A wahrscheinlich gebunden sind, können Sie möglicherweise einige Streiche spielen, zumindest für die Daten, die zur Steuerungsmaschine zurückkehren. Anstatt beispielsweise "1,2,3, .. 100" zu senden, könnte eine Sortiermaschine möglicherweise eine Nachricht senden, die "100 Werte kleiner als 101" bedeutet. Die Steuermaschine könnte dann eine modifizierte Zusammenführung durchführen, bei der sie den geringsten dieser Werte im oberen Bereich findet und dann allen Sortiermaschinen mitteilt, was es war, damit sie (a) der Steuermaschine mitteilen können, wie viele Werte, die unter diesem Wert "gezählt" werden sollen, und (b) das Senden ihrer sortierten Daten von diesem Punkt an fortsetzen.
Im Allgemeinen gibt es wahrscheinlich ein cleveres Rätselraten, bei dem die Steuerungsmaschine mit den 99 Sortiermaschinen spielen kann.
Dies beinhaltet jedoch Hin- und Rückfahrten zwischen den Maschinen, was meine einfachere erste Version vermeidet. Ich weiß nicht wirklich, wie ich ihre relative Leistung blind einschätzen soll, und da die Kompromisse komplex sind, stelle ich mir vor, dass es viel bessere Lösungen gibt als alles, was ich mir vorstellen werde, vorausgesetzt, dies ist jemals ein echtes Problem.
[*] verfügbarer Stapel zulässig - Ihre Auswahl, welcher Teil zuerst ausgeführt werden soll, ist eingeschränkt, wenn Sie nicht über O (N) zusätzlichen Speicherplatz verfügen. Wenn Sie jedoch über genügend zusätzlichen Platz verfügen, können Sie Ihre Wahl treffen. Wenn Sie nicht über genügend Platz verfügen, können Sie zumindest das verwenden, was Sie zum Schneiden einiger Ecken benötigen, indem Sie den kleinen Teil zuerst für die ersten Partitionen ausführen.