Ach, mój mózg właśnie się włączył, mam teraz sensowną sugestię. Prawdopodobnie za późno, gdyby to był wywiad, ale nieważne:
Maszyna 1 powinna być nazywana „maszyną sterującą” i ze względu na argumentację albo zaczyna od wszystkich danych i wysyła je w równych paczkach do pozostałych 99 maszyn, albo dane zaczynają się równomiernie rozprowadzać między maszynami i przesyła każdemu z pozostałych 1/99 swoich danych. Przegrody nie muszą być równe, wystarczy zamknąć.
Każda inna maszyna sortuje swoje dane i robi to w sposób, który faworyzuje znalezienie najpierw niższych wartości. Na przykład quicksort, sortując zawsze najpierw dolną część partycji [*]. Zapisuje swoje dane z powrotem do maszyny sterującej w kolejności rosnącej tak szybko, jak to możliwe (używając asynchronicznego IO, aby kontynuować sortowanie, i prawdopodobnie z włączonym Nagle: trochę poeksperymentuj).
Maszyna sterująca wykonuje 99-stopniowe scalanie danych w chwili ich nadejścia, ale odrzuca połączone dane, po prostu rejestrując liczbę wartości, które widziała. Oblicza medianę jako średnią z 1/2 miliardowej i 1/2 miliarda plus jedna wartość.
To cierpi na problem „najwolniejszego w stadzie”. Algorytm nie może zakończyć się, dopóki każda wartość mniejsza niż mediana nie zostanie wysłana przez maszynę sortującą. Istnieje spora szansa, że jedna taka wartość będzie dość wysoka w ramach tej paczki danych. Tak więc po zakończeniu wstępnego partycjonowania danych szacowany czas pracy jest połączeniem czasu sortowania 1/99 danych i wysyłania ich z powrotem do komputera sterującego oraz czasu, w którym sterowanie odczytuje 1/2 danych. . „Kombinacja” jest gdzieś pomiędzy maksimum a sumą tych czasów, prawdopodobnie blisko maksimum.
Wydaje mi się, że aby przesyłanie danych przez sieć było szybsze niż ich sortowanie (nie mówiąc już o wybraniu mediany), musi to być cholernie szybka sieć. Może być lepszą perspektywą, jeśli można założyć, że sieć jest natychmiastowa, na przykład jeśli masz 100 rdzeni z równym dostępem do pamięci RAM zawierającej dane.
Ponieważ sieć I / O prawdopodobnie będzie związana, mogą istnieć pewne sztuczki, które możesz wykorzystać, przynajmniej w przypadku danych wracających do maszyny sterującej. Na przykład zamiast wysyłać „1, 2, 3, .. 100”, być może maszyna sortująca mogłaby wysłać wiadomość oznaczającą „100 wartości mniejszych niż 101”. Maszyna sterująca mogłaby następnie wykonać zmodyfikowane scalanie, w którym znajdzie najmniejszą ze wszystkich tych najwyższych wartości, a następnie poinformuje wszystkie maszyny sortujące, co to było, aby mogły (a) powiedzieć maszynie sterującej, w jaki sposób wiele wartości do „zliczenia” poniżej tej wartości i (b) wznowić wysyłanie posortowanych danych od tego momentu.
Mówiąc bardziej ogólnie, prawdopodobnie istnieje sprytna gra polegająca na zgadywaniu odpowiedzi na wyzwania, w którą maszyna sterująca może grać z 99 maszynami sortującymi.
Obejmuje to jednak podróże w obie strony między maszynami, których unika moja prostsza pierwsza wersja. Naprawdę nie wiem, jak ślepo oszacować ich względne wyniki, a ponieważ kompromisy są złożone, wyobrażam sobie, że istnieją znacznie lepsze rozwiązania niż cokolwiek, co pomyślę o sobie, zakładając, że to kiedykolwiek jest prawdziwy problem.
[*] dostępny stos, jeśli pozwala na to - wybór, którą część wykonać jako pierwszą, jest ograniczony, jeśli nie masz O (N) dodatkowej przestrzeni. Ale jeśli masz wystarczająco dużo dodatkowej przestrzeni, możesz wybrać swój wybór, a jeśli nie masz wystarczająco dużo miejsca, możesz przynajmniej użyć tego, co musisz, aby wyciąć kilka rogów, wykonując najpierw małą część dla pierwszych kilku partycji.