某服务器流量统计器,每天有1000亿的访问记录数据,包括时间、url、ip。设计系统实现记录数据的
保存、管理、查询。要求能实现一下功能:
(1)计算在某一时间段(精确到分)时间内的,某url的所有访问量。
(2)计算在某一时间段(精确到分)时间内的,某ip的所有访问量。
假设某个网站每天有超过10亿次的页面访问量,出于安全考虑,网站会记录访问客户端访问的ip地址和对应的时间,如果现在已经记录了1000亿条数据,想统计一个指定时间段内的区域ip地址访问量,那么这些数据应该按照何种方式来组织,才能尽快满足上面的统计需求呢,
设计完方案后,并指出该方案的优缺点,比如在什么情况下,可能会非常慢?
腾讯1.服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。
腾讯2.如何求根号2的值,并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。
如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串。
创新工场面试题:abcde五人打渔,打完睡觉,a先醒来,扔掉1条鱼,把剩下的分成5分,拿一份走了;b再醒来,也扔掉1条,把剩下的分成5份,拿一份走了;然后cde都按上面的方法取鱼。问他们一共打了多少条鱼,写程序和算法实现。提示:共打了多少条鱼的结果有很多。但求最少打的鱼的结果是3121条鱼(应该找这5个人问问,用什么工具打了这么多条鱼)。
1.猴子分桃问题的答案是:3121
#include <stdio.h> //返回值>0,成功 int divide(int InputNumber) { int i; int MidNumber; for (i=0; i<5; i++) //5个猴子分别对桃子操作一遍 { if (InputNumber <= 0) //不能没有桃子 return -1; InputNumber -= 1; if ((InputNumber % 5) != 0) //拿走1个桃子,余下的还能分成5堆 return -1; MidNumber = InputNumber / 5; //分出的每一堆不能是空 if (MidNumber == 0) return -1; InputNumber -= MidNumber; //拿走一堆桃子 } return InputNumber; } int main() { int i; for (i=0; ; i++) { if (divide(i) > 0) break; } printf("猴子分桃问题的答案是:%d\n", i); return 0; }
2.如何从[1-7]范围的数构造更大范围的数呢?同时满足这个更大范围的数出现概率是相同的,可以想到的运算包括两种:加法和乘法
考虑下面的表达式:7 * (rand7() – 1) + rand7();
可以计算得到上述表达式的得到的等概率随机数的范围是[1, 49] 。
下面考虑如何从[1, 9]范围的数生成[1, 5]的数呢?
可以想到的方法就是 rejection sampling 方法,即生成[1, 49]的随机数,如果数的范围不在[1, 10]内,则重新取样。
解决方法:
int rand10()
{
int val = 0;
do {
val = 7 * (rand7() - 1) + rand7();
} while (val > 10);
return val;
}
归纳总结:
将这个问题进一步抽象,已知random_m()随机数生成器的范围是[1, m] 求random_n()生成[1, n]范围的函数,m < n && n <= m *m 一般解法:
int random_n()
{
int val = 0 ;
int t; // t为n最大倍数,且满足 t <= m * m
do {
val = m * (random_m() - 1) + random_m();
} while (val > t);
return val;
}