一道腾讯面试题:从大量数字中取出top100
http://www.iteye.com/topic/628707
虽然题目并不难,但看到许多的人回复了,当然有回复的水平高的也有低的反正各种回复千奇百怪。
能想到用二叉树或堆来做的算想对思路了,用多线程部分排序的感觉至少思路上就差得远了。
有个兄弟第一时间用TreeSet给出了代码,当然代码很简单,如下:
package sunfa;
import java.util.Random;
import java.util.TreeSet;
/**
* tx的面试题:1亿个数中取前100个最大的数
*
* 利用TreeSet这个有序树,100之前随便放,100后要进行替换的话只需要对比树的第一个节点就可以知道该不该放
*
*/
public class Demo1_tx {
public static void main(String[] args) {
top100();
}
private static void top100(){
TreeSet<Integer> tree = new TreeSet<Integer>();
int n = 100000000;
int[] arr = new int[n];
Random ran = new Random();
long start = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
arr[i] = ran.nextInt(n);
}
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < arr.length; i++) {
if (tree.size() < 100) {
tree.add(arr[i]);
} else if (tree.first() < arr[i]) {
tree.remove(tree.first());
tree.add(arr[i]);
}
}
System.out.println(System.currentTimeMillis() - start);
System.out.println(tree);
}
}
大数据量肯定要尽量的避免排序的,即使是部分也要避免,即能避免就不要排,所以堆和二叉树是最好的选择,内存开销其实不必担心,1亿个数字也没多少吧!
然后看了下TreeSet的first()方法的实现。
first()方法的实现如下:
final Entry<K,V> getFirstEntry() {
Entry<K,V> p = root;
if (p != null)
while (p.left != null)
p = p.left;
return p;
}
很明显,取的是最小值,但是它需要每次去找最小值,那个while的开销就完全不必要了,所以选择最小堆才是最明智的选择,人家只在改变节点后才去修改结构,而且取最小值只用取根节点就OK了,TreeSet里面的remove()方法啊也都是需要先查询的,所以这一比较根本没堆有优势(对于此题)。
private static void top100() {
// TreeSet<Integer> tree = new TreeSet<Integer>();
PriorityQueue<Integer> heap = new PriorityQueue<Integer>(100);
int n = 100000000;
int[] arr = new int[n];
Random ran = new Random();
long start = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
arr[i] = ran.nextInt(n);
}
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < arr.length; i++) {
if (heap.size() < 100) {
heap.add(arr[i]);
} else if (heap.peek() < arr[i]) {
heap.poll();
heap.add(arr[i]);
}
}
System.out.println(System.currentTimeMillis() - start);
System.out.println(heap);
}
改成最小堆后,经测试,最小堆花费1800毫秒左右的时间,TreeSet花费的时间大概3600毫秒,接近2倍的差距。
ps:JVM内存改大点,否则可能申请不到1亿的数组 -Xms128M -Xmx1024M
分享到:
相关推荐
2011年5月份参加腾讯校招的时候,一位工程师给的面试题。我觉得挺有意思的,拿出来,与君共勉
腾讯面试题解析,android面试题,2020年面试题,网络基础,常用三方库,算法基础等等的。腾讯面试题解析,android面试题,2020年面试题,网络基础,常用三方库,算法基础等等的
腾讯面试题 前端面试题 腾讯的前端面试题。
最新腾讯PHP面试题1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除不需要的对象。 PHP 使用了引用计数 (reference counting) GC 机制。 每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,...
一年之前的10月14日,一个名叫July (头像为手冢国光)的人在一个叫csdn的论坛上开帖分享微软等公司数据结构+算法面试100题,自此,与上千网友一起做,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之...
腾讯Java面试题
阿里面试20题 百度面试10题 华为面试10题 京东面试13题 腾讯面试37题 头条面试10题 项目经理面试常遇问题 经典面试题 程序员 IT经理 项目经理 面试题 研发经理 高级程序员 经典面试题
腾讯java面试题 2013年腾讯java笔记题,
ava工程师面试题大全-100%公司笔试题你都能碰到几个.docx Java开发工程师上机笔试题.docx Java开发求职面试题.docx Java开发笔试题.docx Java数据结构类面试题.docx Java数据结构题.docx Java笔试面试宝典.docx Java...
腾讯面试题及面试经历(技术工程师类), 应聘的技术支持类。
腾讯php面试题解析
10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题
整理了一下腾讯往届笔试面试题,希望对大家有帮助: 来源:腾讯笔试面试圈>> 1、史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库 2、2018腾讯秋招正式笔试题目 3、2018腾讯秋招前端正式试题 4、2018...
在这里汇总了腾讯历年的笔试面试题,希望对和我一样正在找工作的朋友一点帮助
网盘下载pdf文件,包括常见前端面试题汇总,百度、阿里、腾讯校招面试题汇总,网盘下载pdf文件,65个文件
海量面试题,含答案,带答案, 华为,百度,新浪,阿里巴巴,微软,microsoft,IBM,腾讯,中软,Google,网易,神州数码,新蛋,思科,Cisco 淘宝,奇虎,中国移动,东软,电信,大唐,联想,Oracle,甲骨文,英物尔,...
腾讯近年来笔试面试题合集 包括校园招聘与实习生招聘 主要是技术类
主要是华为 腾讯的面试题 和一些面试技巧
腾讯面试大礼包,面经、面试题等腾讯面试大礼包,面经、面试题等腾讯面试大礼包,面经、面试题等
腾讯面试题汇编.pdf