直接几亿的数据,限制内存,找出topK的数,或者中位数这类题,目前我的思路有以下几种,总结如下:
1.桶排序:
一、数据量特别大,分布在-2^31-2^31-1 可以制造100W 一个区间的桶,1000个就是10亿,遍历数据也可以每1000W 读取一次,数字在哪个区间,对应区间内的值+1,这样可以迅速找到中位数对应的桶,然后在这个桶中再次寻找中位数。
二、quickSelect思想,和quickSort大体相同,不同的地方是:quickSelect 一次排序后,丢掉无用的另一段,举例:寻找第K大的数,首先取目前数组的中间的数f,以它为基点,比他小的在左边,比他大的在右边,遍历后,判断这个数所在的位置在K之前还是之后,之前就直接从(f,right)寻找第K-f位置的数字即可, 在K之后,就遍历(0,f),寻找第F位置的数字即可。
三、 mapReduce 分治思想。数据均分成N份,每份去进行排序,归纳,最后合并到一起。