Ах, мій мозок тільки штовхнувся, у мене зараз є розумна пропозиція. Можливо, пізно, якби це було інтерв'ю, але неважливо:
Машина 1 називається "машиною управління", і заради аргументу вона або починається з усіх даних, і надсилає їх рівними посилками на інші 99 машин, інакше дані починають рівномірно розподілятися між машинами, і це надсилає 1/99 своїх даних кожному з інших. Перегородки не повинні бути рівними, просто близько.
Кожна інша машина сортує свої дані і робить це таким чином, що сприяє пошуку перших нижчих значень. Так, наприклад, швидкий вибір, завжди спочатку сортуючи нижню частину розділу [*]. Він записує свої дані в керуючу машину в порядку збільшення якнайшвидше (використовуючи асинхронний IO, щоб продовжувати сортування, і, ймовірно, з Nagle on: трохи експериментуйте).
Контрольна машина здійснює 99-ти напрямне злиття даних, коли вони надходять, але відкидає об'єднані дані, просто зберігаючи підрахунок кількості значень, які вона побачила. Він обчислює медіану як середнє значення 1/2 мільярду та 1/2 мільярда плюс одне число.
Це страждає від "найповільнішої в стаді" проблеми. Алгоритм не може завершитись, поки сортувальна машина не надішле кожне значення, менше за медіану. Існує обгрунтований шанс, що одна така величина буде досить високою в межах своїх пакетів даних. Отже, коли початковий розподіл даних завершений, передбачуваний час роботи - це комбінація часу для сортування 1/99-ї даних та відправлення їх назад на керуючий комп'ютер, і часу для керування для зчитування 1/2 даних . "Комбінація" десь між максимумом і сумою тих часів, ймовірно, близькою до макс.
Мій інстинкт полягає в тому, що для надсилання даних через мережу швидше, ніж їх сортування (не кажучи вже лише про вибір медіани), це має бути досить проклята швидка мережа. Можливо, це буде кращою перспективою, якщо мережу можна вважати миттєвою, наприклад, якщо у вас є 100 ядер з рівним доступом до оперативної пам'яті, що містить дані.
Оскільки мережевий ввод-вивід, ймовірно, пов'язаний, можливо, ви можете зіграти деякі хитрощі, принаймні для даних, що повертаються до керуючої машини. Наприклад, замість того, щоб надсилати "1,2,3, .. 100", можливо, сортувальна машина могла б надіслати повідомлення із значенням "100 значень менше 101". Потім контрольна машина може виконати модифіковане злиття, в якому вона знаходить найменше з усіх цих найвищих значень діапазону, а потім повідомляє всім сортувальним машинам, що це було, щоб вони могли (а) розповісти керуючій машині, як багато значень "підрахувати" нижче цього значення та (b) відновити надсилання своїх відсортованих даних з цієї точки.
Загалом, напевно, є розумна гра вгадування виклику-відповіді, що контрольна машина може грати з 99 машинами сортування.
Це, однак, передбачає обхід між машинами, чого уникає моя простіша перша версія. Я не знаю, як сліпо оцінити їх відносну ефективність, і оскільки компроміси складні, я думаю, що там є набагато кращі рішення, ніж все, що я думаю про себе, припускаючи, що це колись справжня проблема.
[*] доступний стек, що дозволяє - ваш вибір, яку частину зробити спочатку обмежений, якщо у вас немає O (N) додаткового місця. Але якщо у вас достатньо додаткового місця, ви можете взяти свій вибір, а якщо у вас недостатньо місця, ви можете принаймні використовувати те, що ви робите, щоб вирізати кути, зробивши спочатку невелику частину для перших кількох перегородок.