有10亿个杂乱无章的数,怎样最快地求出其中前1000大的数
1)方法1
建一个1000个数的最小堆,然后依次添加剩余元素,如果大于堆顶的数(堆中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的1000个数就是所需的最大的1000个。算法的时间复杂度为O(nlogk)=n*log1000=10n(n为10亿,k为1000)。
优化的方法:分治法。可以把所有10亿个数据分组存放,比如分别放在1000个文件中。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起再找出最终的结果。
优化的方法:如果这10亿个数里面有很多重复的数,先通过Hash法,把这10亿个数字去重复,这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间,然后通过分治法或最小堆法查找最大的1000个数。
---------------------
原文:https://blog.csdn.net/jiangyanting2011/article/details/70325215
2)方法2
借助于一个1000大小的数组,以数据流的形式读入数据,如果读入的数据少于1000,将这些数据按从小到大的顺序进行排序。然后当读入的数据多余1000的时候,与最小的数据进行比较,如果比数组中最小的数都小,则继续读入后续数据;如果比最小的数大,则去掉数组中最小的数据,并将该数据插入数组中相应的位置(相当于对数据进行一次遍历),直到所有的数据读完,最后数组中的数就是前1000大的数据。
方法2 相比方法1 时间复杂度高,方法2时间复杂度:O(n*k)
没有诗和远方
只有代码和当下