搜狐是一家挺大的公司,在搜索(浏览器)、新闻、视频、输入法(搜狗)、游戏等方面均有涉猎。
面试没那么正规,因为就面试我一个人。一位正在工作的大哥拿着电脑来面试我。
先自我介绍一下,然后给我出了一道题:
给你一个随机函数rand2(),它等概率地返回0或者1,让你写一个函数等概率返回3,5,7三种数字。
首先想到的肯定是二进制。3是011,5是101,7是111。只有前两位在变。可是我当时有点着急,思路很混乱,随便写了个
x=rand2()<<2|rand2()<<1|rand2()
y=(x%3)*2+3
return y
这显然不对呀,0,1,2,3,4,5,6,7 模3为0,1的概率为3/8,模3为2的概率为2/8。可是当时太蠢了,就是没想清楚。
第二个问题,写SQL语句。
订单表有四个属性:user_id,order_id,time,money,表示用户交了多少钱的订单。
要求查询昨天交钱前100的用户及交钱金额。
我想这太简单了
select user_id,money from
order_table where time>昨天开始时间 and time<昨天结束时间
order by money desc
limit 100
面试官说:昨天一个用户可能交了好几次钱。
我恍然大悟
select user_id,sum(money) as sum_money
from order_table where time>昨天开始时间 and time<昨天结束时间
order by sum_money desc
group by user_id
limit 100
不知道为啥,就面试了大概20分钟,问了也就这两个问题,不知道能不能过,过不过都行。
骑车回来的路上,还在思考第一道题。
突然想到,3,5,7的前两位是01,10,11,如果产生了00继续循环不就完了。
x=0
while x==0 : x=rand2()<<1|rand2()
return x<<1|1
跟林教主说了这个问题后,林教主果然见多识广,说算法导论上有这道题。
原题是这样的:rand2()这个函数返回0的概率为p,返回1的概率为1-p;要求写一个函数等概率返回0,1,2。
答案是这样:
x=rand2()<<2|rand2()<<1|rand2()
if x==1:return 0
elif x==2:return 1
else x==4:return 2
得到这个答案之后,接着想。
1位二进制数有两种:0概率为p,1概率为q
2位二进制数有三种:00概率为pp,11概率为qq,01、10概率为pq,所以2为二进制数的容量就是2
3位二进制数有:000概率ppp,001、010、100概率为ppq,110,101,011概率为qqp,111概率为qqq,所以容量为3
用f(n)表示n位二进制的容量,那么f(n)就等于c(n,n/2),也就是组合数最大的那个数。
所以如果要求等概率返回m个数字,那么至少需要n位二进制数,n为满足c(n,n/2)>=m
的最小的整数。
下面正式提出一个更形式化的问题:
给定一个不等概率N随机数生成器,要求构造一个等概率的M随机数生成器,要求M随机数生成器尽量少调用N随机器,求M随机数生成器调用N随机数生成器的平均次数。
这个问题第一步需要构造M随机数生成器,第二步需要计算期望。
以“不等概率2随机器构造等概率3随机器”为例进行说明:
000 continue
001 return 0
010 return 1
100 return 2
011 return 0
110 return 1
101 return 2
111 continue
上面这种构造方式能够充分利用编码,从而无用编码只有000和111
设2随机器产生0的概率为p,产生1的概率为q,其中p+q=1;那么一次命中的概率为k=1-ppp-qqq,期望尝试次数为1/k,每次尝试需要调用3次2随机器,所以期望为3/k。
当p=q=1/2时,一次命中的概率为1-(1/2)^3-(1/2)^3=3/4
,期望尝试次数为4/3次,即1.3333333次,需要调用2随机器4次。
由此又可构造一道更复杂的问题:
小明有一个不等概率2随机器,小刚在小明基础上实现了一个等概率3随机器,小刚发现rand3()每次运行需要平均调用rand2()6.25次,求小明不等概率2随机器产生0的概率和产生1的概率各为多少?
解:设小明的不等概率随机器产生0的概率为p,产生1的概率为q。
则p+q=1,1/(1-ppp-qqq)=6.25/3
得到:ppp+qqq=0.52,p+q=1
解此一元三次方程组即可得到概率p,q
面试终究是没有通过,收到拒绝邮件的时候还是惆怅了半天。我觉得我面试失败就失败在第一道题没反应过来。
面试当然是不可能完全公平的测量每个人的水平,他们只能择优录取。面试也是十分注重发挥、十分注重运气的,一切看点。
面试是有时间限制的,每个面试官面试一个人的时间是固定的。面试官一般都会准备若干个问题,按照顺序挨个问你,就像考试一样。如果在前面卡壳太久,后面面试官就没时间问你别的问题了。你的水平也就无从展示了。