一份面试经历

 

 

       自我介绍之后,问我的第一个问题,是笔试时候的网络蜘蛛问题,笔试的时候感觉我用贪心算法做出来了,我当场写出伪代码。他好像明白了我在做什么,问你觉得你这算法是最优的吗?我当时都楞了一下,之前没考虑过呀,仔细一想贪心算法是局部最优,而整体的话是近似最优。他开始跟我讨论这个题目了,最终我无赖的放弃了这个题目。

 

       接着开始问我数据库的知识了,首先给了一个表;然后让写了一个简单的SQL,本来想So easy的,接着让写了一个分组统计的查询,还是easy;最后给我来个分组统计加排序输出的查询,用一个SQL搞定,还好以前写过复杂查询,这个SQL有些复杂,嵌套了两层。下一个问:有大量数据要存储到一张表里面去,由于表太大查询性能会降低,导致一张表存不下,你该怎么办?我回答:分割成几张小一些的表。问:该怎么分割,数据结构怎么定义?答:按照表中的主键分割,分割后的表可以根据主键构建B+树来索引。问:有一张大表,现在频繁的做更新和插入操作,怎么提高表的效率?答:用Cache缓存处理结果,批量更新到表里面。问:那如果我的表要求实时更新了? 答:如果查询多可以建索引。问:如果我的插入和更新多了? 我汗啦,这样又不能建索引,似乎没有什么有效的方法吧。答:那我现在还想不到有效方法解决这个问题。 问:分页需要几个变量?答:两个变量就搞定,pagecount和page。问:分页通过数据库怎么做?答:结果集page*pagecount差结果集(page-1)*pagecount。问:你这么做如果我的表很大,那么效率会很低?答:大表可以用结果集的游标做。

 

      问:你会Linux吧?答:不熟以前学过shell,没经常用很多忘了,不过能看懂shell脚本,不能写。问:Linux中有一张类似于excel的表,怎么取出其中一列,命令?答:不懂。问:怎么查找一个文本文件中出现的某个字符串模式?答:grep命令可以做。

 

     问:当前有一个高访问量的大型站点,后面有很多服务器提高服务,如A,B,C,D,E,F。怎么做到负载均衡?他画了一个图,我在图上首先加了一个负载均衡的代理服务器,然后说让代理服务器每隔一段时间去统计分发给后台站点的处理负载,然后根据统计结果均衡。问:你这方案存在问题,服务器可能瞬间负载过高而崩溃。答:那我可以让后台服务器空闲的时候发送自己空闲的状态,如果忙则发送阻塞状态。问:那你这个通信量太大,容易造成代理服务器的瓶颈?答:那我再加一台服务器统计后台服务器的负载,然后代理服务器根据统计结果做均衡。问:那还是存在瞬间崩溃的问题,你每次统计肯定会有时间间隔的。答:我后台还可以采用分布式架构,后台服务器通过心跳算法都维持邻居服务器的状态,当自己崩溃时,可以先迁移自己的数据到邻居空闲的服务器上。问:你这样通信代价太高,后台服务器即要做业务处理又要维护周围的状态,逻辑也太复杂了,并且如果我所有服务器都高负载了?答:加服务器硬件。问:不准加硬件了?答:这个不会。我反问:这个问题的有效解决方案是什么?HR答:这个问题目前没有有效解决方案。(吐血呀,这问题也问得太深了吧)。

 

     问:Session你懂吧?答:恩懂。问:一个大的商务站点,如淘宝,后面有n台服务器处理请求,请问怎么保存用户的Session?答:在前端代理服务器上维持一个SessionID到处理该Session的后台服务器的一张表,Sessioin存储在处理它的服务器上,代理通过该表把用户请求转发给处理该用户Session的服务器。问:这样做可能一台服务器上存放了很多处理的Session的问题,导致服务器内存不够崩溃。答:可以采用虚拟缓存的方式将Session序列化到硬盘上去,只留部分常用的在内存中。问:即使这样,假如有少数Session频繁的操作,造成很大负载,你怎么办,而且服务器还是有崩溃的可能?答:每台服务器加二级缓存,操作最频繁的用户的Session放到一级缓存中,次频繁的放到二级缓存中。问:那你怎么处理频繁操作导致服务器崩溃的问题?答:提高单台服务器的性能,还可以采用分布式结构,当某台服务器的任务过重,就将一部分Session转移到周围空闲服务器上去。问:如果后台服务器要求相互独立呢?答:把Session移动前端代理服务器上去集中存储。问:那我后台服务器要用Session怎么办?答:到前端代理服务器去查。问:前端代理服务器要处理负载均衡,任务已经很重了,还要处理后台服务器的查询,这时前端代理服务器不就是瓶颈。问:你懂不懂Session,Session不能移动到前端服务器?答:我懂,Session就是保存用户连接的状态和上下文的,我blabla说方案。那个经理HR说:分布式架构或网格不能用在Web服务器上,因为Web服务器的负载本身很重,你用分布式系统会降低服务器性能。此时来了个电话,我就那苦想,实在想不出来好的方法。他接完电话,我给他说了个最SB的方法。我说在后台添加一台专用服务器,专门存放Session,后台服务器用Session就去查询。这个问题终于到这了。后来回来问做过这的同学,同学说是这样。这个经理还真有耐心一直引导我答对了才肯放手。

 

    问:当前有一个日志记录了某个大型网站的访问记录,记录中记录着访问IP和其他信息,记录大概有十几亿条,问我现在要输出每一条IP所属的省份,怎么做?答:建数据字典,我可以通过trie建数据字典。问:时间复杂和空间复杂度多少?答:IPv4有4个字段,IP地址有2^32个,那么Trie的深度为4,每个节点的大小为256,通过二分查找时间复杂度为4log256=512,时间复杂度为O(1);Trie是前缀树,IP地址有2^32个,故Trie树的空间复杂度小于4*2^32。又问了一遍那个问题,我还是原样回答的。问:那么怎么压缩那个数据字典呢?我刚开始想这个问题。hr 又问:如果当前有一张表记录了每个省份的IP区段该怎么做呢?(我豁然开朗,呕用IP区间表示可以压缩数据字典)答:还是可以用Trie树做,Hash函数也可以做。问:哈希函数怎么写?我仔细一想关键字是区间,串或数字的话写哈希函数容易,区间哈希函数似乎很难做,都没见过,心想惨了,自己把自己给套死了。答:对哦,这是个区间用哈希不好做,还是用Trie树,blabla说了一堆。他似乎没明白,我就数据结构画了一下,然后举了个例子。问:给你一张表里面存放了很多IP,怎么确定该IP是否在表中?答:排序加二分查找。问:如果给的表里面是IP区间了?答:还是排序加二分查找。汗,这个问题也到这里了,回来仔细一想还真提了不少问题。

 

     hr 看了一下手表,问:有一个数组a,其中有n个数,找出数组中最大的数,写出代码,要求时间和空间复杂度最低。我想这是个查找问题,查找最快是二分查找和二叉搜索树,复杂度logn,但要求数组有序。排序后选时间复杂度最低nlogn。想不出更高效的方法,1分钟直接给了个单步扫描数组一遍的程序,时间复杂O(n),空间复杂度O(1)。不过我觉得这最后个题目不会这么简单吧,但有想不出更高效的算法。有谁想出来更高效的算法请留言告知。

 

    问:你还有什么问题要问吗?我问:那个网络蜘蛛的算法题目的答案是怎么样的?他跟我说了,汗啦思路错了,其实是个很简单的题目,想不到那儿去,先排序,排好序之后在替换,回来在BBS上问,那天面的几个同学当场也没弄出来。出来的时候主动跟HR握了个手,说了声谢谢就出来了。HR GG都没说让我回家等下一轮通知的话,完全没谱,昨晚和今天都没接到面试的电话,上BBS问也没动静,甘着急。

 

    这就是我一面百度的全过程,感觉Session那个题没答好,想了一堆方法,最后才给出了正确的方案。到今天为止还没见人拿到商务搜索的下轮面试通知,不会挂掉了吧。泪奔呀,很想进百度呀,准备百度半个月了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值