百度的两道笔试题

一. 每个url 包括site 跟path两部分。site就是比如 www.baidu.com  path就是http://www.baidu.com/s?wd=%D7%D6%B7%FB%B4%A 后面那部分。 要实现方便查询更新等。同时若干服务器分别位于不同地区。
要求
1.删除、更新url,可以不实时性
2. 根据url可以找出存储位置
3. 可以找出所有site的path

要求实现上述系统,提示:url可以是分布存储的。

二. 设计一个服务调度管理器,服务器接收数据包,
数据包大小为32个字节,第一个字节是请求的优先级,后面31个字节是请求的命令,服务器根据客
户端发来的命令,分配资源,完成相应的服务,然后将操作的结果返回给客户端,但是由于服务器资源有限,故服务器可以存储操作的结果,如果下次有同样的命令
到来的时候,直接获取操作结果返回给客户端即可。
要求设计一个服务器调度管理器,满足以下调度条件:
(1)同样条件下,请求次数多的请求首先获得服务,请求次数最大255
(2)同样条件下,请求优先级高的请求首先获得服务,优先级等级最高16.
要做的是:
(1)设计服务器的核心调度算法:
(2)数据结构设计
(3)如果服务器的记录容量是20万条,分析需要占用多大内存空间??

 

 

总结一些网上的回答:

第一题:

Server Pool: [ svr1, svr2, svr3, .....svrN]
用site和服务器的数目做hash,比如
hash key(site)%N


然后url爱怎么折腾都行。

如果需要, 可以把Server Pool的数目增大(pool中可以对Server进行重用)

这就是SLB

 

 

第二题:

一种回答

数据结构,请求的调度使用链表数组(数组的每个节点指向链表,数组长度为16)来管理,操作结果使用哈希表来缓存(与请求的命令对应上)。
同一优先级的请求放在链表数组的相应节点的链表中,第一个字节改为存放请求次数(初始化为1),从前向后遍历链表,如果已经有同样的请求在链表中,则把这个请求的请求次数加1,并与它前面的节点比较,如果请求次数比前面的大,则向前移;如果没有同样的请求,则放在链表末尾。

 

另一种回答

关键是实现一个ExpiringMap,一个会维护本身容积的HashMap,内部会有一个线程定期检查请求率最低的命令将会被删除,以保证容器是在规定的大小内。ExpiringMap的key就是命令本身,值是包含命令请求数目和请求结果的对象,在每次返回结果后将会更新该Map。

还有就是实现一个PriorityQueue,实现可以参考jdk的源码,如果用jdk的PriorityQueue的话就只需要实现Comparator接口,该接口可以根据比较先检索ExpiringMap有无该命令,没有的话在比较请求的第一个字节确定命令的优先级。

所以会有一个线程负责监听请求,来了请求就放入到PriorityQueue这个队列中,插入的顺序是按照Comparator接口定义的顺序。然后会有另一个线程负责处理请求,每次从队列中取走第一个元素进行处理,如果在ExpiringMap中有该命令,直接取出结果返回。

 

一个哥们的总结:

原理性问题
基本百度的题一定要以随机访问一定要哈希表, 排序一定上快排, 查找一定要二分, 强连通分量一定要用 Tarjan 算法, 动规一定比穷举好这几种为底来扩展延伸回答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值