大数据如何找中位数,TopN,大体思路(通用)。

文章目录

1.从10亿个数据(int型占据4B)中找中位数,内存限制为1GB
2.从10亿数中选取前1000大的数字

从10亿个数据(int型占据4B)中找中位数,内存限制为1GB

不可能一次性把数据全部加载到内存中,再使用快速排序算法,因为10亿*4B大约为4GB,内存不够

可以一次性读入1GB的数据(分10次读取),然后对读入的1GB数据按照最高位即第32位的值进行分类并写入文件,如果最高位是1,写入file1,否则写入file2。那么file1全是负数,file2全是正数,如果file1中有4亿个数字,file2中有6亿个数字,那么中位数就是file2中排序之后从小到大的第1亿个数。

然后再把file2中的数据每次读入1GB进入内存,然后对读入的数据按照次高位即第31位的值进行分类写入文件,如果最高位是1,写入file3,否则写入file4,那么file3中的数据都比file4中的数据大,如果file3中有3亿个数字,file4中也有3亿个数字,那么中位数就是file4中从小到大排序后的第1亿个数字。

然后再把file4中的数据每次都读入1GB进入内存,然后对读入的数据按照次次高位即第30位的值进行分类写入文件。。。

如此下去,直至判断中位数为某一个文件中,且该文件中数据个数在2.5亿个(或者更少)时即可用快速排序找出它。

从10亿数中选取前1000大的数字

1.利用分治
类似快速排序中的主元选取后划分数组,每次都递减一半的规模,直到1000时候就得到了1000大小的数字。复杂度为n+n/2+n/4…<2n,复杂度O(n)
2.分布式
将10亿个分段存储在不同的机器上,每台机器计算各自的TopN,最后汇总
3.利用小顶堆
维护一个前1000大的小顶堆,如果小于直接丢弃,大于根节点的,存入,再调整(由于仅仅保存了K个数据,有调整最小堆的时间复杂度为O(lnK),因此Top K算法(问题)时间复杂度为O(nlnK))

发布了17 篇原创文章 · 获赞 17 · 访问量 456

猜你喜欢

转载自blog.csdn.net/weixin_42134034/article/details/105537215