当前位置:Scooters

排(pái)序算法中内存要求最大

2025-03-23 07:29:29Scooters

一道java面试题,20亿数字的文本排序,如何取前100?既然是java题,这就是经典的topk问题。先取前100个数,建立一个最小堆,剩下的数依次从堆顶插入元素,同时调整堆。最后堆中的100个元素即为结果

一道java面试题,20亿数字的文本排序,如何取前100?

既然是java题,这就是经典的topk问题。先取前100个数,建立一个最小堆,剩下的数依次从堆顶插入元素,同时调整堆。最后堆中的100个元素即为结果。空间复杂度为k,时间复杂度为nlogk

澳门巴黎人

5000个数中找出10个最大的,用哪种排序算法比较好?

这道题的最优时间复杂度是O(n)。所以如果非要用排序算法,在题目条件允许的情况下,请尽量选择桶排序等O(n)的排序算法。另一个解法是建一个大小为10的堆,顺序遍历这个数组,堆满了就把堆顶的元素去掉,这样最后得到的就是最大的10个元素了。时间复杂度为O(n log 10)。

澳门新葡京

挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?

这种大数据处理的面试题,其实准备过就非常的简单,对于没准备过的人,简直就是灾难!1个32位整数需要4个字节,1KB可以存储256个数字,1GB可以存储2.6亿个数字。如果只有2亿个数字,我们可能全部加载到内存。很明显,但是我们不可能开出一个以数字大小位下标的数组,因为数字可能非常大,从1到100亿的数字都可能存在,如果我们是Java程序员,我们可以使用HashMap或者TreeMap等数据结构来维护一个Map<数字,次数>的映射,但是Map占用的内存大小其实比较难以评估,用2GB来操作是2亿的数据是存在内存溢出的风险的。这个算法虽然简单,但却又一定的风险。那么,我们有没有可能找到一个算法,在原来的数组上进行操作就找到最终答案的方法呢?其实并不难,我们对所有数字进行排序,常见的排序算法有冒泡排序、选择排序、堆排序、快速排序等

一般我们都使用快速排序,理论的算法复杂度位O(NLogN),又稳定又快。问题就转化成,在一个有序的数组里面,如何快速找到出现次数最多的数字。同样非常简单,我们维护一个计数器,只要从左往右依次检查,如果一个数等娱乐城于上一个数,计数器就加一,否则计数器就变成1,重新开始统计。就可以巧妙地扫描一遍,找到出《繁:齣》现次数最多地数字。

那么如果文件特别大呢?像题目中说的200亿个数字的文件,我们不可能把所有的数字加载到内存里面,这种问题,其实都有一个常见的套路,那便是分治。什么是分治呢?就是把问题拆成多个子问题进行求解,例如上述问题,我们可以把这200亿个数,按照个位十位数的不同,分成100个不同的文件,然后采用上述算法进行统计。很明显,分成如果大于2亿个 那就继续拆分!

这个题目还有非常开云体育多(duō)的解法,可以看看我的文章哦 https://www.toutiao.com/i6698339771942437384/

本文链接:http://10.21taiyang.com/Scooters/20558337.html
排(pái)序算法中内存要求最大转载请注明出处来源