大神求解(2n+3)!,麻烦写下详细过程,谢谢了。

第一轮面试电话(5 月 月 6  号):
并將它们分发到各个 TaskTracker 服务中去执行
并监控它们如果发现有失败的 task 就重新运行它。一般情况应该把 JobTracker 部署在单独的机器上
责直接执行每一个任务。
NameNode 根据文件大小和文件块配置情况返回给 Client 它所管理部分 DataNode 的信息。
HDFS 体系结构简介及优缺点
当然 NameNode 有个 http 页面也可以查询但是这个命令的輸出更适合我们的脚本监控 dfs 的使用状况
添加了一个新的标识符 ClusterID 用于标识集群中所有的节点。当格式化一个 Namenode需要提供这个标
识符或者自动苼成。这个 ID 可以被用来格式化加入集群的其他 Namenode
有的同学问题的重点不是上面分析内容:内容如下:
以上答案通过多个资料验证,对于资料不充分的内容都标有‖个人观点―,给出本测试题抱着谨慎的态度
上面只是选择与判断,可以看另外一套实战面试实战面试题
程序員找不到开发工作的 6  大原因
在这个信息畅通的时代我们有时候面试,不止是你当时面试的情况同样面试时的表现虽然暂居了大部
分,泹是一些额外的信息可能会决定你面试的成功与失败。
面试更多的是一种修炼与思考一个人的框架、思想决定了你面试的内容,不同囚面试官会问不同的内
s 遍历文件 b,采取和 a 相同的方式将 url 分别存储到 1000 各小文件(记为 )这样处理后,所有可
能相同的 url 都在对应的小文件( )中不对应的小文件不可能有相同的 url。然后我们只要求出 1000 对
小文件中相同的 url 即可
s 求每对小文件中相同的 url 时,可以把其中一个小文件嘚 url 存储到 hash_set 中然后遍历另一个
小文件的每个 url,看其是否在刚才构建的 hash_set 中如果是,那么就是共同的 url存到文件里面就可
方案 2:内存映射成 BIT 朂小存储单元。
如果允许有一定的错误率可以使用 Bloom filter,4G 内存大概可以表示 340 亿 bit将其中一个文件
如果是,那么该 url 应该是共同的 url(注意会有一萣的错误率)
样新生成的文件每个的大小大约也 1G(假设 hash 函数是随机的)。
次数利用快速/堆/归并排序按照出现次数进行排序。将排序好嘚 query 和对应的 query_cout 输出到文件
中这样得到了 10 个排好序的文件(记为 )。
s 对 这 10 个文件进行归并排序(内排序与外排序相结合)
一般 query 的总量是有限的,只是重复的次数比较多而已可能对于所有的 query,一次性就可以加
入到内存了这样,我们就可以采用 trie 树/hash_map 等直接来统计每个 query 出现的次數然后按出现
次数做快速/堆/归并排序就可以了。
与方案 1 类似但在做完 hash,分成多个文件后可以交给多个文件来处理,采用分布式的架構来处
理(比如 MapReduce)最后再进行合并。
//一般在大文件中找出出现频率高的先把大文件映射成小文件,模 1000在小文件中找到高频的。
是 32 位嘚最多有 个 IP。同样可以采用映射的方法比如模 1000,把整个大文件映射为 1000 个小文件
再找出每个小文中出现频率最大的 IP(可以采用 hash_map 进行频率统计,然后再找出频率最大的几个)
及相应的频率然后再在这 1000 个最大的 IP 中,找出那个频率最大的 IP即为所求。
用最小堆)比如求 TOP10 大,我们首先取前 10 个元素调整成最小堆如果发现,然后扫描后面的数据
并与堆顶元素比较,如果比堆顶元素大那么用该元素替换堆顶,然后再调整为最小堆最后堆中的元 素
s 求出每台电脑上的 TOP10 后,然后把这 100 台电脑上的 TOP10 组合起来共 1000 个数据,再利用
上面类似的方法求出 TOP10 就鈳以了
方案 1:这题用 trie 树比较合适,hash_map 也应该能行
方案 1:在前面的题中,我们已经提到了用一个含 100 个元素的最小堆完成。复杂度为
方案 2:采用快速排序的思想每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比 100
多的时候采用传统排序算法排序,取前 100 个复雜度为 O(100w*100)。
方案 3:采用局部淘汰法选取前 100 个元素,并排序记为序列 L。然后一次扫描剩余的元素 x与
排好序的 100 个元素 中最小的元素比,如果比这个最小的要大那么把这个最小的元素删除,并把 x 利用
插入排序的思想插入到序列 L 中。依次循环知道扫描了所有的元素。复杂喥 为 O(100w*100)
(2) 请给出主要的处理流程,算法以及算法的复杂度。
方案 1:采用 trie 树关键字域存该查询串出现的次数,没有出现为 0最后用 10 个元素嘚最小推来
方案 2:先对每台机器上的数进行排序。排好序后我们采用归并排序的思想,将这 N 个机器上的数
归并起来得到最终的排序找箌第 个便是所求。复杂度是 的
s 最大间隙:除最大最小数据 max 和 min 以外的 n-2 个数据放入 n-1 个桶中,由抽屉原理可知至少有
一个桶是空的又因为每個桶的大小相同,所以最大间隙 不会在同一桶中出现一定是某个桶的上界和气
候某个桶的下界之间隙,且该量筒之间的桶(即便好在该連个便好之间的桶)一定是空桶也就是说,最
大间隙在桶 i 的上界和桶 j 的下界之间产生 一遍扫描即可完成。
在的并查集合并然后再看 bbb 囷 ccc 是否在同一个并查集中,如果不在那么也 把它们所在的并查集合
并。接下来再扫描其他的集合当所有的集合都扫描完了,并查集代表的集合便是所求复杂度应该是
O(NlgN)的。改进的话首先可 以记录每个节点的根结点,改进查询合并的时候,可以把大的和小的进
行合這样也减少复杂度。
C LSM 并不区分读和写
D LSM 中读写是同一种操作
由于我面的是 Java 开发但当时负责人员给我安排了一个 C++面试官(在面试官桌子上放著一个―C++方
向‖的牌子),然后我就跟负责人说―我是面 Java 方向的不是 C++方向的‖,结果那个面试官笑呵呵的说―没
关系在我这面一样的,如果你不懂 C++我可以不问你 C++语言方面的细节问题‖,当时我心里想:虽
然我 C++学的和 Java 差不多就算面 C++也没有问题。但是既然面试官这么说叻肯定不问 C++了,Java
估计也不会问(C++方向的工程师不一定懂 Java 呢)应该是问数据结构、算法、网络、操作系统方面的
问题了。虽然都有所准備面起来也可以,但是鉴于两个方面的原因我还是没答应在这面。
(1)据说阿里 90%都是招 Java 工程师如果在这面后面肯定会以为我是面 C++的,胜算就少了;
(2)我这几个月基本上都在专研 Java 方向的知识也研究了不少 JDK 源码和 Java 相关的项目,感觉自己
的 Java 方向知识有了一个质的提高洇此希望面试官能够考查和检验我这方面的知识。
因此我当时跟那个面试官说―不好意思我还是希望能面 Java 方向的知识‖,那个面试官依舊笑呵呵―如果你
对 Java 知识的确非常自信那么可以给你换个 Java 方向的面试官‖,然后我只能说―是的我有研究过很
多 JDK 源码,也做了不少 Java 项目‖最后,我出去找负责人给我安排 Java 方向的面试官负责人说―那
你要等会儿才行,估计要半个小时‖―哦,没关系那我等会吧‖,心里想:等不怕方向搞错了才要命。
说上面这段插曲的目的是想告诫大家如果你有比较明确的方向,比如―我以后一定要做 C++/Java 方向的
開发‖那么一定要强调出来。如果像阿里这样每个面试官都有个方向牌那很容易搞定如果没有则可以在
面试一开始的自我介绍或找其咜机会说出来让面试官知道,可能有人认为语言不重要关键是算法、数据
结构、操作系统云云……是的,很多面试官都跟我说过:在以後的工作过程中语言不重要,重要的是你以
后做的东西是不是你感兴趣的但是我认为语言在面试过程中是有非常大的关系的,如果你昰 C++方向
那么面试官可能会问你一些虚函数机制、Linux 下的内存分配策略、内存管理、常用系统调用等这方面的知
识;如果你主攻 Java,可能会问集合类区别、可研究过 jdk 源码、数据库等方面的知识
因此面试的第一步就是让面试官明确知道你主攻的语言方向(可能也有较好的面试官會在提问之前首先问
你懂 Java 还是 C++),如果你两个方向都非常懂并且没有比较偏爱的方向那就无所谓了。
半个小时没到终于给我安排了个 Java 方向的面试官,这次交流非常愉快下面的―面‖代表面试官。
面: 请简单自我介绍下
我: 我是 XX 大学计算机专业的一名 XX,我研究生期间嘚方向是 XX……(方向简单描述)。12 年暑期在
XX 公司实习了 4 个月做的是 XX(在一所不知名的本地小公司实习过)……(其它重要项目的简述)。另
外自己是名开源积极分子,有自己的 Github而且今年暑期参加了 CSDN 举办的开源夏令营活动,做的
阶段总结:上面只是我自己当时的一个簡单自我介绍经验不足讲的比较乱,而且忘了讲自己十分热衷技
术平时喜欢写技术博客等事情(有些情况下可以加分呢)。建议大家嘟定制好自己的版本讲出自己的亮
第二阶段:介绍研究生期间的论文项目,针对介绍提出几个相关的技术问题
面: 好我看下简历。(嘫后对着我的简历看了十几秒指着我的第一个项目)这是你刚说的研究生的论
文项目吧(我嗯),那你把这个项目详细说下
我: 我从項目的选题(为啥要做这个方向)、项目采用的技术、新颖的地方、最终达到的效果(由于我做
的是某个算法的性能提高,那么我就会讲速度提高了多少空间压缩了多少?)这几个方面详细介绍了自
下面就是针对我的叙述具体问了几个技术相关点这没什么好说的,因为烸个人做的项目不一样问的东
阶段总结:其实要求讲的这个项目是用 C++写的而不是 Java,不过没关系对于项目而言,语言就不是很
重要了關键是项目的架构、所采用的技术、能达到什么样的效果。面试官选的项目一般要么是简历中项
目经验的第一个、要么是有他感兴趣的、偠么项目做的时间比较长的因此建议在写简历时,把你认为最
有把握的项目放在第一位(而不是传说中的要按时间倒序来写项目经验)没太大把握的不要写(被抽问到
就惨了)。只要你真真正正的吃透了被抽到的项目那么这个项目提问阶段是完全 easy 的。
面: 你 Java 学的怎么樣
自己很欣赏 Java 巧妙的垃圾回收机制,看过周志明的《深入理解 Java 虚拟机》因此对 JVM 相关的知识
面: 嗯,学的挺深的那你把 JVM 的结构和类加載原理说下。
我: 马上拿起桌上的笔和纸把虚拟机运行时包含的几个数据区和执行引擎画了下,包括方法区、虚拟机
栈、本地方法栈、堆和程序计数器然后介绍每个区域有什么作用,最后讲 ClassLoader 的类加载机制
还顺便说了下双亲委派机制。
面: (面试官点头表示满意)你刚剛说 Java 的 GC 机制很巧妙那么它的巧妙之处在哪里?
我: 我从两个方面说下自己的理解:一是 Java 的内存分配原理与 C/C++不同C/C++每次采用 malloc
或 new 申请内存时嘟要进行 brk 和 mmap 等系统调用,而系统调用发生在内核空间每次都要中断进行切
换,这需要一定的开销而 Java 虚拟机是先一次性分配一块较大的涳间,然后每次 new 时都在该空间上
进行分配和释放减少了系统调用的次数,节省了一定的开销这有点类似于内存池的概念;二是有了这
塊空间过后,如何进行分配和回收就跟 GC 机制有关了然后我详细介绍了 GC 原理、画图表示年轻代(Eden
区和 Survival 区)、年老代、比例分配及为啥要这樣分代回收(我认为巧妙就在于这里),有了 GC 基本结
构后我又详述了下 GC 是具体如何进行内存分配和垃圾回收的。
面: (面试官一直点头表示对我回答的赞同)嗯看来你对这块的确掌握了,对了你说你参加的 CSDN
开源夏令营项目是阿里的是吧(我点头),这个夏令营是什么凊况
我: 我简单介绍了 CSDN 举办此次夏令营的目的,顺便说道此次夏令营活动当初有 2000 多人报名参加
最终只筛选出 60 多名,自己凭着开题报告囷对开源的热爱赢得了导师的青睐得以入选
面: 哦,他啊我认识呢,他是……(后面就简单闲聊了几句该阶段结束,面试官让等会兒准备二面)
阶段总结:上面的对话有人看了过后可能会说:好简单啊问的题目都是你会的,当然能过啦是的,其
实这是有技巧在里媔的就是要想办法―先下手为强‖,啥意思即让自己成为主动摊牌者而不是被动回答
者,找机会跟面试官说自己熟练掌握了哪些方面嘚知识、自己喜欢专研什么等等就像上面我所做的,一
开始摊牌说明自己掌握的知识处在哪些地方引导面试官去问你想让他问的知识點,这样达到双赢的目的
(你爽了面试官也轻松了,因为他不用老是猜你可能知道哪些东西然后试探性的问你这个会吗那个了解
一面很輕松的就过了但是二面就相对而言有些吃力,问的完全是项目相关而且不是我最熟的研究生期
间的论文项目,而是另外两个项目由於复习不到位,某些地方回答的不完善
第一阶段:自我介绍,同上第二阶段:介绍面试官感兴趣的两个项目, 一个与推荐系统相关另一個与 Java
面: 介绍下你简历上的这个电影个性化推荐引擎,使用的是哪种推荐算法
我: 改进的基于用户的协同过滤推荐算法。
面: 那好那伱从项目的基本架构、所使用的算法原理、如何改进的、数据如何处理这几个方面介绍下你
我: 我首先画了下项目的架构图,据此图详细講了下 UserCF 的原理及如何使用用户的社交数据和六维理
论改进传统的 UserCF并写出了改进后的算法公式。然后又说这个项目的数据多大代码中采鼡什么数据
面: (介绍原理中提到了利用用户相似性来作为推荐的一个参考,面试官追问)那用户的相似性你怎么算
我: (汗这个有个計算公式,我不太记得了最后根据自己的理解讲了下余弦相似性的计算方式,公式
没写全面试官问公式里的根号怎么算的,我说直接鼡 Java 的库函数)
面: 你这数据哪来的有几类数据?数据的存储格式是什么
我: (该项目时间有点久了,前几天只复习了项目的整体架构囷算法原理忘了看具体的数据了,这里只
能凭自己的记忆讲了下数据的存储格式回来后发现自己讲的虽然没错但不够具体)
附:该电影个性化推荐引擎我早已经放到了自己的 Github 上面,是自己在老师的指导下做的纯算法,还
介绍完了这个项目马上面试官又看中了另一个 Java web 楿关的项目,马上追问
面: 嗯,你这个 XX 系统是用 ssh2 框架做的那你对这个框架熟吗?
我: 嗯当时在公司实习时对 ssh 的掌握程度只是会使用級别,那时候没时间去研究框架背后的原理后
来有闲暇时间后,我就深入研究了下这几个框架的原理还看了部分 spring 的源码,学到了不少知识
面: 嗯,那你把这三个框架都介绍下
iBATIS的对比,顺便说了下现在似乎大家更倾向于使用iBATIS、myBATIS这样更加灵活的轻量级框架struts
讲了下它的莋用就是―将请求与视图分开‖,然后讲述从输入 url 到使用 struts 处理的控制流程(struts 从
tomcat 那接管、action 处理)然后也说 struts 现在似乎也不那么倾向于使用因為它有漏洞。最后重点讲
了下重头戏 Spring详细讲述了它解耦的功能、AOP 原理及自己有利用动态代理简单模拟实现过一个简单
Spring 却贯穿所有于所有層(表示层、业务层、持久层),Spring 也有自己的 MVC 模块、web 模块及 JDBC
和 DAO 模块只是很少使用,也就是只用一个 Spring 也是完全可以的
面: (点头表示肯萣)你刚说到 struts 有漏洞,那么 Hibernate 是安全的吗有没有可能发生 xss 攻击和
我: (汗,这个问题真心没想过对 Hibernate 的掌握没有 Spring 那么深,只能硬着头皮按洎己的理解回
答)这个问题没想过不过我觉得框架没有绝对的安全,Hibernate 是用来操作数据库的hql 语句里也有
select、where 判断,应该有可能发生 sql 注入攻擊xss 攻击就不太清楚了。(这个回答太糟了)
面试官没说啥一直在电脑上写着什么东西。这时候旁边的 HR 终于发话了
HR: 你本科是哪的?為什么选择考研
我: 开始说出我的―发家史‖,从一所不知名的小二本考到了中科大……
HR: 那你技术上是怎么学习的?
我: 又从本科說起本科技术很差,到了研究生期间才真正开始技术上的修炼……balabala
HR: 你的职业规划是什么?
我: ……(每个人的想法不一样)
HR: 你最夶的优势是什么
我: (自己吹吧,也要根据实际情况看)
阶段总结:再次说明项目的重要性第一个项目有些记忆模糊,答的有瑕疵這里要引以为戒(一定要对
项目知根知底),第二个项目感觉答的还可以不过 Hibernate 安全问题没答出来,我觉得只要你其它问题
答的很好有個别问题答不出来是不会影响最终的 offer 的。HR 面也很重要你得说通了,需要提前考虑
自由发挥阶段可以问问公司内部的培养计划、晋升机淛、是否经常有大牛分享技术让我们学习等等……
及而被广为流传的, 简单的一句话解释 MapReduce 就是―任务的分解与结果的汇总‖HDFS 是 Hadoop 分
MapReduce 从它名芓上来看就大致可以看出个缘由,两个动词 Map 和 Reduce―Map(展开)‖就是将一
个任务分解成为多个任 务,―Reduce‖就是将分解后多任务处理的结果汇總起来得出最后的分析结果。这
不是什么新思想其实在前面提到的多线程,多任务的设计就可以找到这 种思想的影子不论是现实社會,
还是在程序设计中一项工作往往可以被拆分成为多个任务,任务之间的关系可以分为两种:一种是不相
关的任务可以并行执 行;叧一种是任务之间有相互的依赖,先后顺序不能够颠倒这类任务是无法并行
处理的。回到大学时期教授上课时让大家去分析关键路径,无非就是找最省时的 任务分解执行方式在
分布式系统中,机器集群就可以看作硬件资源池将并行的任务拆分,然后交由每一个空闲機器资源去处
理能够极大地提高计算效率,同时 这种资源无关性对于计算集群的扩展无疑提供了最好的设计保证。
(其实我一直认为 Hadoop 嘚卡通图标不应该是一个小象应该是蚂蚁,分布式计算就好比 蚂蚁吃大象
廉价的机器群可以匹敌任何高性能的计算机,纵向扩展的曲線始终敌不过横向扩展的斜线)任务分解处理
以后,那就需要将处理以后的结果再汇总起 来这就是 Reduce 要做的工作。
Hadoop 中的 MapReduce 是一个使用简易嘚软件框架基于它写出来的应用程序能够运行在由上千个商用
机器组成的大型集群上,并以一种可靠容错的式并 行处理上 T 级别的数据集
一个 MapReduce 作业(job)通常会把输入的数据集切分为若干独立的数据块,由 map 任务(task)以完
全并行的方式处理它们框架会对 map 的输出先进行排序,嘫后把结果输入给 reduce 任务通常作业的
输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控以及重新执行已经失败的任務。
通常MapReduce 框架和分布式文件系统是运行在一组相同的节点上的,也就是说计算节点和存储节点
通常在一起。这种配置允许框架在那些巳经存好数据的节点上高效地调度任务这可以使整个集群的网络
带宽被非常高效地利用。
负责调度构成一个作业的所有任务这些任务汾布在不同的 slave 上,master 监控它们的执行重新执行
已经失败的任务。而 slave 仅负责执行由 master 指派的任务
每个磁盘都有默认的数据块大小,这是磁盘进行讀写的基本单位.构建于单个磁盘之上的文件系统通过磁盘
块来管理该文件系统中的块.该文件系统中的块一般为磁盘块的整数倍.磁盘块一般為 512 字节.HDFS 也有
块的概念,默认为64MB(一个map处理的数据大小).HDFS上的文件也被划分为块大小的多个分块,与其他文
件系统不同的是,HDFS 中小于一个块大小的文件鈈会占据整个块的空间.
HDFS 用块存储带来的第一个明显的好处一个文件的大小可以大于网络中任意一个磁盘的容量,数据块可以
利用磁盘中任意┅个磁盘进行存储.第二个简化了系统的设计,将控制单元设置为块,可简化存储管理,计算
单个磁盘能存储多少块就相对容易.同时也消除了对元數据的顾虑,如权限信息,可以由其他系统单独管理.
DataNode 是 HDFS 文件系统的工作节点,它们根据需要存储并检索数据块,受 NameNode 节点调度.并且定
期向 NameNode 发送它们所存储的块的列表
NameNode 管理 HDFS 文件系统的命名空间,它维护着文件系统树及整棵树的所有的文件及目录.这些文件
以两个文件形式永久保存在本地磁盘仩(命名空间镜像文件和编辑日志文件).NameNode 记录着每个文件中
各个块所在的数据节点信息但并不永久保存这些块的位置信息,因为这些信息在系统啟动时由数据节点重
没有 NameNode,文件系统将无法使用.如提供 NameNode 服务的机器损坏,文件系统上的所有文件丢失,我
们就不能根据DataNode的块来重建文件.因此,对NameNode的嫆错非常重要.第一种机制,备份那些组成文
件系统元数据持久状态的文件.通过配置使 NameNode 在多个文件系统上保存元数据的持久状态或将数据
写入夲地磁盘的同时,写入一个远程挂载的网络文件系统.当然这些操作都是原子操作.第二种机制是运行一
个辅助的 NameNode,它会保存合并后的命名空间镜潒的副本,并在 Name/Node 发生故障时启用.但是辅助
NameNode 保存.态总是滞后于主力节点,所以在主节点全部失效后难免丢失数据.在这种情况下,一般把存
储在远程掛载的网络文件系统的数据复制到辅助 NameNode 并作为新的主 NameNode 运行
比如:现在有 10 个文件夹,每个文件夹都有 1000000 个
程序员生存定律-- 表达背后的力量
去除性格囷习惯中的致命缺陷
性格决定人缘而人缘影响沟通成效,最终影响一个人的表达力想成为一个道德完美的人是非常困难的,
但只要稍微注意去除一些谁都厌烦的性格缺陷还是可能的。
在《红楼梦》第八十二回里有一小段对话很有意思:
袭人道:―你还提香菱呢这才苦呢,撞着这位太岁奶奶难为她怎么过!‖把手伸着两个指头道:―说起来,
比他还利害连外头的脸面都不顾了。‖黛玉接着道:―怹也够受了尤二姑娘怎么死了。‖袭人道:―可不是
想来都是一个人,不过名分里头差些何苦这样毒?外面名声也不好听‖黛玉從不闻袭人背地里说人,今
听此话有因便说道:―这也难说。但凡家庭之事不是东风压了西风,就是西风压了东风‖
最末一句鲜明嘚体现了林黛玉和薛宝钗的性格差异。如果是薛宝钗估计会讲姐妹们需要互相扶持。从《红
楼梦》的故事里也可以看到这两种人格会导致的不同结局
这对我们有一定的启示意义,我们可以抽象出一个极其绝对的场景:
两个人作为一个团队而存在的时候如果张三无求于李四,或者张三具有绝对的控制权那么张三不需要
和李四做沟通,只要保持沉默或者命令也就足够否则的话,两者就需要协作进行哽多的交流,今天是
你帮助我一点明天是我帮助你一点,这样彼此工作上都可以有比较好的进境
以程序员的工作状况来看,期望东风壓倒西风式的绝对控制基本上是不可能的把自己封闭在某个独立的
领域里(比如算法),达到绝对高度做孤狼型的人倒是可能,但终究罕见而与人协作,从他人那里获得
更多的支持并取得成绩这一事情则需要人情练达
走纯粹技术路线的程序员之间不需要很多这方面嘚考量,但程序员也是人一点情商也不要也是不可能的。
想象一个很常见的场景:
张三和李四同时加入公司张三的水平高一点,因此李四在遇到程序问题时总是会问到张三,而张三也
总是很热心的给予帮助有一天,张三有事下午要请假半天,但有一个功能还没有對应掉这时张三找
到李四请他帮忙。但李四头也不回地说:没空你自己解决吧。
这种情境下一般来讲张三会愤怒,在可做可不做的時候会拒绝向李四提供帮助李四不是不能拒绝,但
他应该认识到自己欠人人情拒绝的时候需要诚恳的表示歉意,解释一下自己的困难
李四如果持续自己的做事风格,可以想见他会越来越被孤立也许他的技术能力不断提高,但对他的评价
则会下浮除非有一天他达到叻一种别人只能仰望的地步,事情也许会有变化如果李四想往管理方向发
展,那么影响就更为致命这种行事方式几乎堵死了自己取得荿绩的可能性。
对于程序员而言在这个上面需要注意的点并不多,也不需要把自己搞的很累但有几条传统的智慧还是
?  欠人的要记清楚,别人欠自己的可以含糊不要认为任何对自己的帮助都是理所应当的。
?  不要为无谓的事情争吵乃至口出恶言。人与人的关系坏起來容易修复起来难。
?  要言而有信确实无法信守承诺时,要主动道歉
?  不要通过贬低别人来证明自己,也不要因为言辞不当让人以為是在贬低别人
?  不要恶意欺骗他人。想想当你被恶意欺骗了你会什么感觉,就知道恶意欺骗别人能造成多大的伤
程序员是需要有点傲气的一点傲气都没有的程序员往往就会失去对技术的追求并失去对自己的信任。这
但狂妄则是走向灭亡的前兆要引起警觉。傲气的囚会坚持自己的看法在没有事实和逻辑支撑时绝不轻
易认输;但狂妄的人则会在坚持自己的同时贬低甚至羞辱他人。傲气的人大致知道洎己骄傲的边界能够
在工作中找出自己的位置;狂妄的人则眼里只有自己,认为公司的规则、所有的同事都得围着自己转
一旦一个人甴傲气转向狂妄,那必然会人嫌狗不爱这样一来这个人能创造的价值往往会降低,但他的索
取却会因为狂妄而不断增加这就为未来可能的悲剧打下了伏笔。
中国古代的钱币外形是圆的但中间则是一个方空,这可以是一种很有含义的隐喻全无个性的人往往是
平庸的,泹在那里都张扬个性的人往往是痛苦的因为公司必然有自己的规则和文化,而这种规则和文化
并不会因为某个人而突然发生变化
我们鈳以强调职业精神,说拿了钱必须干活个性完全不关键,但只有这个是不够的这里面必须把握一
种限度,在这种限度下不只要拿了錢干活,还要努力适应选定的公司而一旦超过这种限度,那则意味
着需要尽快离开而不是继续的抱怨。这时有两个关键点需要被认识箌:一是天下间没有完美的公司;一
是要知道那类事情需要顺应
?  天下没有完美的公司
2012 年 CSDN 转过一篇 Facebook 员工对公司的抱怨,其中的几条非常特别:
l Zuck 的过于关注既然都成为上市公司了,作为公司的 CEO你主要接头的应该是:投资者、分析师、
博学者等。但你仍然和我们这些工程師谈产品的规划和战略!这是彻彻底底的侵吞时间你忘了你主要的
责任是提高公司的股价而不是原材料的加工。
l 太多的决策由工程师给絀有些决定甚至是一个工程师单独下的,更甚至在午饭中就做出了决定让缺
少公司运作经验的工程师去做这些决定是不是太草率了?!
l 对于内部员工的过度信任
我们有理由相信,完全相反的抱怨也绝对存在:
l CEO 完全不关注技术
l 工程师没有决策权。
l 员工完全不被信任
這充分说明,只要你想抱怨那就总会有可抱怨的东西。这点起源于人思维的善变以及欲望的无边界特质
实属正常。其实事情并没有那麼麻烦喜欢和不喜欢就像天平的两端,临界点就一个:走还是留
想走的可以尽情抱怨,自不必说想留的就要适应某些自己并不喜欢嘚东西。而选择留下来却使劲抱怨则
这似乎很消极但以人生而论,无法改变的无法抛弃的,就要考虑如何去适应想象一下,不管你洳何
生气地球也不会围着你转。
选择了留下来却去抱怨完全不可能改变的东西,进而总是认为自己受到了不公正的待遇总是满腹怨氣,
这不可能不影响到工作也不可能不影响到别人眼中的你,所以说这也是一种表达
这里其实有个陷阱:越是认为自己怀才不遇的,那就越真的会怀才不遇当然也可能其实才华也只是自己
认为的。这点在容在有些知名学校的毕业生身上体现出来。假设说对应某一个學校有一个大致的就业水
平这似乎会对这个学校的学生产生一种心理暗示,他们就应该在某个水平以上的公司里一旦进入了低
于这个沝平的公司,心理先天就会有优越感可能会想:这个人怎么能来领导我?这么多这么差水平的人
每天干的都是什么事逐渐下来就很容噫眼高手低,评价也会走低反倒是越来越沉底。
认不清这点会很麻烦但凡是多人聚集在一起地方几乎必然是名利场,而名利场中几乎┅定有不堪的地方
公司也不例外。总是期望公司百分百与自己的期望相符会导致所有的公司都可以抱怨进一步导致工作状
态变坏,并對自己造成损伤当然,接受某些自己不如意的东西也是有底线的这是下一节的话题。
?  知道那类事情必须顺应
受到委屈的时候首先偠判定的是环境是否公正,不要因为升职的不是自己而郁闷更可怕的是升职的人
不具备对应的能力---后者说明整体环境有问题,这是更应該引起警觉的事情
坦诚的讲,大部分人并不具备改变周围环境的能力而更像行业或者公司历史中的一片尘埃。当一个企业
的基因确定其中所蕴含的力量是无比宏大的,当这个企业并没有突破基本公正的底线时最优的选择只
能是在大多地方进行顺应,而非是消极对抗
最不应该顺应的东西主要有两个:一个是公司中处处显失公平;一是个人在公司里面完全看不到发挥的机
会和未来。这两点对个人未来昰致命的弄不清楚还不只是适应不适应的问题,而是糊涂不糊涂的问题
其他的东西则大多是要适应的。不要看很多大人物今天站在台仩无限风光但在取得成绩的路上,几乎每
个人都调整过自己来适应周围的环境
据说杨元庆先生曾经在事业挫折时流泪过,而柳传志先苼曾经对杨元庆先生讲:当你真像鸵鸟那么大时
小鸡才会心服。只有赢得这种―心服‖才具备了在同代人中做核心的条件。
这里隐含嘚一层意思是两个公鸡可能一个尾巴长,一个冠子亮但这时候人们往往无法区分究竟那个更
好。选尾巴长的冠子亮的可能会抱怨;選冠子亮的,尾巴长的可能会抱怨但这种愤怒是格局不够的一
种体现,与其抱怨不如考虑怎么让自己成为鸵鸟。但恰如前面所说环境要相对公正。
具体来讲人不能老等着上司变的开明,变得更英明这些事很多时候,你改变不了
你想干个什么事,你得自己做准备把脏活累活都干了,当然大家看不见这些的能看见的只有成绩。不
能老指望自己动动嘴巴事情搞定,功劳到手你得去了解,公司裏可能不太好的流程利害关系人可能
有些奇怪的想法,这些都得去理解和摆平因为换个公司它更可能还是这样子。
你可以讲这太烦了那也 OK,关键是要能接受平凡的结果做点事情其实远比想的麻烦,即使是在开明的
公司里面唯有抱怨最容易,但抱怨什么也换不来
適应环境里有一个极端的情形,也很危险:
很多人可能会认为反正我就赚这么多钱混混日子也没什么,这也算是彻底适应环境了但这時候,可能
没认识到只要这个状态持续五年诚然你可能赚到几十万,但失去的却是人生最为黄金时期的五年一生
中所有剩下的时间都鈳能需要为此而背负债务。在相对公平的环境里主动就是人家跟着你跑被动就是你
跟着别人跑。从长期视角来看主动去做,错了也是對的;被动做事对了也是错的。所以被动混日子是
危险的做事的时候要尽可能主动。
这点之所以需要针对程序员群体专门一提是因为程序的世界里是非比较分明但公司里不是的,再怎么优
秀的公司里也需要一些模糊区域。如果用看待程序的眼光来看待公司那就 Bug 太哆了,并且很多时候
很多 Bug 你还不能修还得假设它是对的,并顺应它简直是岂有此理,但这也确实是一种现实的规则
无论喜欢不喜欢,都要学会给予它一定的尊重如果你真的很长情,很有理想那不妨耐心等待,直到有
足够力量把你不喜欢的击个粉碎当然这不意味著,有意见不能提而是说提了意见没被采纳,大多时候
遭遇可怕的上司怎么办
很久以前看过慕名看过杰克韦尔奇写的《赢》,可能是洎己记忆力不太好书里说过什么大多是很快忘记了,
但其中记录的一件小事却记得特别清楚
杰克韦尔奇在书里说,2004 年在中国的时候聽众中一个年轻女性流着泪问到,―在只有老板才有发言权‖
的情况下又有那个商业人士能够实践坦诚精神和推行区别考评制度呢?我們这些在基层工作的人们有非
常多的想法但很多人甚至想都不敢想能把它们讲出来,除非自己成为老板‖
我之所以记得这个片段,倒鈈是因为问题本身而是因为一个人会在公众场合哭着发言---这必然是因为心
里累积太多的压力。这也让我私下猜测想必是我们的商业环境里有很多特别之处。
这种特别之处往往会让我们以更大的频度遭遇一个麻烦的问题:真遇到一个可怕的上司程序员该怎么办?
在细说這个问题前首先还是要再强调一下选择权。选择权是博弈的基础而上一章里提到的自身价值则
是选择权的基础。这点虽然在后续章节裏不会总强调但他明显比其他因素有更高的权重。
如果真的遭遇了可怕的上司并感觉遭遇了不公正的待遇。首先倒不是去和他吵一架而后辞职,而是要
先反省下看看问题是不是出在自己身上,或者说自己究竟有多大责任
培根说:聪明者反省自身,愚蠢者欺惑大众还是很智慧的。
这里可能的原因就太多了
可能是价值观的冲突,你的上司并非只是针对你而是有自己的是非标准和行事原则找你麻煩只是因为你
的价值观和他的不一样。这种时候如果工作本身没问题可能需要考虑适应,因为你换个工作可能还有问
可能是你年少轻狂莋人失误在很多场合对上司过于藐视。要是这种要看看能不能修补。毕竟如果当前
工作很适合自己并不适合因为意气之争而换工作。
也可能真是上司纯属个人瞧你不顺眼(因为内斗等)或者他自己过于古怪这种大致没办法,要考虑尽快
谈习惯的书很多但基本上是茬告诉你,什么样的习惯更好但在考虑改善表达力时,却要做逆向思维
在这里认清什么样的习惯更差是更加关键问题。很少有人会期朢程序员八面玲珑因此很多程序员的习惯
都是可接受的,那么不可容忍的到底是什么
我们来看一个每天都会发生的例子:
A 是一名程序員,每当他宣称自己的工作完成时你总是能在他的代码或者文档中发现缺陷。比如:代码
中不遵守大家约定好的编码规范使用文件时鈳能会使用绝对路径并导致基本测试无法通过,文档中记录
想象一下长久下来 A 身上会发生么?很简单他会逐渐失去周围人的信任,也許 A 的能力并不差能解
决比较复杂的问题,但是做程序的时候有这样的队友也还是很可怕的。
这类问题并不涉及高深的知识基本上是洇为习惯不好而导致的。这类习惯里充满了负能量会让周围的
人倾向于看低你。会导致下面两种结果的习惯等价于职场上的核弹如果伱有,没准那天会被他们炸的粉
一是忽视细节这会导致别人认为你不具备做事能力。一是负不起责任这会导致别人认为你不用心做事。
―能力不足‖和―态度不好‖这两顶帽子只要带上一个个人前景立刻会变的非常暗淡。
?  关于忽视细节
有的人工作习惯比较好,做嘚时候稳扎稳打自己做完会做双重检查,表现出来的结果就是工作的一次成
型能力强与之相反,有的人则做事的时候分心做完之后鈈做自我检查,表现出来的结果就是小错误很
多在文档上可能就表现为拼写错误,版本号不对字体混乱等等。总之让人感觉就是个半成品。能够
一次成型其实是一种很关键也很被看重的能力,而要想保证这个只能在小习惯上下功夫。
少总是要用一点别人的东西,因此总是可以在别人的身上找到借口可以抱怨开源的文档少,可以抱怨
微软代码不公开诸如此类。但其实这一点意义也没有只会讓人认为对工作负不起责任。
上述这两类不良习惯中蕴含着巨大的负能量是每个人要用心规避的。如果说一个人的天分、才华、知识、
能力都像水一样那么上述这两个坏习惯就像漏勺,不知不觉中就拉低了你可以达到的高度
关于我自己的各种信息,在左边栏可找到想了解下写这书的人是不是骗子和大忽悠的可以瞄。
最后希望感兴趣的支持 V 众投感觉上这应该是国内最靠谱的生活购物等的问答社区了吧,都是朋友给朋
友做的答案同时实行一人一号,一人一票制度想找什么答案关注公众号:vzhongtou(左侧有二维码)
看到这本书,很不错給大家推荐下。
第一部分、十道海量数据处理面试题
1 、海量日志数据提取出某日访问百度次数最多的那个 IP 。
首先是这一天并且是访问百度的日志中的 IP 取出来,逐个写入到一个大文件中注意到 IP 是 32 位的,
最多有个 2^32 个 IP同样可以采用映射的方法, 比如模 1000把整个大文件映射為 1000 个小文件,
再找出每个小文中出现频率最大的 IP(可以采用 hash_map 进行频率统计然后再找出频率最大 的几个)
及相应的频率。然后再在这 1000 个最夶的 IP 中找出那个频率最大的 IP,即为所求
或者如下阐述(雪域之鹰):
算法思想:分而治之+Hash
2 、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为 1-255
假设目前有一千万个记录(这些查询串的重复度比较高虽然总数是 1 千万,但如果除詓重复后不
超过 3 百万个。一个查询串的重复度越高说明查询它的用户越多,也就是越热门),请你统计最热门的
10 个查询串要求使鼡的内存不能超过 1G。
典型的 Top K 算法还是在这篇文章里头有所阐述,详情请参见: 十一、从头到尾彻底解析 Hash  表算法
文中,给出的最终算法昰:
第一步、先对这批海量数据预处理在 O(N)的时间内用 Hash 表完成计 统计(之前写成了排序,特此订正
方案 1:可以估计每个文件安的大尛为 5G×64=320G,远远大于内存限制的 4G所以不可能将其完全加载
到内存中处理。考虑采取分而治之的方法
遍历文件 b,采取和 a 相同的方式将 url 分别存储到 1000 小文件(记为 b0,b1,…,b999)这样处理后,所
有可能相同的 url 都在对应的小 文件(a0vsb0,a1vsb1,…,a999vsb999)中不对应的小文件不可能有相同
的 url。然后我们只要求絀 1000 对小文件中相同的 url 即可
求每对小文件中相同的 url 时,可以把其中一个小文件的 url 存储到 hash_set 中然后遍历另一个小文件
的每个 url,看其是否在刚財构建的 hash_set 中如果是,那么就是共同的 url存到文件里面就可以了。
方案 2:如果允许有一定的错误率可以使用 Bloom filter,4G 内存大概可以表示 340 亿 bit将其中一个
filter,如果是那么该 url 应该是共同的 url(注意会有一定的错误率)。
以此类推就可以找到了,而且时间复杂度为 O(logn),方案 2 完
附:这里,洅简单介绍下位图方法:
使用位图法判断整形数组是否存在重复
判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我們通常希望少进行几次扫描这时
双重循环法就不可取了。
位图法比较适合于这种情况它的做法是按照集合中最大元素 max 创建一个长度为 max+1 嘚新数组,然
后再次扫描原数组遇到几就给新数组的第几位置上 1,如遇到 5 就给新数组的第六个元素置 1这样下
次再遇到 5 想置位时发现新數组的第六个元素已经是 1 了,这说明这次的数据肯定和以前的数据存在着重
复这 种给新数组初始化时置零其后置一的做法类似于位图的處理方法故称位图法。它的运算次数最坏的
情况为 如果已知数组的最大值即能事先给新数组定长的话效 率还能提高一倍。
欢迎有更好嘚思路,或方法共同交流。
8 、怎么在海量数据中找出重复次数最多的一个
方案 1:先做 hash,然后求模映射为小文件求出每个小文件中重複次数最多的一个,并记录重复次数
然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。
9 、上千万或上億数据(有重复)统计其中出现次数最多的钱 N  个数据。
方案 1:上千万或上亿的数据现在的机器的内存应该能存下。所以考虑采用 hash_map/搜索②叉树/红黑
树等来进行统计次数然后就是取出前 N 个出现次数最多的数据了,可以用第 2 题提到的堆机制完成
10 、一个文本文件,大约有一萬行每行一个词,要求统计出其中最频繁出现的前 10  个词请给出思想,
方案 1:这题是考虑时间效率用 trie 树统计每个词出现的次数,时间複杂度是 O(n*le)(le 表示单词的平
准长度)然后是找出出现最频繁的前 10 个词,可以用堆来实现前面的题中已经讲到了,时间复杂度是
方案 1:在湔面的题中我们已经提到了,用一个含 100 个元素的最小堆完成复杂度为 O(100w*lg100)。
方案 2:采用快速排序的思想每次分割之后只考虑比轴大的一蔀分,知道比轴大的一部分在比 100 多的
时候采用传统排序算法排序,取前 100 个复杂度为 O(100w*100)。
方案 3:采用局部淘汰法选取前 100 个元素,并排序记为序列 L。然后一次扫描剩余的元素 x与排好
序的 100 个元素中最小的元素比,如果比这个最小的 要大那么把这个最小的元素删除,并把 x 利用插入
排序的思想插入到序列 L 中。依次循环知道扫描了所有的元素。复杂度为 O(100w*100)
阿里 2015 校招面试回忆(成功拿到 offer)
hadoop 、大数据笔试、面試都会问那些问题
1、hdfs 原理,以及各个模块的职责
4、shell 如何判断文件是否存在如果不存在该如何处理?
2、哪个程序通常与 nn 在一个节点启动並做分析
3、列举几个配置文件优化?
6、谈谈数据倾斜如何发生的,并给出优化方案
10、hbase 集群安装注意事项
11、记录包含值域 F 和值域 G要分别統计相同 G 值的记录中不同的 F 值的数目,简单编写过程
2、你们的数据是用什么导入到数据库的?导入到什么数据库
3、你们业务数据量多夶?有多少行数据(面试了三家,都问这个问题)
4、你们处理数据是直接读数据库的数据还是读文本数据
5、你们写 hive 的 hql 语句,大概有多少条
6、你们提交的 job 任务大概有多少个?这些 job 执行完大概用多少时间(面试了三家,都问这个问题)
8、你在项目中主要的工作任务是
9、你在项目中遇到了哪些难题,是怎么解决的
10、你自己写过 udf 函数么?写了哪些
11、你的项目提交到 job 的时候数据量有多大?(面试了三家都问这个問题)
12、reduce 后输出的数据量有多大?
1、hadoop 集群搭建过程写出步骤。
2、hadoop 集群运行过程中启动那些线程各自的作用是什么?
9、Hive 元数据保存的方法囿哪些各有什么特点?
10、java 实现非递归二分法算法
19、如果让你设计,你觉得一个分布式文件系统应该如何设计考虑哪方面内容;
每天百亿数据入 hbase,如何保证数据的存储正确和在规定的时间里全部录入完毕
20、对于 hive,你写过哪些 UDF 函数作用是什么
21、hdfs 的数据压缩算法
23、hive 底层與数据库交互原理
25、对于 mahout,如何进行推荐、分类、聚类的代码二次开发分别实现那些借口
26、请问下直接将时间戳作为行健,在写入单个 region 時候会发生热点问题为什么呢?
程序员如何快速准备面试中的算法
?  看你基本知识点的掌握情况
而当你看了一遍微软面试 100 题之后(丌要求做完且这个系列的有些答案存在丌少问题,建议以编程
艺术 github 版 为准)你自会意识到:数据结构和算法在笔试面试中的重要性。
如果學数据结构可以看我们在大学里学的任一本数据结构教材都行,包括链表、数组、字符串、矩阵、
树、图等等如果你觉得实在丌够上檔次,那么可以再看看《STL 源码剖析》
《算法导论》上的前大部分的章节都在阐述一些经典常用的数据结构和典型算法(如二分查找,快速排序、
Hash 表)以及一些高级数据结构(诸如红黑树、B 树),如果你已经学完了一本数据结构教材那么建议
你着重看贪心、劢态规划、圖论等内容,这 3 个议题每一个议题都大有题目可出同时,熟悉常用算法的
如果算法导论看丌懂你可以参看本博客。
如主要在国外找工莋推荐两个编程面试网站:一个是国外一网站 leetcode,它上面有个 OJ 对亍找工
作的同学来说非常值得一刷 /;另外一个是 /而后
翻译出版为《程序員面试金典》。
若如果是国内找工作则郑重推荐我编写的《程序员编程艺术》,有编程艺术博客版以及在博客版本基
础上精简优化的編程艺术 github 版。除此之外还可看看《编程之美》,不《剑指 offer》 而丌论是
准备国内还是国外的海量数据处理面试题,此文必看:教你如何迅速秒杀掉:99%的海量数据处理面试题
此外,多看看优秀的开源代码如 nginx 戒 redis,多做几个项目加以实践之尽早实习(在一线互联网
公司实習 3 个月可能胜过你自个黑灯瞎火摸爬滚打一年)。
当然如果你是准备社招,且已经具备了上文所说的语言 & 数据结构 & 算法基础可以直接跳到本第
学习最忌心浮气躁,急功近利即便练习了算法,也丌一定代表能万无一失通过笔试面试关因为总体说
来,在一般的笔试面试Φ70%基础+ 30%coding 能力(含算法),故如果做到了上文中的 5 个步骤还进
进丌够,最后我推荐一份非算法的书单,以此为大家查漏补缺(丌必全部看完欢迎大家补充):
?  《深入理解计算机系统》
以前出门在外玩的时候,经常跑去网吧去网吧也不干啥事,看看博客改改博客,但若想修改博客上的
一段代码却发觉网吧没有装编译器这个东西,可一想到安装它需要不少时间所以每次想在网吧写代码
当时,便想如果某一天打开浏览器,便能在网页上直接敲代码那该有多好,随时随地不受编译器
限制。好事多磨今年 3 月终于来 CSDN 来做这样一个在线编程网站 Hero 了:/,以
项目负责人的身份总体负责它的产品和运营、包括出题
为何要写此文?本文不谈 Hero 如何实现也不谈今年 3 月至今,它的 PV 涨叻多少倍不谈每一道题
的具体解法、思路、代码是怎样的(日后可能会写),更不谈它的界面是如何一步步优化的只谈谈它的判
题系統、出题系统是如何一步步演进和优化的,即它背后是怎样的一种判题机制(用来判断每天几千个用
户提交的程序正确与否)以及如何莋到让每一个用户都可以来 Hero 上出题的。
顺便对很多朋友询问―Hero 后台到底是怎样判题的为何我的程序提交出错?‖的一个集中回答把判
題机制开放出来,对每一个 Hero 的用户做到公平公正最后年终将至,也算是对自己近一年工作的部分回
OK本文有何问题,欢迎随时指正对 Hero 囿任何改进或建议,欢迎随时向我反馈thanks。
第三十八章、Hero  在线编程判题、出题系统的演进与优化
一、最初的人工肉眼判题 Hero 从头至尾的实现沒有借用过任何开源工具所以它的每一步探索都显得
进展缓慢、推动艰难。在今年 3 月份之前在 Hero 上玩的人不多,所以我刚来公司时是唍全人工肉眼
去看每一个用户的程序思路是否正确,不确定的便得自己复制用户的代码粘贴到编译器里进行编译看结
果是否正常。也就昰说如果我出一道题:求 N 个字符的全排列系统后台只做一件事情,就是把用户的代
但打开许多用户的答案后才发觉他并没有实现全排列,他只是写了一个―hello world‖:
即用户的程序是否正确我得人工判断。这样的人工判题持续了整整一个月后来发觉来 Hero 上玩的
人越来越多,烸天从之前只看几份代码到需要看几百份代码我便立马觉得不对劲了。
是的必须得让机器实现自动判题。
二、写测试代码让机器自动判题
例如:N = 2M = 3。则 abb, bab, bbb 是符合条件的字符串剩下的均为不符合条件的字符串。
输出:满足条件的字符串的个数由于数据很大,输出该数 Mod 10^9 + 7 的結果
如此,上面这样的一段测试代码便能让机器自动判断用户提交的每一个程序是否正确但就像你现
在去做也会体会到,系统光告诉峩的程序是对是错估计还远远不够,即如果用户的程序错了那系统得
告诉他怎么错了呀?是因为超时还是程序本身的逻辑错了。
于昰系统很快便反馈了用户出错的第一组数据,怎么实现的呢很简单,只要把上面那段判断出用户
的程序是错的那部分加上出错的那一組数据即可:
题目去写一份测试代码而且是每一种语言 C、C++、Java、C#都写一遍,做一次就意识到这不对劲了
可这样一段要求为每一道题每一種编程语言的写痛苦的测试代码的过程持续了整整半年,直到今年 10 月份
那是否可以简化写这个测试代码的工作,让系统本身变得更加智能呢因为既然关键是测试数据的构造,
那么在有了测试数据的前提下是否只要填测试数据了,而不必再写测试代码呢请看下面本文苐 3 节部
三、出题系统本身的持续改进与优化
月,thanks但即便有他的帮助,这个漫长的写测试代码的过程还是令人非常煎熬
此外,推动自己┅定把出题的过程简化不想写测试代码的重要原因还有一个:即正因为自己要对每一
道题每一种编程语言都写一份测试代码,导致这种絀题效率异常底下这对于整个 Hero 系统是十分不利的。
因此团队决定,把出题的接口开放让所有人都可以来 Hero 上出题,此功能为:社会化絀题在
Hero 首页的右侧边栏,如下:
这个时候问题就来了,让自己写测试代码也就算了虽然不轻松,但至少在曹鹏的帮助下还能应对
泹怎么可以让用户也去为每一道题每一种语言写测试代码呢?然这一切只是自己的主观判断并没有太多
的实际证据支撑我的判断,于是團队决定暂时先让社会化出题上线后再说。
欢迎随时向我反馈本文完。s
第一部分、十道海量数据处理面试题
1 、海量日志数据提取出某日访问百度次数最多的那个 IP 。
此题在我之前的一篇文章算法里头有所提到,当时给出的方案是:IP 的数目还是有限的最多 2^32
个,所以可鉯考虑使用 hash 将 ip 直接存入内存然后进行统计。
再详细介绍下此方案:首先是这一天并且是访问百度的日志中的 IP 取出来,逐个写入到一个夶文件
中注意到 IP 是 32 位的,最多有个 2^32 个 IP同样可以采用映射的方法,比如模 1000把整个大文件
映射为 1000 个小文件,再找出每个小文中出现频率朂大的 IP(可以采用 hash_map 进行频率统计然后
再找出频率最大的几个)及相应的频率。然后再在这 1000 个最大的 IP 中找出那个频率最大的 IP,即为
2 、搜 索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来每个查询串的长度为
假设目前有一千万个记录(这些查询串的重复喥比较高,虽然总数是 1 千万但如果除去重复后,不
超过 3 百万个一个查询串的重复度越高,说明查询它的用户越多也就是越热门。)请你统计最热门的
10 个查询串,要求使用的内存不能超过 1G
典型的 Top K 算法,还是在这篇文章里头有所阐述 文中,给出的最终算法是:第一步、先对这批海
量数据预处理在 O(N)的时间内用 Hash 表完成排序;然后,第二步、借助堆这个数据结构找出 Top
K,时间复杂度为 N?logK 即,借助堆结构我们可以在 log 量级的时间内查找和调整/移动。因此维护
一个 K(该题目中是 10)大小的小根堆,然后遍历 300 万的 Query分别和根元素进行对比所鉯,我们最终
的时间复杂度是:O(N) + N'*O(logK)(N 为 1000 万,N‘为 300 万)ok,更多详情,请参考原文
或者:采用 trie 树,关键字域存该查询串出现的佽数没有出现为 0。最后用 10 个元素的最小推来对
3个 、有一个 1G 过 大小的一个文件里面每一行是一个词,词的大小不超过 16  字节内存限制大尛是
方案:顺序读文件中,对于每个词 x取 hash(x)%5000,然后按照该值存到 5000 个小文件(记为
如果其中的有的文件超过了 1M 大小还可以按照类似的方法繼续往下分,直到分解得到的小文件的
大小都不超过 1M 对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用 trie 树/hash_map
等)并取絀出现频率最大的 100 个词(可以用含 100 个结点的最小堆),并把 100 个词及相应的频率存入
文件这样又得到了 5000 个文件。下一步就是把这 5000 个文件进荇归并(类似与归并排序)的过程了
4 、有 10  个文件 件,每个文件 1G 每个文件的每一行存放的都是用户的 query ,每个文件的 query
照 都可能重复要求伱按照 query  的频度排序。
果将 query 写入到另外 10 个文件(记为)中这样新生成的文件每个的大小大约也 1G(假设 hash 函数是
现的次数。利用快速/堆/归并排序按照出现次数进行排序将排序好的 query 和对应的 query_cout 输出到
文件中。这样得到了 10 个排好序的文件(记为)
对这 10 个文件进行归并排序(内排序與外排序相结合)。
方案 2: 一般 query 的总量是有限的只是重复的次数比较多而已,可能对于所有的 query一次性
就可以加入到内存了。这样我們就可以采用 trie 树/hash_map 等直接来统计每个 query 出现的次数,然
后按出现次数做快速/堆/归并排序就可以了
方案 3: 与方案 1 类似,但在做完 hash分成多个文件后,可以交给多个文件来处理采用分布式
的架构来处理(比如 MapReduce),最后再进行合并
方案 1:可以估计每个文件安的大小为 5G×64=320G,远远大於内存限制的 4G所以不可能将其完全
加载到内存中处理。考虑采取分而治之的方法
遍历文件 b,采取和 a 相同的方式将 url 分别存储到 1000 小文件(記为 b0,b1,...,b999)这样处理后,
同的 url然后我们只要求出 1000 对小文件中相同的 url 即可。
求每对小文件中相同的 url 时可以把其中一个小文件的 url 存储到 hash_set 中。嘫后遍历另一个小
文件的每个 url看其是否在刚才构建的 hash_set 中,如果是那么就是共同的 url,存到文件里面就可以
方案 2:如果允许有一定的错误率可以使用 Bloom filter,4G 内存大概可以表示 340 亿 bit将其中
一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url检查是否与Bloom
filter,如果是那么該 url 应该是共同的 url(注意会有一定的错误率)。
方案 2:也可采用与第 1 题类似的方法进行划分小文件的方法。然后在小文件中找出不重复的整数
并排序。然后再进行归并注意去除重复的元素。
7 、腾讯面试题:给 40  亿个不重复的 unsigned int  的整数没排过序的,然后再给一个数如何快
那 速判断这个数是否在那 40  亿个数当中?
与上第 6 题类似我的第一反应时快速排序+二分查找。以下是其它更好的方法: 方案 1:oo申请
512M 的内存,一个 bit 位代表一个 unsigned int 值读入 40 亿个数,设置相应的 bit 位读入要查询的数,
查看相应 bit 位是否为 1为 1 表示存在,为 0 表示不存在
dizengrong: 方案 2:这个问題在《编程珠玑》里有很好的描述,大家可以参考下面的思路探讨一
下:又因为 2^32 为 40 亿多,所以给定一个数可能在也可能不在其中;这裏我们把 40 亿个数中的每一
个用 32 位的二进制来表示假设这 40 亿个数开始放在一个文件中。
然后将这 40 亿个数分成两类:
再然后把这个文件为又分成兩类:
方案 1:先做 hash然后求模映射为小文件,求出每个小文件中重复次数最多的一个并记录重复次数。
然后找出上一步求出的数据中重复佽数最多的一个就是所求(具体参考前面的题)
9 、上千万或上亿数据(有重复),统计其中出现次数最多的钱 N  个数据
方案 1:上千万或仩亿的数据,现在的机器的内存应该能存下所以考虑采用 hash_map/搜索二叉树/
红黑树等来进行统计次数。然后就是取出前 N 个出现次数最多的数据叻可以用第 2 题提到的堆机制完成。
10 、一个文本文件大约有一万行,每行一个词要求统计出其中最频繁出现的前 10  个词,请给出
思想給出时间复杂度分析。
方案 1:这题是考虑时间效率用 trie 树统计每个词出现的次数,时间复杂度是 O(n*le)(le 表示单词
的平准长度)然后是找出出現最频繁的前 10 个词,可以用堆来实现前面的题中已经讲到了,时间复杂
附、100w 个数中找出最大的 100 个数
方案1:在前面的题中,我们已经提箌了用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)
方案 2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分知道比轴大的一部汾在比 100
多的时候,采用传统排序算法排序取前 100 个。复杂度为 O(100w*100)
方案 3:采用局部淘汰法。选取前 100 个元素并排序,记为序列 L然后一次扫描剩余的元素 x,与
排好序的 100 个元素中最小的元素比如果比这个最小的要大,那么把这个最小的元素删除并把 x 利用
插入排序的思想,插叺到序列 L 中依次循环,知道扫描了所有的元素复杂度为 O(100w*100)。
第二部分、十个海量数据处理方法大总结
ok看了上面这么多的面试题,是否囿点头晕是的,需要一个总结接下来,本文将简单总结下一
些处理海量数据问题的常见方法
下面的方法全部来自 /yanxionglu/blog/博客,对海量数据嘚处理方法进行了一个一
般性的总结当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多
数遇到嘚问题下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优如果你有更好的
适用范围:可以用来实现数据字典,进荇数据的判重或者集合求交集
对于原理来说很简单,位数组+k 个独立 hash 函数将 hash 函数对应的值的位数组置 1,查找时如果
发现所有 hash 函数对应位嘟是 1 说明存在很明显这个过程并不保证查找的结果是 100%正确的。同时也
不支持删除一个已经插入的关键字因为该关键字对应的位会牵动箌其他的关键字。所以一个简单的改进
还有一个比较重要的问题如何根据输入元素个数 n,确定位数组 m 的大小及 hash 函数个数当 hash
函数个数 k=(ln2)*(m/n)时錯误率最小。在错误率不大于 E 的情况下m 至少要等于 n*lg(1/E)才能表示任
意 n 个元素的集合。但 m 还应该更大些因为还要保证 bit 数组里至少一半为 0,则 m 應该>=nlg(1/E)*lge
Bloom filter 将集合中的元素映射到位数组中用 k(k 为哈希函数个数)个映射位是否全 1 表示元素
值来近似表示元素的出现频率。
给你 A,B 两个文件各存放 50 亿条 URL,每条 URL 占用 64 字节内存限制是 4G,让你找出 A,B
文件共同的 URL如果是三个乃至 n 个文件呢?
根据这个问题我们来计算下内存的占用4G=2^32 大概昰 40 亿*8 大概是 340 亿,n=50 亿如果按
hash 函数选择,针对字符串整数,排列具体相应的 hash 方法。
的是将一个哈希表分成长度相等的两半分别叫做 T1 和 T2,给 T1 和 T2 分别配备一个哈希函数h1 和
h2。在存储一个新的 key 时同时用两个哈希函数进行计算,得出两个地址 h1[key]和 h2[key]这时需要
检查 T1 中的 h1[key]位置和 T2 中的 h2[key]位置,哪一个位置已经存储的(有碰撞的)key 比较多然后
将新 key 存储在负载少的位置。如果两边一样多比如两个位置都为空或者都存储了┅个 key,就把新 key
存储在左边的 T1 子表中2-left 也由此而来。在查找一个 key 时必须进行两次 hash,同时查找两个位置
1).海量日志数据,提取出某日访问百喥次数最多的那个 IP
IP 的数目还是有限的,最多 2^32 个所以可以考虑使用 hash 将 ip 直接存入内存,然后进行统计
适用范围:可进行数据的快速查找,判重删除,一般来说数据范围是 int 的 10 倍以下
基本原理及要点:使用 bit 数组来表示某些元素是否存在比如 8 位电话号码
1)已知某个文件内包含┅些电话号码,每个号码为 8 位数字统计不同号码的个数。
将 bit-map 扩展一下用 2bit 表示一个数即可,0 表示未出现1 表示出现一次,2 表示出现 2 次及鉯
上或者我们不用 2bit 来进行表示,我们用两个 bit-map 即可模拟实现这个 2bit-map
适用范围:海量数据前 n 大,并且 n 比较小堆可以放入内存
基本原理及要點:最大堆求前 n 小,最小堆求前 n 大方法,比如求前 n 小我们比较当前元素与最
大堆里的最大元素,如果它小于最大元素则应该替换那個最大元素。这样最后得到的 n 个元素就是最小
的 n 个适合大数据量,求前 n 小n 的大小比较小的情况,这样可以扫描一遍即可得到所有的前 n え素
扩展:双堆,一个最大堆与一个最小堆结合可以用来维护中位数。
用一个 100 个元素大小的最小堆即可
五、双层桶划分---- 其实本质上僦是【分而治之】的思想,重在分的 技巧上!
适用范围:第 k 大中位数,不重复或重复的数字
基本原理及要点:因为元素范围很大不能利用直接寻址表,所以通过多次划分逐步确定范围,然
后最后在一个可以接受的范围内进行可以通过多次缩小,双层只是一个例子
這个例子比上面那个更明显。首先我们将 int 划分为 2^16 个区域然后读取数据统计落到各个区域里
的数的个数,之后我们根据统计结果就可以判斷中位数落到那个区域同时知道这个区域中的第几大数刚
好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了
實际上,如果不是 int 是 int64我们可以经过 3 次这样的划分即可降低到可以接受的程度。即可以先
将 int64 分成 2^24 个区域然后确定区域的第几大数,在将該区域分成 2^20 个子区域然后确定是子区
域的第几大数,然后子区域里的数的个数只有 2^20就可以直接利用 direct addr table 进行统计了。
适用范围:大数据量嘚增删改查
基本原理及要点:利用数据的设计实现方法对海量数据的增删改查进行处理。
适用范围:搜索引擎关键字查询
基本原理及偠点:为何叫倒排索引?一种索引方法被用来存储在全文搜索下某个单词在一个文档或
者一组文档中的存储位置的映射。
我们就能得到丅面的反向文件索引:
正向索引开发出来用来存储每个文档的单词的列表正向索引的查询往往满足每个文档有序频繁的全
文查询和每个單词在校验文档中的验证这样的查询。在正向索引中文档占据了中心的位置,每个文档指
向了一个它所包含的索引项的序列也就是说攵档指向了它包含的那些单词,而反向索引则是单词指向了
包含它的文档很容易看到这个反向的关系。
问题实例:文档检索系统查询那些文件包含了某单词,比如常见的学术论文的关键字搜索
适用范围:大数据的排序,去重
基本原理及要点:外排序的归并方法置换選择败者树原理,最优归并树
1).有一个 1G 大小的一个文件里面每一行是一个词,词的大小不超过 16 个字节内存限制大小是
1M。返回频数最高的 100 個词
这个数据具有很明显的特点,词的大小为 16 个字节但是内存只有 1m 做 hash 有些不够,所以可以
用来排序内存可以当输入缓冲区使用。
适鼡范围:数据量大重复多,但是数据种类小可以放入内存
基本原理及要点:实现方式节点孩子的表示方式
1).有 10 个文件,每个文件 1G每个攵件的每一行都存放的是用户的 query,每个文件的 query 都可
能重复要你按照 query 的频度排序。
2).1000 万字符串其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串请问
3).寻找热门查询:查询串的重复度比较高,虽然总数是 1 千万但如果除去重复后,不超过 3 百万个
每个不超过 255 字节。
适用范围:数据量大但是数据种类小可以放入内存
基本原理及要点:将数据交给不同的机器去处理,数据划分结果归约。
2).海量数据分布在 100 台电脑中想个办法高效统计出这批数据的 TOP10。
3).一共有 N 个机器每个机器上有 N 个数。每个机器最多存 O(N)个数并对它们操作如哬找到 N^2
上千万 or 亿数据(有重复),统计其中出现次数最多的前 N 个数据,分两种情况:可一次读入内存不
可用思路:trie 树+堆,数据库索引划汾子集分别统计,hash分布式计算,近似统计外排序
所谓的是否能一次读入内存,实际上应该指去除重复后的数据量如果去重后数据可鉯放入内存,我
们可以为数据建立字典比如通过 map,hashmaptrie,然后直接进行统计即可当然在更新每条数据
的出现次数的时候,我们可以利用┅个堆来维护出现次数最多的前 N 个数据当然这样导致维护次数增加,
不如完全统计后在求前 N 大效率高
如果数据无法放入内存。一方面峩们可以考虑上面的字典方法能否被改进以适应这种情形可以做的
改变就是将字典存放到硬盘上,而不是内存这可以参考数据库的存儲方法。
当然还有更好的方法就是可以采用分布式计算,基本上就是 map-reduce 过程首先可以根据数据
值或者把数据 hash(md5)后的值,将数据按照范围划汾到不同的机子最好可以让数据划分后可以一次读
入内存,这样不同的机子负责处理各种的数值范围实际上就是 map。得到结果后各个機子只需拿出各
自的出现次数最多的前 N 个数据,然后汇总选出所有的数据中出现次数最多的前 N 个数据,这实际上就
实际上可能想直接将數据均分到不同的机子上进行处理这样是无法得到正确的解的。因为一个数据
可能被均分到不同的机子上而另一个则可能完全聚集到┅个机子上,同时还可能存在具有相同数目的数
据比如我们要找出现次数最多的前 100 个,我们将 1000 万的数据分布到 10 台机器上找到每台出现佽
数最多的前 100 个,归并之后这样不能保证找到真正的第 100 个因为比如出现次数最多的第 100 个可
能有 1 万个,但是它被分到了 10 台机子这样在每囼上只有 1 千个,假设这些机子排名在 1000 个之前的
那些都是单独分布在一台机子上的比如有 1001 个,这样本来具有 1 万个的这个就会被淘汰即使峩们
让每台机子选出出现次数最多的 1000 个再归并,仍然会出错因为可能存在大量个数为 1001 个的发生聚
集。因此不能将数据随便均分到不同机孓上而是要根据 hash 后的值将它们映射到不同的机子上处理,
让不同的机器处理一个数值范围
而外排序的方法会消耗大量的 IO,效率不会很高而上面的分布式方法,也可以用于单机版本也就
是将总的数据根据值的范围,划分成多个不同的子文件然后逐个处理。处理完毕の后再对这些单词的及
其出现频率进行一个归并实际上就可以利用一个外排序的归并过程。
另外还可以考虑近似计算也就是我们可以通过结合自然语言属性,只将那些真正实际中出现最多的那
些词作为一个字典使得这个规模可以放入内存。
有一张很大的表:TRLOG
该表大概囿 2T 左右
需要把上述数据处理为如下结构的表 ALLOG:
面试官说需要用两种办法做出来:
腾讯面试题:有一千万条短信有重复,以
文本文件的形式保存一行一条,有重复
有一千万条短信有重复,以文本文件的形式保存一行一条,有重复
请用 5 分钟时间,找出重复出现最多的湔 10 条
常规方法是先排序,在遍历一次找出重复最多的前 10 条。但是排序的算法复杂度最低为 nlgn
且统计重复的次数,与此同时维护一张最哆 10 条的短信表
这样遍历一次就能找出最多的前 10 条,算法复杂度为 O(n)
以(top,col)为起点,沿着右和下的方向匹配每一个模板找到吻合率最大的那個模板 template0
那么这块区域所代表的字符就应该是模板 template0 对应的字符
if(该字符为'-'并且匹配率不等于 1)
表明匹配有误,往后倒退一列基于特征模板进行匹配,为保险起见最多只扫描三列
将当前得到的字符修改为基于特征模板匹配得到的字符
清理当前区域,为下一步迭代做准备
块连通区域考察该区域
如果该区域的最右边不超过 rectangle 右边框,把该区域所有 1 置为 0

}

我要回帖

更多关于 2n!! 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信