原题:
各位参赛选手,
以下是2013渣打科营编程马拉松大赛的样题。样题题型及难易程度仅供参考。
由于国内两大网络(电信和网通)之间的互联互通问题,使得电信用户访问网通机房或者网通用户访问电信机房都无法获得满意的访问速度。为了解决这个问题,国内大型网站都在两个网络内部署有对应的服务器。你现在所做的是前端加速产品,这个产品可以根据用户的访问IP,以及用户的访问目的地,导向对应的DNS服务器。
比如,存在配置表(配置表可多达2000-5000万条记录):
58.16.0.0-58.16.255.255 mail.google.com name-server-1
58.16.0.0-58.16.255.255 weibo.com name-server-2
那么对于某用户,ip地址为,58.16.128.1,访问目的地为mail.google.com,则应该返回DNS服务器name-server-1。要求该产品每秒能处理不小于1000个请求。请设计对应的方案。
想法:
============================================================================
解决这种问题对我来说最重要的是理解题意:
1.同样域名的网站 有两台服务器,分别是电信和网通,
2.DNS服务器一共就两台,一个把域名解析到电信的机房,一个把域名解析到网通的机房
3.根据用户所在的是电信还是网通,返回给用户两台DNS中的一个
4.一次输入输出之间的距离间隔不超过 1ms
为了解决问题,再作两个假设:
1.可以判断任意ip是电信还是网通,无论是文件还是服务
2.内存大于等于2G(因为要在内存中做哈希表)
如果以上理解和假设正确的话,那么问题的思路就是这样的
1.给每个ip地址 建立 哈希映射,分别对应内存中的一个bit ,这样需要内存 2^32 个bit位,大约520M内存,ip的哈希就直接去了中间的点取值就行了
2.给每个域名建立哈希映射,具体的哈希函数用md5 加密后的中间的26位 ,这样可以得到 67,108,864个 ,对于50,000,000来说足够了,重复的部分用链表
3.遍历配置表,分别填充 ip哈希表 和 域名哈希表 ,name-server-1 置1 , name-server-2 置0
4.根据访问这的ip和域名 分别作哈希 然后查表比较 ,对得到的值做判断返回 哪一个 name-server-2
这里有几个问题:
1.实际当中对于 ip的 哈希表用不了那么大,因为好多重复的
2.可能我的问题理解错了,每一个网站会对应一个 name-server,这样的话就需要用到 数据库 索引之类的东西了
3.字符串到bit的 哈希算法会有比md5更好的
最后是我自己 以前写的一个网址去重的程序,可以参考思路:
https://github.com/ningjingdemayi/websiteCheckRepeat