CII 复习笔记 10

第十章


这笔记是我在上周飞旧金山的飞机上写的,写的比较多。

第十章是系统设计以及scalability,这个其实比算法要难,主要是没有什么经验

 

10.1 设计一个数据服务系统,你需要设计development,rollout,ongoingmonitoring, maintenance of feeding

 

首先,我不懂那几个名词到底啥意思

 

我理解的数据服务系统是这样的,本质上是一个远程只读数据库,用户通过TCP传输简单message,然后根据需要

传输数据,数据传输的检测和维护,可以直接交给TCP的机制完成。然后没了。(BTW,现在cluster间的传输模式主要是MPI,而MPI是使用TCP的协议的)

我突然发现其实network这个东西还是很重要的。http也是使用TCP协议。

 

当然我怀疑这样在面试中应该是死得惨惨的

 

书上是这么分析的:

1. 用户要好用

2. 系统要尽可能简单

3. 在现实生活中,要考虑future demand

4. scalability 以及 efficiency

 

方法一:直接plain txt download,问题是这样是由用户来做parsing

 

方法二:直接一个database,rollback之类的就解决了,问题是,我们不需要大部分的SQL的功能。而且我们需要额外

的层去检查数据。

 

方法三:XML,XML是share data的标准方法,大部分语言都可以兼容。但是XML必须给用户所有数据,query会是

一个问题

 

然后提到说,可以使用一个web service做一个外层,所以httprequest应该也是work的,应该用http。。。

 

所以,我的答案其实不算太糟糕

 

10.2 设计一个数据结构, 做social network,完成connectivity的算法

 

首先的想法就是维护每个人两个set,然后connectivity用BFS解决。

一个问题就是在这类老掉牙的问题里面,set好还是list就够了

如果做BFS,你需要遍历所有的element,所以基本上是没有区别,set的好处在于检测,比如说谁是不是你的好友这种

但是memory的使用总是要大一些。

 

书上给出了一个关于大量数据的时候咋办的解决方案

 

第一点是用ID作为identifier

然后每个人的大部分数据可能在不同的机器上,所以需要一个personID 到 machineID的map

然后就是需要一个叫做machine的class,可以从给定的machineID获得person的实际数据

 

然后书上没有讲的问题是,具体怎么实现从不同机器拿到ID的问题

我的理解是,每一个机器都要维护同样结构的full map,然后需要得到person的数据的时候,使用TCP传输。

 

确实需要知道一般cluster数据都是怎么传输的,这个我特么还真的不是很清楚。

 

 

减少machine jumps,可能需要在同一个机器里面做完这个机器里面有的search

 

另外关于BFS,根据书上的结论,似乎可以在每一层尽量使用朋友最多的那些人开始search,但是这个显然需要一些工作,

但是实际上很难解决时候先search最多的那个,因为如果你把朋友个数同时implement了,那么当你修改数据的时候,你

全网络都要改,很麻烦。除非允许不同步。

 

另外就是可以做一级或者多级缓存。

 

10.3 给你40亿正整数,找一个不存在数,你的内存是1GB,

 

40亿整数是16GB,但是40亿就是2^32,可以使用整个内存,也就是8Gb,然后做一个巨大的数组。。。。

 

如果只有10MB的时候该怎么做呢,给出的做法非常有意思,先把2^32分割成N份,然后先记录在连续的每一份里面。10MB是2^23,

所以range size就是2^31/2^23。

 

然后再做第二轮计数。

 

这题怎么觉得像是programming pearls里面的

 

 

10.4 4KB memory,找到所有的duplicatevalue,你有1到N的所有数字,N最大32000

 

4KB 是多少bit, 32000.。。。。

 

既然就是所有数字,一旦检测已存在就print。。

 

10.5 web crawler,如何避免infiniteloop

 

所有的agent 共享一个state map? 我的想法

 

然后书上说了问题主要在于如何定义the same的问题,URL中得parameter可能是一个问题。而内容分析可能也不够好

 

书上的做法是,生成一个signature,然后根据signature进行检测,如果最近检测过,那么就放到database的lowpriority区域

 

10.6 你有100亿个URL,如何找到duplicate one

 

方法一,这个很重要,就是你还是有机会把duplicate放在同一个disk里面的。就是用一个hash function,然后hash(u)/memorysize

然后可以调节这个size,使得你可以放进memory,之后就是建一个hash table。当然有一个问题就是hashtable所用的memory基本上

是不确定的。。。。。

 

方法二: 多机器一起操作。需要考虑failure的问题

 

10.7 建立一个简单的网络搜索引擎,100个机器用来respond to query, 然后另外的一个cluster用来做query,每次具体机器

并不确定,并且process search非常昂贵。问如何cacheresult,以及data 变了之后如何update

 

先说说我的想法,首先第一个问题是,使用什么样的结构来保存cache,必须是一个query本身作key的map。然后这个map必须是频

繁地在所有的processing cluster上共享。然后update的问题,假设map本身是fix size的,那么replace谁呢?只能是replace最久没有被

检查到的,但是这样的话,map似乎就不是一个好选择了。似乎应该使用一个deque,凡是被最近查询的都放在最前面,然后新查询的

调换最后一个,同时用一个hashmap去maintian这个deque的index 查询

 

基本上跟书上给出的第一种方法一致。书上用的是linkedlist加map,map直接map到Node上,但是应该是map到node的 pointer上

当然我不知道java是不是直接就是reference。

 

但是没有说关于update的问题,如果网页变了,你咋办?

 

似乎最好的办法就是一个auto time-out,这个可以是这样的,检查进map,如果time out了,就删除并且重新检测。另外time-out的时间

可以根据内容来搞。


最后一题,结果是面试的那家公司给我的题,似乎也是他们目前的问题所在。不过我给了一个更加复杂的方法来做,我觉得那个方法我当时能想到还是很屌的。


你可能感兴趣的:(CII 复习笔记 10)