论坛首页 Java企业应用论坛

一道腾讯面试题

浏览 39245 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-02  
10G的文件里都是乱序的整数,要求找出中位数。

   发表时间:2010-04-02   最后修改:2010-04-02
yangguo 写道
10G的文件里都是乱序的整数,要求找出中位数。


10个数找到中位数的代码怎么写?
差不多。
0 请登录后投票
   发表时间:2010-04-02  
这个.首先你要把这10G的文件读到File流里面就要注意了吧= =.
0 请登录后投票
   发表时间:2010-04-02  
等待牛人出现解答
0 请登录后投票
   发表时间:2010-04-02  
抛出异常的爱 写道
yangguo 写道
10G的文件里都是乱序的整数,要求找出中位数。


10个数找到中位数的代码怎么写?
差不多。

用简单办法,解决复杂的问题。高手!
0 请登录后投票
   发表时间:2010-04-02  
用b树,然后从两端递归称子树重量
1 请登录后投票
   发表时间:2010-04-02   最后修改:2010-04-02
使用MapReduce方式分段并行计算
0 请登录后投票
   发表时间:2010-04-02  
从海量数据中找出中位数

http://blog.chinaunix.net/u3/94271/showart_2020121.html
0 请登录后投票
   发表时间:2010-04-03   最后修改:2010-04-03
1、取 16*1024 个数,生成一个 TreeMap 。取得最大值 max 和最小值 min。
2、构造一个1024个元素的计数数组 T[i],对最初的 1024 个数按区间计数;
对 min 和 max 进行 1024 个等分,各等分值为 N[i]。

当数据 N[a]<data<=N[a+1] 时, T[a]++;

3、将大于 N[512-8] 且小于 N[512+8] 的数放入一个新的 TreeMap。

4、开始读取之后的数据,执行2 和 3的操作;

5、根据区间计数,获知中位数处于N[x]区间。
如果正好处于 N[512-8] 且小于 N[512+8],则可以直接查询数据。
否则,重新读取一次数据,将处于 N[x] 区间的数,放入一个 TreeMap 中,获得中位数。

6、如果某个区间的数据量超过 200万,则对该区间进行分区,分成 1024 个区,并进行计数。


嗯嗯,计数要智能一些,可以分拆、合并计数据区间。最大值最小值要随时取。
0 请登录后投票
   发表时间:2010-04-03   最后修改:2010-04-03
随机找到个数
把数据重排一下
大于这数的放左
小于这数的放右
少的部分变成一个箱的总个数其它不管

多的那边再生成两个箱

每次计算出来中值可能在哪个箱中
就拆哪个箱子

左右摆动直到中间的数组足够小。。。。

这个复杂度是 O(n*lgn)

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics