怎样在分布式系统上找出出现频次最高的前100个数?

需要按照范围ceiling(2^16/N)划分数字到不同的server,统计每个数字出现的次数,然后在通过一个server来比较。不通过全局统计据我所知是不行的,有个著名的挑战叫TeraSort,讨论过这个问题。
■网友
不考虑取值范围的一种通用解法:1. 收集局部信息:所有N个server分别统计出各自数字集合上的top 100结果,并发送给其他Server。2. 计算频次下界:每个Server在汇总所有N个Server发送的top 100结果后,对这些结果做merge(即相同数字对应的频次相累加),merge以后取排在第100位的数字的频次,记为K。得到一个下界,即全局top 100的数字的频次都不小于K。3. 产生候选集:所有Server向其他Server发送本地 频次\u0026gt;=K/N的所有数字(及其频次)给其他结点,对这些数字集合取并集,得到总的候选集。(全局频次top 100的数字必定都在这个候选集中,否则其全局频次将\u0026lt;K) 4. 收集候选集频次:各Server向其他Server发送本地所有在该候选集中的数字的频次。5. 汇总结果并排序:各Server上对发回的数字频次进行Merge并排序,即可得到最终top 100结果。整体解法的性能主要取决于第3步产生的候选集大小。以上过程中,如果允许选定一个Server来做收集汇总与调度,则可以减少总的网络带宽和避免各结点上不必要的重复计算。


    推荐阅读