中位数,也就是排序后位置在中间的数。中位数是笔试面试中的常客,在N年前T公司的实习生招聘和校园招聘中,两次遇到了这个问题。
非海量数据的中位数
参考之前的文章:top-K问题和随机选择算法。显然,我们可以使用:
1. 快速排序算法
排序后,直接找出中位数。
2. 直接选择算法
直接选择,直到选到中位数。
3. 堆选择算法
堆选择,最后选到中位数。
4. 随机选择算法
随机选择算法,找到中位数。
海量数据的中位数
如果是求海量数据的中位数,那就不太好用上述方法了,因为没法把大文件中的海量数据加载到内存中。那该怎么办呢?
参考之前的文章:华山论剑之桶排序。注意,我们需要求的是中位数,而不是排序。具体步骤如下:
Step1: 创建多个小文件桶,设定每个桶的取值范围,然后把海量数据元素分配到对应的桶中,并记录桶中元素的个数。
Step2: 根据桶中元素的个数,计算出中位数所在的桶,然后针对该桶进行排序,就可以求出海量数据中位数的值。
具体示意图如下:
中位数,其实就是特殊的顺序统计量。无论是非海量数据还是海量数据,我们都可以很快地找出中位数。