大数据寻找中位数

文件Integers中,存储了100,000个正整数,现在需要找出其中最中间的一个数,即从大到小排位于第50000的正整数。

解答:

A B C D
1 =file("Integers.btx") =A1.cursor@b() >a=0
2 =B1.groups@n(~.Integer\1000000+1:ID;count(~):Count) =A2.sum(Count)  
3 =A2.select@1((a=a+~.Count,a>B2/2))    
4 =A1.cursor@b()    
5 =A4.select(~.Integer\1000000+1 ==A3.ID) =A5.sortx(-Integer)  
6 =B5.select@1(#==ceil(a-B2/2)) =A6.fetch()  

在第1次遍历中,计算出中位数所在的区间,及在该区间中的大小排名,由于划分区间后分组数并不太多,因此分组汇总时使用groups函数。第2次遍历即可计算出中位数。计算中,不必一次读出所有的数据,即使数据再多也可以用这个方法寻找中位数。

B6中最终找到的中位数如下: