两道题(简化的搜索提示系统+随机数发生器)
一、实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
提示:
1、可以预处理日志。
2、假设query不超过10亿条,每个query不超过50字节。
3、考虑在大查询量的情况下如何实现分布式服务。
思路1:
因为可以预处理,所以先日志分析,对query进行外排序,只保留每个待搜索字符串(这个字符串可以从所有关键字中得到) 的top10 记录。然后对结果进行索引,比如用apache的lucene,或者更进一步的solr。
思路2:
搜索一般都不是即时的,即不会即时就搜索出网络上出现的新内容,也不会即时删除已经过是的内容。
日志就是一个文件,在这里就是被搜索的文件。
预处理就是有程序定时的去处理文件,按照常用的搜索关键字去完整的搜索文件,并建立索引文件,当用户搜索时,可以直接通过索引文件返回给用户。
分布式,就是拆分了,比如每个服务器分别处理不同的站点,或是一个文件中不同的区段,将处理的结果返回给主服务器,合并后返回给用户。
二、假设某一随机数发生器,产生0的概率为p,产生1的概率为1-p。
问,如何用这种随机数发生器产生各占一半的0和1?
思路1:
一个以概率p<1产生0,1-p的概率产生1。则按n重贝努利概率公式可知,连续产生两次,一共有4种可能:
组合 概率
00 p*P
01 p*(1-p)
10 (1-p)*p
11 (1-p)^2
可见01和10的概率是一样的,因此当产生01时输出0,产生10时输出1,其它情况不输出。这样输出的0和1的概率是一样的。
思路2:
用两个这样的随机数发生器,产生两组随机数,每组中0占的比例为p,1占的比例为1-p。将其中一组的0和1互换,则该组中1占的比例为p,0占的比例为1-p。合并两组,则0和1各占一半。
From:http://hi.baidu.com/tangsu2009/blog/item/f0c2a1ca6c39140fbe09e6fe.html