Ах, мой мозг только что заработал, теперь у меня есть разумное предложение. Наверное, слишком поздно, если бы это было интервью, но не беда:
Машину 1 следует называть «управляющей машиной», и для аргументации она либо начинает со всех данных и отправляет их равными пакетами на другие 99 машин, либо данные начинают равномерно распределяться между машинами, и это отправляет 1/99 своих данных каждому из остальных. Перегородки не обязательно должны быть равными, просто закрытые.
Каждая другая машина сортирует свои данные и делает это таким образом, чтобы сначала найти более низкие значения. Так, например, быстрая сортировка, всегда сначала сортируя нижнюю часть раздела [*]. Он записывает свои данные обратно в управляющую машину в порядке возрастания, как только может (используя асинхронный ввод-вывод, чтобы продолжить сортировку, и, возможно, с включенным Нэглом: немного поэкспериментируйте).
Управляющая машина выполняет 99-стороннее объединение данных по мере их поступления, но отбрасывает объединенные данные, просто подсчитывая количество значений, которые он видел. Он вычисляет медиану как среднее из 1/2 миллиардного и 1/2 миллиардного плюс одного значений.
Это страдает от проблемы "самого медленного в стаде". Алгоритм не может завершиться до тех пор, пока сортировочная машина не отправит каждое значение, меньшее медианы. Есть разумная вероятность, что одно из таких значений будет довольно высоким в своем пакете данных. Таким образом, как только начальное разбиение данных завершено, расчетное время работы представляет собой комбинацию времени на сортировку 1/99 данных и их отправку обратно в управляющий компьютер и время, в течение которого элемент управления считывает 1/2 данных. , «Комбинация» находится где-то между максимумом и суммой этих времен, вероятно, близкой к максимуму.
Я считаю, что для того, чтобы отправлять данные по сети быстрее, чем их сортировать (не говоря уже о простом выборе медианы), это должна быть чертовски быстрая сеть. Возможно, будет лучше, если можно будет предположить, что сеть работает мгновенно, например, если у вас есть 100 ядер с равным доступом к оперативной памяти, содержащей данные.
Поскольку сетевой ввод-вывод, вероятно, будет ограниченным, вы можете использовать некоторые уловки, по крайней мере, для данных, возвращающихся на управляющую машину. Например, вместо отправки «1,2,3, .. 100», возможно, сортировочная машина может отправить сообщение, означающее «100 значений меньше 101». Затем управляющая машина могла бы выполнить модифицированное слияние, в котором она находит наименьшее из всех этих верхних значений, а затем сообщает всем сортировочным машинам, что это было, чтобы они могли (а) сообщить управляющей машине, как много значений для «подсчета» ниже этого значения и (б) возобновить отправку отсортированных данных с этой точки.
В более общем плане, вероятно, существует умная игра в угадывание «вызов-ответ», в которую управляющая машина может играть с 99 сортировочными машинами.
Однако это включает в себя круговые обходы между машинами, чего избегает моя более простая первая версия. Я действительно не знаю, как вслепую оценить их относительную производительность, и, поскольку компромиссы сложны, я полагаю, что есть гораздо лучшие решения, чем все, что я придумаю себе, если предположить, что это когда-либо будет реальной проблемой.
[*] доступный стек разрешен - ваш выбор, какую часть сделать первой, ограничен, если у вас нет O (N) дополнительного места. Но если у вас достаточно дополнительного места, вы можете выбрать, а если у вас недостаточно места, вы можете, по крайней мере, использовать то, что вам нужно, чтобы срезать некоторые углы, сделав сначала небольшую часть для первых нескольких разделов.