博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试海量数据问题
阅读量:2173 次
发布时间:2019-05-01

本文共 1198 字,大约阅读时间需要 3 分钟。

    在面试百度的过程中,有两轮面试都问到了海量数据的问题,对于百度这种在平时业务中就要处理海量数据的公司,问海量数据的处理也情有可原,而且考查海量数据的问题也可以考查到应聘者分析和分解问题的能力。

1、面试官:在文件中每行存储一个32位的数字,文件大小有几百个G,如何找出其中前k大的数。

    这种问题是比较常规的海量数据的问题,在剑指offer书中也专门有提到这个问题(专门指出百度喜欢问海量数据问题  哈哈),海量数据中找前k大的数,可以使用最小堆来解决,具体如下:

  1. 选取前k个数构建最小堆,堆顶为当前k个数中最小的数

  2. 遍历所有的数字,如果数字比堆顶元素大,则删除堆顶元素,并将大的数字放入堆中

  3. 当遍历完所有的数字,堆中就是k个最大的数字

2、面试官:在文件中每行存储一个32位的数字,文件大小有几百个G,其中肯定会有很多的重复数字,如何找到中位数

    面试官说,这个问题不是为了考查海量数据,而是为了考查分解问题的能力,哈哈。

    中位数的概念就是n个数字中,如果从小到大排列,当n是奇数时,中间的数字是中位数,当n是偶数时,中间两个数字的平均是中位数。

    寻找中位数可以对数据进行排序,然后直接选中间的数字就可以,排序的时间复杂度是O(nlogn),但是对于海量数据来说,排序的代价难以承受,因此需要找其他的方法。排序中比较喜欢用快排,快排的思想是选取标兵,然后将数据以标兵为界,小于标兵的放左边,大于标兵的放右边,那换个思路,海量数据中,选取一个标兵,然后将小于他的数据放在一个文件中,大于他的数据放另一个文件中,同时对两个问题的数据量进行统计,如果两个文件中的数据量相同,那么这个标兵就是中位数,如果小的文件多,则在小文件中继续选取标兵,这个Partition的思想就可以通过二分解决海量数据中找中位数的问题。所以面试官说这是在考查分解问题的能力也没有问题。

3、面试官:换个简单些的问题,在文件中每行存储一个数字,位宽不确定,文件大小有几百个G,其中会有很多的重复数字,如何找到重复次数最多的数字

    嗯,简单些的问题,哈哈,我信。

    由上可知,海量数据不能全部拉到内存中进行排序,内存放不下,因此解决思路还是分解问题,将一个文件中的数分成两个或多个文件,如果文件还是大,继续分。

    这个问题可以用哈希的思想,如每行的数有一串单个0-9的数字组成,那么可以通过给每个数最后一位进行划分,最后一位为0的放一个文件,为1 的放一个文件,经过一轮,将一个大文件分解为十个小文件,如果十个小文件依旧比较大,则可以继续以倒数第二位进行划分,或者直接以后两位直接划分,可以分为100个文件。这个分解,最终会得到可以直接进行统计的小文件,统计每个小文件中重复次数最多的数字,多个小文件之间进行比较,最终可以得到重复次数最多的数字。

 

无论是paitition还是hash ,确实是在分解海量数据,考查分解问题的能力,无可厚非。

 

转载地址:http://sqhzb.baihongyu.com/

你可能感兴趣的文章
按时间轴简述九大卷积神经网络
查看>>
详解循环神经网络(Recurrent Neural Network)
查看>>
为什么要用交叉验证
查看>>
用学习曲线 learning curve 来判别过拟合问题
查看>>
用验证曲线 validation curve 选择超参数
查看>>
用 Grid Search 对 SVM 进行调参
查看>>
用 Pipeline 将训练集参数重复应用到测试集
查看>>
PCA 的数学原理和可视化效果
查看>>
机器学习中常用评估指标汇总
查看>>
什么是 ROC AUC
查看>>
Bagging 简述
查看>>
详解 Stacking 的 python 实现
查看>>
简述极大似然估计
查看>>
用线性判别分析 LDA 降维
查看>>
用 Doc2Vec 得到文档/段落/句子的向量表达
查看>>
使聊天机器人具有个性
查看>>
使聊天机器人的对话更有营养
查看>>
一个 tflearn 情感分析小例子
查看>>
attention 机制入门
查看>>
手把手用 IntelliJ IDEA 和 SBT 创建 scala 项目
查看>>