`
543089122
  • 浏览: 153795 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

关于:一道腾讯面试题:从大量数字中取出top100

阅读更多
一道腾讯面试题:从大量数字中取出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
1
1
分享到:
评论
1 楼 rain_liang 2011-10-15  
用类快速排序吧?

相关推荐

    腾讯面试题解析.pdf

    腾讯面试题解析.pdf 本资源是一份详细的腾讯面试题解析文档,涵盖了 Android 面试题、网络基础、常用三方库、算法基础等多个方面的知识点。下面是对该文档的详细解析: 计算机基础面试题 在计算机基础面试题部分...

    一道腾讯面试题

    这道2011年腾讯校招的面试题虽然没有明确的问题描述,但从标签中我们可以推测,它可能涉及C++、.NET、Java这三种编程语言中的某一方面,或者是关于算法设计与分析。面试题通常旨在考察候选人的思维能力、编程基础...

    腾讯面试题 + 笔试题(全)

    《腾讯面试题与笔试题详解》 在求职的道路上,面试和笔试是必不可少的环节,尤其是对于技术人才来说,能够顺利通过大公司的面试更是彰显个人实力的重要标志。本压缩包包含两份珍贵的资料——“腾讯笔试题专辑(含...

    腾讯PHP面试题_腾讯php面试题_

    最新腾讯PHP面试题1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除不需要的对象。 PHP 使用了引用计数 (reference counting) GC 机制。 每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,...

    微软腾讯百度阿里面试 100 题系列-共330题

    一年之前的10月14日,一个名叫July (头像为手冢国光)的人在一个叫csdn的论坛上开帖分享微软等公司数据结构+算法面试100题,自此,与上千网友一起做,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之...

    阿里面试题 腾讯面试题 百度面试题 华为面试题 京东面试题 头条面试题 经典面试题 程序员 IT经理 项目经理 面试题

    阿里面试20题 百度面试10题 华为面试10题 京东面试13题 腾讯面试37题 头条面试10题 项目经理面试常遇问题 经典面试题 程序员 IT经理 项目经理 面试题 研发经理 高级程序员 经典面试题

    互联网校招题库资料笔试面试真题具体面试问题回答技巧腾讯阿里培训资料.zip

    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))&gt;&gt;31)` 这个宏利用了二进制的位运算来比较两个数的大小。当a大于b时,b-a会产生负数,而负数的最高位(符号位)...

    腾讯面试题

    腾讯面试题中的选择题部分涉及到编程的基础知识,如运算符优先级、数据类型、指针、数组、函数参数传递、栈、二叉树等。对于面试者来说,这要求对这些基础知识有清晰的理解和掌握。 知识点六:C语言的Sizeof函数 ...

    腾讯面试题笔试题

    ### 腾讯面试题笔试题解析 #### 领域背景 在IT行业中,面试题目不仅是对求职者技能的一种考验,也是企业筛选合适人才的重要工具。本篇将基于提供的标题、描述、部分问题及其答案,深入分析这些知识点,帮助读者更...

    腾讯前端面试题

    在腾讯的前端面试中,面试官可能会关注一系列关键知识点,这些知识点涵盖了前端开发的基础到进阶内容。以下是对这些知识点的详细解释: 1. **JSONP原理**:JSONP(JSON with Padding)是一种解决跨域数据获取的问题...

    腾讯Java面试题

    【腾讯Java面试题】 在Java领域,面试是评估求职者技术实力的重要环节,而腾讯作为中国互联网巨头之一,其Java面试题往往具有很高的参考价值。这些题目不仅涵盖基础语法、数据结构、算法、多线程、JVM优化等多个...

    2022年最新(腾讯)前端面试题真题解析

    本资源“2022年最新(腾讯)前端面试题真题解析”汇聚了最新的腾讯前端面试题,旨在帮助求职者更好地准备面试,提升成功入职的可能性。 面试题的解析通常会涵盖以下几个关键领域: 1. **基础概念**:面试题会涉及...

    10道腾讯的Java面试题

    10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题

    腾讯往届笔试面试题大全

    整理了一下腾讯往届笔试面试题,希望对大家有帮助: 来源:腾讯笔试面试圈&gt;&gt; 1、史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库 2、2018腾讯秋招正式笔试题目 3、2018腾讯秋招前端正式试题 4、2018...

    前端面试题(包括百度阿里腾讯面试题).txt

    网盘下载pdf文件,包括常见前端面试题汇总,百度、阿里、腾讯校招面试题汇总,网盘下载pdf文件,65个文件

    腾讯笔试面试题

    腾讯近年来笔试面试题合集 包括校园招聘与实习生招聘 主要是技术类

    腾讯系统工程师面试题

    腾讯系统工程师面试题 腾讯系统工程师面试题 腾讯系统工程师面试题

    面试题(华为/中兴/腾讯)

    面试题(华为/中兴/腾讯) 本资源总结了华为、中兴、腾讯等企业的常见面试题,涵盖了 Java 编程语言、 Servlet、JSP、SQL 语言、索引、事务、面向对象编程、Struts、Hibernate 等多个领域的知识点。 1. Java 试题 ...

Global site tag (gtag.js) - Google Analytics