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