10 亿个数取中位数
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 个区,并进行计数。
嗯嗯,计数要智能一些,可以分拆、合并计数据区间。最大值最小值要随时取。
唔唔,有空将代码写出来试试。不知道是否可行。
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 个区,并进行计数。
嗯嗯,计数要智能一些,可以分拆、合并计数据区间。最大值最小值要随时取。
唔唔,有空将代码写出来试试。不知道是否可行。