Cela dépend de vos données. Le pire des cas est qu'il s'agit de nombres uniformément distribués.
Dans ce cas, vous pouvez trouver la médiane en temps O (N) comme dans cet exemple:
Supposons que vos nombres soient 2,7,5,10,1,6,4,4,6,10,4,7,1,8,4,9,9,3,4,3 (la plage est 1-10) .
Nous créons 3 seaux: 1-3, 4-7, 8-10. Notez que le haut et le bas ont la même taille.
Nous remplissons les seaux avec les nombres, comptons combien tombent dans chacun, le max et le min
- faible (5): 2,1,1,3,3, min 1, max 3
- milieu (10): 7,5,6,4,4,6,4,7,4,4, min 4, max 7
- haut (5): 10, 10, 8, 9, 9, min 8, max 10
La moyenne tombe dans le seau du milieu, on ne tient pas compte du reste
Nous créons 3 seaux: 4, 5-6, 7. Low commencera avec un nombre de 5 et avec un maximum de 3 et un maximum avec un minimum de 8 et un compte de 5.
Pour chaque nombre, nous comptons combien tombent dans le seau bas et haut, le max et le min, et gardons le seau du milieu.
- vieux bas (5)
- faible (5): 4, 4, 4, 4, 4, max 4
- milieu (3): 5,6,6
- haut (2): 7, 7, min 7
- vieux haut (5)
Maintenant, nous pouvons calculer la médiane directement: nous avons une situation comme celle-ci
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
donc la médiane est de 4,5.
En supposant que vous en savez un peu plus sur la distribution, vous pouvez affiner comment définir les plages pour optimiser la vitesse. Dans tous les cas, la performance doit aller avec O (N), car 1 + 1/3 + 1/9 ... = 1,5
Vous avez besoin de min et max à cause des cas extrêmes (par exemple, si la médiane est la moyenne entre le max de l'ancien bas et de l'élément suivant).
Toutes ces opérations peuvent être parallélisées, vous pouvez donner 1/100 des données à chaque ordinateur et calculer les 3 buckets dans chaque nœud, puis distribuer le bucket que vous conservez. Cela vous permet à nouveau d'utiliser le réseau efficacement car chaque numéro est passé en moyenne 1,5 fois (donc O (N)). Vous pouvez même battre cela si vous ne passez que les nombres minimaux entre les nœuds (par exemple, si le nœud 1 a 100 numéros et le nœud 2 a 150 numéros, alors le nœud 2 peut donner 25 numéros au nœud 1).
Sauf si vous en savez plus sur la distribution, je doute que vous puissiez faire mieux que O (N) ici, car vous devez en fait compter les éléments au moins une fois.