0
点赞
收藏
分享

微信扫一扫

从一个8G大文件中取出k个最大值,面试官看我不会还给我讲了一下

从一个8G大文件中取出k个最大值,面试官看我不会还给我讲了一下_优先队列

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈

从一个8G大文件中取出k个最大值解决方法总结 🤞这次都给他拿下🤞 ​​我们都知道一个大文件的话不能够一次读到内存当中进行排序,所以i我们要另寻他法​

正菜来了⛳⛳⛳

🎈第一种方法:使用优先队列

这个是我已经说出来的解决方法,但是因为之前理解错了,所以给面试官说优先队列也说错了,面试后才算真正懂了,但是这次面试也G了。

正确的方法: 我们创建一个k个数量的优先队列,最小堆的那种类型,然后遍历文件中的数据经过判断添加到优先队列中即可, 就是这个地方容易理解错,我们要取出最大的k个值,为什么要用最小堆,而不是最大堆呢,最大堆不是存放的大值吗,其实应该这么理解,最小堆堆顶存放的是最小值,当遍历数据的时候,分别与堆顶元素比较,如果比堆顶元素大,把堆顶元素删除,插入当前元素,重新调整堆,遍历完之后队列中就是最大的k个值。

🎈第二种方法:归并排序

​温馨提醒:这个才是最好的方法​​ 因为上一个每一个元素都要和堆顶元素比较,还可能有插入堆,调整堆的步骤。 正解: 第一步:把这个大文件拆分成小文件,要能够一次内存中能加在两个小文件的大小即可。 第二步:每次加载两个小文件规定排序,取出前k个,然后再把前两个的前k个最大值和后两个的前k个去k个最大值,之后的文件类型,就是一个归并的路径。

🍚总结

以上就是关于从一个8G大文件中取出k个最大值的两种解决方法,希望有所帮助,第一种好理解,第二种只要按照归并排序的方法理解就可以。

举报

相关推荐

0 条评论