文件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中最终找到的中位数如下: