网站做桌面应用 iOS,找事做的网站,河北哪些大学网站建设专业比较好,网站排名优化服务题目要求#xff1a;设计一个算法#xff0c;给定一个10亿个数字#xff0c;找出最小的100万的数字。假定计算机内存足以容纳全部10亿个数字。
本题有三种常用的方法#xff0c;一种是先排序所有元素#xff0c;然后取出前100万个数#xff0c;该方法的时间复杂度为O(nl…题目要求设计一个算法给定一个10亿个数字找出最小的100万的数字。假定计算机内存足以容纳全部10亿个数字。
本题有三种常用的方法一种是先排序所有元素然后取出前100万个数该方法的时间复杂度为O(nlogn)。很明显对于10亿级别的数据这么做时间和空间代价太高。
第二种方式是采用选择排序的方式首先遍历10亿个数字找最小然后再遍历一次找第二小然后再一次找第三小直到找到第100万个。很明显这种方式的时间代价是0()也就是要执行10亿 * 100万次这个效率一般的服务器都达不到。
第三种方式采用大顶堆来解决堆的原理在《查找》一章专门介绍过方法思想是一致的都是“查小用大堆查大用小堆”。
首先为前100万个数字创建一个大顶堆最大元素位于堆顶。
然后遍历整个序列只有比堆顶元素小的才允许插入堆中并删除原堆的最大元素。
之后继续遍历剩下的数字最后剩下的就是最小的100万个。
采用这种方式只需要遍历一次10亿个数字还可以接受。更新堆的代价是0(logn),也勉强能够接受。堆占用的空间是100万*4大约为4MB左右的空间就够了因此也能接收。
如果数据量没有这么大也是可以直接使用这三种方式的。
如果将10亿数字换成流数据也可以使用堆来找而且对于流数据几乎只能用堆来做。