首页 新闻 会员 周边 捐助

怎么快速求中位数

0
悬赏园豆:30 [已解决问题] 解决于 2016-03-30 17:34

比如你有1亿个数, 在不排序的情况下如何快速求中位数,有没有 o(n)的方法。

五星的主页 五星 | 初学一级 | 园豆:125
提问于:2015-02-12 15:50
< >
分享
最佳答案
1

如果数的取值范围不大 可以考虑 桶排序 http://blog.csdn.net/quietwave/article/details/8008572

收获园豆:20
MicroTeam | 菜鸟二级 |园豆:222 | 2015-04-07 23:53
其他回答(5)
0

先判断个数的奇偶,然后排序,取值

prison | 园豆:298 (菜鸟二级) | 2015-02-13 15:14

就是要不排序啊。排序的话,就算不考虑性能o(n * lg(n)), 这么多数往哪存啊

支持(0) 反对(0) 五星 | 园豆:125 (初学一级) | 2015-02-14 00:20
0

所有的查找算法都是基于有序数组实现的.

这是我对算法的一个认知.....可能有些绝对,但我没想出别的来

收获园豆:5
吴瑞祥 | 园豆:29449 (高人七级) | 2015-02-13 20:48
0

首先要搞明白什么是中位数:

1 3 6

其中3就是中位数。也就是说与平均值相差最小的那个,解释下。该数组的平均值是3.3

2.3  0.3  2.7

上面是每个数与平均值的差的绝对值。

 

[算法出来了]

通过两次遍历寻找差值最小的那个数,即是中位数。

1 第一遍遍历:求得平均值

2 第二遍遍历:计算每个位置对应的差值,并记录差值最小的那个对应的数,最终这个记录值便是中位数。

 

xingoo | 园豆:711 (小虾三级) | 2015-02-14 12:19

中位数是大小在中间的那个数,比如有201个数,找到中间的数,有100个比它大,有100个比它小

比如 1, 1, 1, 2, 3, 3, 1000, 中位数应该是2

按你的算法是3

支持(0) 反对(0) 五星 | 园豆:125 (初学一级) | 2015-02-14 12:41

@五星: 对,没有考虑到这种情况。上面是不允许重复的情况....再想想

支持(0) 反对(0) xingoo | 园豆:711 (小虾三级) | 2015-02-14 17:19
0

暂时没有对应的O(n)算法,请参考编程之美里面的取第k位数

收获园豆:5
C8LUKA | 园豆:209 (菜鸟二级) | 2015-02-27 14:48
0

如果限制内存的话,可以手写个二叉堆,填充一半的元素,利用堆排序的原理取得中位数。

jiu~ | 园豆:444 (菜鸟二级) | 2015-05-09 21:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册