Go程序员面试分类模拟题24.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

Go程序员面试分类模拟题24

论述题

1.?题目描述:

??搜索引擎会通过日志文件把用户每次检索使用的所有查询串都记录下来,每个查询串的长度为1~255字节。

??假设目前有1000万个记录(这些查询(江南博哥)串的重复度比较高,虽然总数是1000万,但如果除去重复后,不超过300万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请统计最热门的10个查询串,要求使用的内存不能超过1G。

正确答案:

从题目中可以发现,每个查询串最长为255个字节,1000万个字符串需要占用2.55G内存,因此无法把所有的字符串全部读入到内存中处理。对于这类型的题目,分治法是一个非常实用的方法。

??方法一:分治法

??对字符串设置一个Hash函数,通过这个Hash函数把字符串划分到更多更小的文件中,从而保证每个小文件中的字符串都可以直接被加载到内存中处理,然后求出每个文件中出现次数最多的10个字符串;最后通过一个小顶堆统计出所有文件中出现最多的10个字符串。

??从功能角度出发,这种方法是可行的,但是由于需要对文件遍历两遍,而且Hash函数也需要被调用1000万次,所以性能不是很好,针对这道题的特殊性,下面介绍另外一种性能较好的方法。

??方法二:map法

??虽然字符串的总数比较多,但是字符串的种类不超过300万个,因此可以考虑把所有字符串出现的次数保存在一个map中(键为字符串,值为字符串出现的次数)。map所需要的空间为300万×(255+4)=3MB×259=777MB(其中,4表示用来记录字符串出现次数的整数占用4个字节)。由此可见1G的内存空间是足够用的。基于以上的分析,本题的求解思路为:

??(1)遍历字符串,如果字符串在map中不存在,则直接存入map中,键为这个字符串,值为1。如果字符串在map中已经存在了,则把对应的值直接加1。这一步操作的时间复杂度为O(n),其中n为字符串的数量。

??(2)在第一步的基础上找出出现频率最高的10个字符串。可以通过小顶堆的方法来完成,遍历map的前10个元素,并根据字符串出现的次数构建一个小顶堆,然后接着遍历map,只要遍历到的字符串的出现次数大于堆顶字符串的出现次数,就用遍历的字符串替换堆顶的字符串,然后再调整为小顶堆。

??(3)对所有剩余的字符串都遍历一遍,遍历完成后小顶堆中的10个字符串就是出现次数最多的字符串。这一步的时间复杂度为O(nlog10)。

??方法三:trie树法

??方法二中使用map来统计每个字符串出现的次数。当这些字符串有大量相同前缀的时候,可以考虑使用trie树来统计字符串出现的次数。可以在树的结点中保存字符串出现的次数,0表示没有出现。具体的实现方法为,在遍历的时候,在trie树中查找,如果找到,则把结点中保存的字符串出现的次数加1,否则为这个字符串构建新的结点,构建完成后把叶子结点中字符串的出现次数设置为1。这样遍历完字符串后就可以知道每个字符串的出现次数,然后通过遍历这个树就可以找出出现次数最多的字符串。

??trie树经常被用来统计字符串的出现次数。它的另外一个用途就是字符串查找,判断是否有重复的字符串等。

[考点]如何查询最热门的查询串

?

2.?题目描述:

??已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

正确答案:

这个题目从本质上而言也是求解数据重复的问题,一般而言,对于这类问题首先会考虑位图法。对于本题而言,8位电话号码可以表示的范围为:00000000~99999999,如果用1bit表示一个号码,总共需要1亿个bit,大约100MB的内存。

??通过上面的分析可知,这道题的主要思路为:申请一个位图并初始化为0,然后遍历所有电话号码,把遍历到的电话号码对应的位图中的bit设置为1。当遍历完成后,如果bit值为1则表示这个电话号码在文件中存在,否则这个bit对应的电话号码在文件中不存在。所以bit值为1的数量就是不同电话号码的个数。

??那么对于这道题而言,最核心的算法是如何确定电话号码对应的是位图中的哪一位。下面重点介绍这个转化的方法,这里使用下面的对应方法。

?应位图最后一位:0x0000…000001。

?应位图倒数第二位:0x0000…0000010(1向左移一位)。

?应位图倒数第三位:0x0000…0000100(1向左移2位)。

?应位图的倒数十三位:0x0000…0001000000000000。

??通常,位图都是通过一个整数数组来实现的(这里假设一个整数占用4个字节)。由此可以得出通过电话号码获取位图中对应位置的方法为(假设电话

文档评论(0)

江南博哥 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档