一道腾讯面试题:从大量数字中取出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
分享到:
相关推荐
腾讯面试题解析.pdf 本资源是一份详细的腾讯面试题解析文档,涵盖了 Android 面试题、网络基础、常用三方库、算法基础等多个方面的知识点。下面是对该文档的详细解析: 计算机基础面试题 在计算机基础面试题部分...
这道2011年腾讯校招的面试题虽然没有明确的问题描述,但从标签中我们可以推测,它可能涉及C++、.NET、Java这三种编程语言中的某一方面,或者是关于算法设计与分析。面试题通常旨在考察候选人的思维能力、编程基础...
《腾讯面试题与笔试题详解》 在求职的道路上,面试和笔试是必不可少的环节,尤其是对于技术人才来说,能够顺利通过大公司的面试更是彰显个人实力的重要标志。本压缩包包含两份珍贵的资料——“腾讯笔试题专辑(含...
最新腾讯PHP面试题1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除不需要的对象。 PHP 使用了引用计数 (reference counting) GC 机制。 每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,...
一年之前的10月14日,一个名叫July (头像为手冢国光)的人在一个叫csdn的论坛上开帖分享微软等公司数据结构+算法面试100题,自此,与上千网友一起做,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之...
阿里面试20题 百度面试10题 华为面试10题 京东面试13题 腾讯面试37题 头条面试10题 项目经理面试常遇问题 经典面试题 程序员 IT经理 项目经理 面试题 研发经理 高级程序员 经典面试题
ava工程师面试题大全-100%公司笔试题你都能碰到几个.docx Java开发工程师上机笔试题.docx Java开发求职面试题.docx Java开发笔试题.docx Java数据结构类面试题.docx Java数据结构题.docx Java笔试面试宝典.docx Java...
以下是一些具体的面试题及其解析: 1. 宏定义比较大小:`#define BIG_THAN(a, b) (((b) – (a)&(0x1))>>31)` 这个宏利用了二进制的位运算来比较两个数的大小。当a大于b时,b-a会产生负数,而负数的最高位(符号位)...
腾讯面试题中的选择题部分涉及到编程的基础知识,如运算符优先级、数据类型、指针、数组、函数参数传递、栈、二叉树等。对于面试者来说,这要求对这些基础知识有清晰的理解和掌握。 知识点六:C语言的Sizeof函数 ...
### 腾讯面试题笔试题解析 #### 领域背景 在IT行业中,面试题目不仅是对求职者技能的一种考验,也是企业筛选合适人才的重要工具。本篇将基于提供的标题、描述、部分问题及其答案,深入分析这些知识点,帮助读者更...
在腾讯的前端面试中,面试官可能会关注一系列关键知识点,这些知识点涵盖了前端开发的基础到进阶内容。以下是对这些知识点的详细解释: 1. **JSONP原理**:JSONP(JSON with Padding)是一种解决跨域数据获取的问题...
【腾讯Java面试题】 在Java领域,面试是评估求职者技术实力的重要环节,而腾讯作为中国互联网巨头之一,其Java面试题往往具有很高的参考价值。这些题目不仅涵盖基础语法、数据结构、算法、多线程、JVM优化等多个...
本资源“2022年最新(腾讯)前端面试题真题解析”汇聚了最新的腾讯前端面试题,旨在帮助求职者更好地准备面试,提升成功入职的可能性。 面试题的解析通常会涵盖以下几个关键领域: 1. **基础概念**:面试题会涉及...
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个文件
腾讯近年来笔试面试题合集 包括校园招聘与实习生招聘 主要是技术类
腾讯系统工程师面试题 腾讯系统工程师面试题 腾讯系统工程师面试题
面试题(华为/中兴/腾讯) 本资源总结了华为、中兴、腾讯等企业的常见面试题,涵盖了 Java 编程语言、 Servlet、JSP、SQL 语言、索引、事务、面向对象编程、Struts、Hibernate 等多个领域的知识点。 1. Java 试题 ...