`
hikelee
  • 浏览: 8062 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一道腾讯面试题:从大量数字中取出 top 100

阅读更多

最近有同事去腾讯面试,其中一个排序算法题:从1亿个数字中取出最大的100个. 我感觉用位图排序是比较合适的.位图排序的特点是用内存空间换取CPU时间.代码如下:

 

import java.util.Random;

 

public class Top100 {

public static int[] getTop100(int[] inputArray) {

 

int maxValue = Integer.MIN_VALUE;

for (int i = 0; i < inputArray.length; ++i) {

if (maxValue < inputArray[i]) {

maxValue = inputArray[i];

}

}

byte[] bitmap = new byte[maxValue+1];

for (int i = 0; i < inputArray.length; ++i) {

int value=inputArray[i];

bitmap[value] = 1;

}

 

int[] result = new int[100];

int index = 0;

for (int i = maxValue; i >= 0 & index < 100; --i) {

if (bitmap[i] == 1) {

result[index++] = i;

}

}

return result;

}

 

public static void main(String[] args) {

int numberCount = 90000000;

int maxNumber = numberCount;

int inputArray[] = new int[numberCount];

Random random = new Random();

for (int i = 0; i < numberCount; ++i) {

inputArray[i] = Math.abs(random.nextInt(maxNumber));

}

System.out.println("Sort begin...");

long current = System.currentTimeMillis();

int[] result = Top100.getTop100(inputArray);

System.out.println(System.currentTimeMillis() - current);

for (int i = 0; i < result.length; ++i) {

System.out.print(result[i] + ",");

}

}

}

 

我的机子是配置是CPU:Intel(R) Pentium(R) M processor 1.60GHZ,512M内存. 运行结果如下

1千万:1.297秒

2千万: 2.906秒

3千万:4.578秒

4千万:6.203秒

5千万:7.875秒

6千万:9.953秒

7千万:11.407秒

8千万:26.921秒

9千万:31.953秒

 

当运行到1亿数据时,机子几乎就没有反应了,这可能是物理内存已经耗尽,用虚拟内存了.

 

欢迎交流!

分享到:
评论
19 楼 docong 2010-03-31  
luke_kai 写道
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;

public class TestSF {

public static Set<Integer> getTop100(int[] inputArray) {

TreeSet<Integer> top100 = new TreeSet();
for (int i = 0; i < inputArray.length; i++) {

if (top100.size()<100){
top100.add(inputArray[i]);
}else if ((Integer)top100.first()<inputArray[i]){
Object obj = top100.first();
top100.remove(obj);
top100.add(inputArray[i]);
}

}

return top100;

}

public static void main(String[] args) {

int numberCount = 100000000;

int maxNumber = numberCount;

int inputArray[] = new int[numberCount];

Random random = new Random();

for (int i = 0; i < numberCount; ++i) {

inputArray[i] = Math.abs(random.nextInt(maxNumber));

}

System.out.println("Sort begin...");

long current = System.currentTimeMillis();

Set<Integer> result = TestSF.getTop100(inputArray);

System.out.println("Spend time:"+(System.currentTimeMillis() - current));


}

}

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at TestSF.main(TestSF.java:32)
18 楼 luke_kai 2010-03-31  
不可能吧,我写的那段程序,亿级的数据花销 2.3秒
Spend time:2375
17 楼 flashjay 2010-03-31  
SELECT TOP 100 * FROM table1 ORDER BY value DESC;
16 楼 wjjxf 2010-03-31  
如果这个maxValue 达到2147483648或者数字为long更大,那这个位图数组也很大,不过在最大数不大的情况下,这样算也可以
15 楼 icyiwh 2010-03-31  
  题目没说要排序, 只是说明提取前100个, 那把1亿条数据拆分成n等分, 然后多线程跑每一等分的前100个就行了. 这样的时间复杂度是o(n)<=n, 否则不管用什么样的其它方式其复杂度都应该>n*log_n
14 楼 提烟而过 2010-03-31  
呵呵,先感谢楼主的分享。我个人的意见是:效率快慢首先取决与你数据的存取方式:线性存取(表、栈、队列、串、数组和文件)或是非线性存取(树和图)肯定不一样。其次不同的数据存取方式对不同的排序算法复杂度也不是一样的。我以前上大学好像做过这方面的测试。时间久了忘了,等忙完这个项目一定抽时间再去试下。
13 楼 robin_hood 2010-03-31  
感觉需要很大的内存吧
12 楼 seraphim871211 2010-03-31  
MicahChen 写道
fengshihao 写道
fffvvvzz 写道
你把问题想复杂化了,单次循环,top100用红黑树,如果树大小小于100直接插入,否则比较树中最小值,大于则移去最小值,插入新值。


严重同意  呵呵 . 大顶堆 而已 .


哈哈,最大堆正解,头100个节点不断构造就可以了


按照题目来说应该使用大小为100的最小堆。其他多线程、分开合并纯属多余。LZ的方式比较耗内存,性能也不怎么好。
11 楼 蔡华江 2010-03-31  
用treeset在千万级的测试要21秒,,亿级别的没测出来 ,不愿等了
10 楼 fffvvvzz 2010-03-31  
aoliwen521 写道
fffvvvzz 写道
你把问题想复杂化了,单次循环,top100用红黑树,如果树大小小于100直接插入,否则比较树中最小值,大于则移去最小值,插入新值。

请问,用java实现,也就是一个treeset就可以了吗?


我不太熟悉java,如果treeset是有序树的话,那就没问题
9 楼 luke_kai 2010-03-31  
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;

public class TestSF {

public static Set<Integer> getTop100(int[] inputArray) {

TreeSet<Integer> top100 = new TreeSet();
for (int i = 0; i < inputArray.length; i++) {

if (top100.size()<100){
top100.add(inputArray[i]);
}else if ((Integer)top100.first()<inputArray[i]){
Object obj = top100.first();
top100.remove(obj);
top100.add(inputArray[i]);
}

}

return top100;

}

public static void main(String[] args) {

int numberCount = 100000000;

int maxNumber = numberCount;

int inputArray[] = new int[numberCount];

Random random = new Random();

for (int i = 0; i < numberCount; ++i) {

inputArray[i] = Math.abs(random.nextInt(maxNumber));

}

System.out.println("Sort begin...");

long current = System.currentTimeMillis();

Set<Integer> result = TestSF.getTop100(inputArray);

System.out.println("Spend time:"+(System.currentTimeMillis() - current));


}

}
8 楼 jianghengwei 2010-03-31  
1亿的数据, 我建议用1亿的数据进行分割, 分割成10万*1000次;
10万条数据排序一次,取前最大的100条数据,放到缓存中,总共要进行1001次就可以了。
如果要考虑性能的问题, 我们可以用多线程进行排序。
7 楼 JE帐号 2010-03-31  
1.原理上讲就是一个长度为100的有序结构快速插入的问题.
2.不过放这么大的源数据,是否还有什么特别需要,是否有人知道?比如可以分成10个任务给10个CPU分别求top100,再合并之类的.
6 楼 nishizhutoua 2010-03-31  
1.有负数么?
2.数重复么?
5 楼 aoliwen521 2010-03-31  
fffvvvzz 写道
你把问题想复杂化了,单次循环,top100用红黑树,如果树大小小于100直接插入,否则比较树中最小值,大于则移去最小值,插入新值。

请问,用java实现,也就是一个treeset就可以了吗?
4 楼 MicahChen 2010-03-31  
fengshihao 写道
fffvvvzz 写道
你把问题想复杂化了,单次循环,top100用红黑树,如果树大小小于100直接插入,否则比较树中最小值,大于则移去最小值,插入新值。


严重同意  呵呵 . 大顶堆 而已 .


哈哈,最大堆正解,头100个节点不断构造就可以了
3 楼 J-catTeam 2010-03-31  
<div class="quote_title">hikelee 写道</div>
<div class="quote_div">
<p> </p>
<p>最近有同事去腾讯面试,其中一个排序算法题:从1亿个数字中取出最大的100个. 我感觉用位图排序是比较合适的.位图排序的特点是用内存空间换取CPU时间.代码如下:</p>
<p> </p>
<p>import java.util.Random;</p>
<p> </p>
<p>public class Top100 {</p>
<p>public static int[] getTop100(int[] inputArray) {</p>
<p> </p>
<p>int maxValue = Integer.MIN_VALUE;</p>
<p>for (int i = 0; i &lt; inputArray.length; ++i) {</p>
<p>if (maxValue &lt; inputArray[i]) {</p>
<p>maxValue = inputArray[i];</p>
<p>}</p>
<p>}</p>
<p>byte[] bitmap = new byte[maxValue+1];</p>
<p>for (int i = 0; i &lt; inputArray.length; ++i) {</p>
<p>int value=inputArray[i];</p>
<p>bitmap[value] = 1;</p>
<p>}</p>
<p> </p>
<p>int[] result = new int[100];</p>
<p>int index = 0;</p>
<p>for (int i = maxValue; i &gt;= 0 &amp; index &lt; 100; --i) {</p>
<p>if (bitmap[i] == 1) {</p>
<p>result[index++] = i;</p>
<p>}</p>
<p>}</p>
<p>return result;</p>
<p>}</p>
<p> </p>
<p>public static void main(String[] args) {</p>
<p>int numberCount = 90000000;</p>
<p>int maxNumber = numberCount;</p>
<p>int inputArray[] = new int[numberCount];</p>
<p>Random random = new Random();</p>
<p>for (int i = 0; i &lt; numberCount; ++i) {</p>
<p>inputArray[i] = Math.abs(random.nextInt(maxNumber));</p>
<p>}</p>
<p>System.out.println("Sort begin...");</p>
<p>long current = System.currentTimeMillis();</p>
<p>int[] result = Top100.getTop100(inputArray);</p>
<p>System.out.println(System.currentTimeMillis() - current);</p>
<p>for (int i = 0; i &lt; result.length; ++i) {</p>
<p>System.out.print(result[i] + ",");</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p> </p>
<p>我的机子是配置是CPU:Intel(R) Pentium(R) M processor 1.60GHZ,512M内存. 运行结果如下</p>
<p>1千万:1.297秒</p>
<p>2千万:<span style="white-space: pre;"> </span>2.906秒</p>
<p>3千万:4.578秒</p>
<p>4千万:6.203秒</p>
<p>5千万:7.875秒</p>
<p>6千万:9.953秒</p>
<p>7千万:11.407秒</p>
<p>8千万:26.921秒</p>
<p>9千万:31.953秒</p>
<p> </p>
<p>当运行到1亿数据时,机子几乎就没有反应了,这可能是物理内存已经耗尽,用虚拟内存了.</p>
<p> </p>
<p>欢迎交流!</p>
<p> </p>
<p> </p>
<p>100*100000000</p>
</div>
<p> </p>
2 楼 fengshihao 2010-03-31  
fffvvvzz 写道
你把问题想复杂化了,单次循环,top100用红黑树,如果树大小小于100直接插入,否则比较树中最小值,大于则移去最小值,插入新值。


严重同意  呵呵 . 大顶堆 而已 .
1 楼 fffvvvzz 2010-03-31  
你把问题想复杂化了,单次循环,top100用红黑树,如果树大小小于100直接插入,否则比较树中最小值,大于则移去最小值,插入新值。

相关推荐

    一道腾讯面试题

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

    腾讯面试题解析.pdf

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

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

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

    腾讯研究院:PDF 腾讯数字生活报告

    腾讯研究院:PDF 腾讯数字生活报告

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

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

    2021最新大厂AI面试题:107题(含答案及解析).pdf

    腾讯的面试题则关注了SVM的优化函数公式、随机森林的原理、XGBoost的优势等。SVM的优化函数是二次规划问题,随机森林通过构建多棵决策树来提高模型的鲁棒性。 蔚来和虾皮的面试题则包含了链表问题、二叉树遍历和数...

    最快的排序算法 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹(详解)?,排序算法数据结构

    在腾讯算法面试题中,要求选出64匹马中最快的四匹,需要使用排序算法来解决这个问题。排序算法是计算机科学中的一种算法,用于对一组数据按照特定的顺序进行排序。排序算法的应用场景非常广泛,在数据分析、机器学习...

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

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

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

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

    腾讯历年面试试题汇总

    以下是一些具体的面试题及其解析: 1. 宏定义比较大小:`#define BIG_THAN(a, b) (((b) – (a)&(0x1))&gt;&gt;31)` 这个宏利用了二进制的位运算来比较两个数的大小。当a大于b时,b-a会产生负数,而负数的最高位(符号位)...

    腾讯面试题笔试题

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

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

    ava工程师面试题大全-100%公司笔试题你都能碰到几个.docx Java开发工程师上机笔试题.docx Java开发求职面试题.docx Java开发笔试题.docx Java数据结构类面试题.docx Java数据结构题.docx Java笔试面试宝典.docx Java...

    腾讯前端面试题

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

    腾讯09年测试面试题(亲身经历)

    【腾讯09年测试面试题解析】 面试题1:QQ登陆号码边界值测试有哪些 边界值测试是一种重要的软件测试方法,主要针对输入或输出范围的边界条件进行测试。对于QQ登录号码,边界值可能包括最小值(如0,因为QQ号通常从0...

    腾讯Java面试题

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

    腾讯研究院:2019腾讯数字生活报告-2019.5-48页.pdf

    腾讯研究院发布的《2019腾讯数字生活报告》深入分析了数字技术在人们日常生活中的渗透和应用,揭示了它们是如何满足人类的生存、关系以及发展需求,并进一步塑造个人生活路径的。报告基于马斯洛的需求层次理论,将...

    腾讯:中小企业数字化转型路径报告.pdf

    报告“腾讯:中小企业数字化转型路径报告”探讨了在全球新冠疫情背景下,数字化转型对于中小企业的重要性,以及中国在此过程中的挑战和机遇。数字化转型不仅是企业适应新环境的必然选择,也是国家经济发展的重要推动...

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

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

    10道腾讯的Java面试题

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

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

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

Global site tag (gtag.js) - Google Analytics