Divide the numbers into 100 computers (10 MB each).
Loop until we have one element in each list
Find the meadian in each of them with quickselect which is O(N) and we are processing in parallel. The lists will be partitioned at the end wrt median.
Send the medians to a central computer and find the median of medians. Then send the median back to each computer.
For each computer, if the overall median that we just computed is smaller than its median, continue in the lower part of the list (it is already partitioned), and if larger in the upper part.
When we have one number in each list, send them to the central computer and find and return the median.
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
你需要最小和最大,因为边缘情况(例如,如果中位数是平均之间的最大旧低和下一个元素)。
所有这些操作都可以并行化,您可以将1/100的数据给每台计算机,并计算每个节点中的3个存储桶,然后分发您保留的存储桶。这再次使您有效地使用网络,因为每个数字平均传递1.5次(所以 O (N))。如果只在节点之间传递最小的数字(例如,如果节点1有100个数字,而节点2有150个数字,那么节点2可以给节点125个数字) ,那么您甚至可以打败它。
那么,假设您知道不同整数的数量是(比如)40亿,那么您可以将它们装入64k 存储桶中,并从集群中的每台机器(100台计算机)获得每个存储桶的分布式计数。把这些数字合起来。现在,找到具有中间值的 bucket,并且这一次只要求存放在目标 bucket 中的64k 元素的 bucket。这需要对您的“集群”进行 O (1)(特别是2)查询。校对: D