Моя копейка, после всего, что уже воспитывалось другими:
Нахождение медианы на одной машине - O (N): https://en.wikipedia.org/wiki/Selection_algorithm.
Отправка N номеров на 100 машин также является O (N). Итак, чтобы сделать использование 100 машин интересным, либо связь должна быть относительно быстрой, либо N настолько велико, что ни одна машина не может справиться с этим, в то время как N / 100 выполнимо, или мы просто хотим рассмотреть математическую проблему, не беспокоясь о datacommunication.
Если говорить кратко, то я предполагаю, что в разумных пределах мы можем отправлять / распространять номера, не влияя на анализ эффективности.
Рассмотрим следующий подход, в котором один компьютер назначается «ведущим» для некоторой общей обработки. Это будет сравнительно быстро, поэтому «мастер» также участвует в общих задачах, выполняемых каждой машиной.
- Каждая машина получает N / 100 чисел, вычисляет свою медиану и отправляет эту информацию мастеру.
- Мастер составляет отсортированный список всех различных медиан и отправляет его обратно на каждую машину, определяя упорядоченную последовательность сегментов (на каждой машине одинаково), по одному на каждое значение медианы (сегмент с одним значением) и один для каждый интервал между соседними медианами. Конечно, есть также нижние и верхние сегменты для значений ниже самой низкой медианы и выше самой высокой.
- Каждая машина вычисляет, сколько чисел попадает в каждое ведро, и передает эту информацию мастеру.
- Мастер определяет, какое ведро содержит медиану, сколько нижних значений (всего) падает ниже этого ведра и сколько выше.
- Если выбранный интервал является интервалом с одним значением (одним из медиан) или наоборот, выбранный интервал содержит только 1 (N нечетных) или 2 (N четных) значений, которые мы сделали. В противном случае мы повторяем шаги выше со следующими (очевидными) модификациями:
- Только числа из выбранного сегмента распределяются от мастера к 100 машинам и, более того,
- Мы не собираемся вычислять (на каждой машине) медиану, а k-е значение, где мы учитываем, сколько старших чисел было отброшено из общего числа и сколько меньших чисел. Концептуально каждая машина также имеет свою долю отброшенных низких / высоких чисел и учитывает ее при вычислении новой медианы в наборе, который (концептуально) включает (свою долю) отброшенных чисел.
Время-сложность:
- Немного размышлений убедит вас, что на каждом шаге общее количество анализируемых значений уменьшается как минимум в два раза (2 - довольно больной случай; вы можете ожидать значительно лучшего сокращения). Отсюда получаем:
- Предполагая, что для нахождения медианы (или k-го значения), которая является O (N), требуется c * N время, когда коэффициент c не слишком сильно меняется с N, так что мы можем принять его как константу для момент, мы получим наш окончательный результат в самое большее 2 * c * N / 100 раз. Таким образом, использование 100 машин дает нам коэффициент ускорения 100/2 (как минимум).
- Как отмечалось вначале: время, необходимое для обмена номерами между машинами, может сделать более привлекательным просто делать все на одной машине. Однако, если мы перейдем к распределенному подходу, общее количество номеров, которые должны быть переданы на всех этапах вместе, не будет превышать 2 * N (N в первый раз, <= N / 2 во второй раз, <= половина этого третье и т. д.) </li>