0
点赞
收藏
分享

微信扫一扫

171 五只猴子分桃 176 淘宝面试题 找这两个点的共同的祖先 179 统计 时间段内的区域 ip 地址访问量,数据何种方式来组织


1.  

五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,


它吃掉了一个,拿走了一堆;  第二只猴子起来一看,只有四堆桃。于是把四堆合在一

起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;.....其他几

只猴子也都是  这样分的。问:这堆桃至少有多少个?(朋友说,这是小学奥数题)。


参考答案:

剩余的桃子: 

第1只猴子:x=x-(x-1)/5-1 == 4/5(x-1)  如果有1只猴子,那桃子数为:5^1-4

第2只猴子:x=x-(x-1)/5-1 == 4/5(x-1)  如果有2只猴子,那桃子数为:5^2-4

第3只猴子:x=x-(x-1)/5-1 == 4/5(x-1)  如果有3只猴子,那桃子数为:5^3-4

第4只猴子:x=x-(x-1)/5-1 == 4/5(x-1)  如果有4只猴子,那桃子数为:5^4-4

第5只猴子:x=x-(x-1)/5-1 == 4/5(x-1)  如果有5只猴子,那桃子数为:5^5-4

so,桃子数为5^5-4==3121 



6.  

淘宝面试题:有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。

这个一个考虑的是存储的问题,一个公共祖先的问题; 
如果不能都存入内存,树存储在文件中,遍历到当前节点,如果当前节点不在内存中,从文件读入,再处理
寻找公共祖先问题,有LCA等算法;

转载个别人的算法,但是很明显从根开始遍历的,不好:
1、一个结点是另一个结点的祖先,这种情况第一个结点是两个结点的共同祖先;
2、第三个结点是两个结点的共同祖先。
递归遍历每个结点,
如果当前结点是空结点,返回NULL,
如果当前结点等于两个结点中的一个,返回当前结点指针
递归遍历当前结点的所有子树,返回n个结点指针,
如果只有一个指针非NULL,说明两个结点都在那棵子树中,返回那棵子树的指针,
如果有两个指针非NULL,说明当前结点是这两个结点的共同祖先,返回当前结点指针。 

9. 


假设某个网站每天有超过 10 亿次的页面访问量,出于安全考虑,网站会记录访问客户

端访问的 ip 地址和对应的时间,如果现在已经记录了 1000 亿条数据,想统计一个指定

时间段内的区域 ip 地址访问量,那么这些数据应该按照何种方式来组织,才能尽快满

足上面的统计需求呢,

设计完方案后,并指出该方案的优缺点,比如在什么情况下,可能会非常慢?


参考答案:

用 B+树来组织,非叶子节点存储(某个时间点,页面访问量),叶子节点是访问的IP地址。

这个方案的优点是查询某个时间段内的IP访问量很快,

但是要统计某个IP的访问次数或是上次访问时间就不得不遍历整个树的叶子节点。

或者可以建立二级索引,分别是时间和地点来建立索引。 


举报
0 条评论