Это зависит от ваших данных. В худшем случае это равномерно распределенные числа.
В этом случае вы можете найти медиану за O (N) времени, как в этом примере:
Предположим, что ваши номера 2,7,5,10,1,6,4,4,6,10,4,7,1,8,4,9,9,3,4,3 (диапазон 1 -10).
Мы создаем 3 ведра: 1-3, 4-7, 8-10. Обратите внимание, что верх и низ имеют одинаковый размер.
Заполняем ведра числами, подсчитываем, сколько выпадает в каждом, максимум и минимум
- низкий (5): 2,1,1,3,3, мин 1, макс 3
- средний (10): 7,5,6,4,4,6,4,7,4,4, минимум 4, максимум 7
- высокий (5): 10, 10, 8, 9, 9, минимум 8, максимум 10
Среднее значение попадает в среднее ведро, остальное мы игнорируем
Мы создаем 3 сегмента: 4, 5-6, 7. Низкий начинается со счета 5 и максимум 3, а высокий - минимум 8 и счет 5.
Для каждого числа мы подсчитываем, сколько выпадает в нижнем и верхнем ведре, максимальном и минимальном, и сохраняем среднее ведро.
- старый низкий (5)
- низкий (5): 4, 4, 4, 4, 4, максимум 4
- средний (3): 5,6,6
- высокий (2): 7, 7, мин. 7
- старый высокий (5)
Теперь мы можем вычислить медиану напрямую: у нас такая ситуация
old low low middle high old high
x x x x x 4 4 4 4 4 4 5 6 6 7 7 x x x x x
таким образом, медиана составляет 4,5.
Предполагая, что вы немного знаете о распределении, вы можете точно настроить способы определения диапазонов для оптимизации скорости. В любом случае производительность должна идти с O (N), потому что 1 + 1/3 + 1/9 ... = 1,5
Вам нужны min и max из-за краевых случаев (например, если медиана - это среднее значение между максимумом старого минимума и следующим элементом).
Все эти операции можно распараллелить, вы можете передать 1/100 данных каждому компьютеру и вычислить 3 сегмента в каждом узле, а затем распределить блок, который вы храните. Это снова заставляет вас эффективно использовать сеть, потому что каждое число передается в среднем 1,5 раза (поэтому O (N)). Вы даже можете превзойти это, если будете передавать только минимальные числа между узлами (например, если узел 1 имеет 100 чисел, а узел 2 имеет 150 чисел, тогда узел 2 может дать 25 чисел узлу 1).
Если вы не знаете больше о распределении, я сомневаюсь, что вы можете добиться большего успеха, чем O (N), потому что вам действительно нужно сосчитать элементы хотя бы один раз.