首页 > 编程知识 正文

为什么选择来百度面试,腾讯面试题第二大问题

时间:2023-05-04 21:19:52 阅读:60774 作者:3738

去年腾讯的时候,面试官最后轻轻问:“百度/谷歌的搜索为什么那么快? 我记得问:“。

这个问题我很无知,从没想过搜索引擎的原理是什么

然后我想了整整2000ms毫秒,然后说:“百度会把各个网站的信息拿来,进行排序,在输入关键字的时候进行文档比对……玫瑰

面试官:这不是我想要的答案

我内心

我一直很在意这个问题,但终于今天,我写了他,稍后再问,我会直接把这篇文章扔给他!

2文字:倒排贯穿整篇文章,也是面试官想要的答案

首先百度知道一定有爬行动物。 到处爬网站,用某种处理然后你输入的关键字进行某种计算,然后返回你

处理某种计算的目录的两遍扫描法排序法

首先是某种处理

在一次处理百度取了大量的页面之后,所有的页面我们都叫它“文档”。 不能乱放。 使用文档集合,类似的文档放在一个集中

什么样的文件相似? 你可能知道,文档中有相同关键字的可以放在一个集合中

举例说明

如果世界上只有以下五个文档(网页),那么文档的内容也很简单,一句话。 (请注意,这是文档的内容,不是标题。 )

上百度后,给他们编号,扫描文档做分词。 由于百度内部有词典,匹配上的单词会被分割,所以文档1号被分割为【谷歌、地图、父亲、跳槽、脸书】,之后的文档也同样将分割后的单词反向排列处理,达到http://www

转置处理是什么? 右边乱七八糟的数字是怎么来的? 请不要着急。 请仔细看。 第一个单词“倒排列表”出现在第1、2、3、4、5号文件中了吗? 9号单词“离开”只出现在3号文档中吗?

是的,对表格进行排序是保存出现相应单词的文档编号

我想我开始知道他的目的了。 当我们搜索到“谷歌”时,他会得到与单词“谷歌”相对应的反序列表,知道哪个文档中包含他,然后不要取出这些文档这就是3358ww瓦时

但是没那么简单。 因为只有那个。 我在博客上写了所有的单词。 这样杂乱的文章不是会被全体中国人推荐吗?

因此,在对表进行排序时,还会保存以下信息

的信息分为两项组。 例如,第16个单词“网站”的(5:1 ),5表示出现的文件编号,1表示出现次数。 也就是说,有了这个信息,如果一个单词在文档中频率高,搜索引擎就可以把他往前推)。

除了频率之外,它是在第一个文档中出现过一次的单词,如“谷歌”,位于第一位,用1表示

这样的话你可能不记得有什么样的页面了,再比较一下吧

这样,搜索引擎在单词映射文档反序列表中显示谷歌包含该关键字的根据你的关键词,以及http://www.Sina.com

前面的句子很长,所以把加粗的部分连起来读也不会改变意思

事实上,很多搜索引擎基本都是这样做的,但各家都有不同的参考标准。 例如,百度会参考热度,综合评分你的搜索记录,从网站得到的钱(你知道的东西)等,根据评分的高低返回搜索结果的排名顺序

找到

假设世界上只有五个文档,上面的就足够了。 但实际上,世界上有上亿个文档。 此时,问题的性质已经改变。 寻找更快、更准确的问题而不是找不到的问题,需要算法。 也就是说,我们上面提到的文档集合

某种计算根据关键词,词典数量很多。 当xhdls输入“苹果”时,百度如何将你的关键词与在他内部倒排表格的“苹果”一词联系起来?

计算机不知道“苹果”。 在这里,可以用安静的夏天的方法将“苹果”转换为一个号码

安静的夏天是指用某种算法将单词映射到符号上。 例如,“将单词转换为其长度”是一种算法。 low,但是这样“苹果”是2,“梨”是1。 根据安静的夏天算法的不同,变换结果也不同,必然“桃”也有2一样,有——安静的夏天冲突。 此时,“

我们搜索“苹果”时,经过一个安静的夏天计算,知道它的号码是2,然后2有一个链表,里面可能保存着“苹果”。

”桃子”,“蘑菇”等,然后再遍历链表找到苹果即可

这里和java8中的hashmap思想一致,不过链表也会过长,所以可以使用别的数据结构代替,比如红黑树,b树等

解决了第一个问题,我们就可以通过关键词获得他的Id,然后得到所建立的倒排列表了,比如“谷歌

第二个问题,由于文档的数量庞大,我们获取的文档往往编号位数都很多,而不像上图那样1,2,3,4,5,导致倒排列表无谓的扩大,所以我们这里进行作差

就是后面的文档编号减去前面的,在取文档(从磁盘中读取)的时候加回来即可

第三个问题,如何从磁盘中读取文档

现在我们已经有了倒排列表

可以有两种方法从磁盘中读取文档

两次遍历法

第一遍,扫描文档集合,找到文档数量N, 文档集合内所包含的不同单词数M,和每个单词出现的频率DF(如下图),以及一些别的必要信息,这些东西所占内存加起来,得到需要开辟的内存空间,

同时这个空间是以单词为单位划分,比如“谷歌”一词有5篇文档,

第一遍主要就是确定要开辟多大的内存空间来显示文档

第二遍扫描,就是边扫描,匹配对应的文档编号(三元组中的第一个数),载入内存

但是这个方法有一个问题,那就是文档集合有多大,内存就有多大,所以,很可能内存会溢出,不过都放在内存中速度也很快,这是一种空间换时间的方法

相信你发现了,但凡涉及到读取,一定有两种以上的方法,空间优先或是时间优先,第二种就是时间换空间——排序法

排序法

现在我们只用固定大小的内存,如何从上图中的倒排列表得知每个单词对应的文章集合所需要的内存空间有多少呢?

我们需要解析文档,构造(单词ID,文档ID,单词频率)三元组,然后进行排序,按单词ID,文档ID,单词频率先后排,最后如果规定的内存满了,就将这些三元组通通写入一个临时文件A中

为什么要这样呢?想想看,如果我们最后拿到了一个(单词A,文档A,单词频率),我们就可以很轻松的知道一个单词对应哪个文档,和对应的频率,

也就是一个三元组告诉我们单词A对应的文档A,另一个三元组告诉我们单词A对应文档B……,这些三元组加起来我们就知道了单词A对应的文档集合,就可以知道他需要多少内存空间来填补这些文档了

可能解析50个文档后规定的内存就满了,然后把这些三元组们写入磁盘临时文件A,就可以再读下一篇50个文档了,注意,词典是不断增加的,比如前50个文档只有上面7个单词,后50个文档可能出现了别的单词,此时要插入词典中,词典一直在内存

这样,只用固定大小的内存就可以50一批的解析完所有文档,写入了一个个的临时文件A,B,C,D,再将这些临时文件合并,就是把他们分别读入内存中的缓冲区,合成最终索引后再写入磁盘,这样通过最终索引就知道有哪些单词对应多少文档,还有频率,然后根据这些开辟内存空间读取进入内存返回给你即可

排序法叙述起来比较复杂,但是其实理解起来很简单,耐心读一定能懂哦

限于篇幅,这里只讲了你输入关键词到他返回给你大致的网页的过程,其实,百度如何爬取网页?如何保证网页的时效性?如何筛选垃圾网站?如何分布式存储海量网页?如何应对超长关键字查询?如何根据用户历史记录精准分析用户意图?
等等都需要大量的篇幅详解,一篇文章不可能讲完,下次有机会再分析吧

作者简介 :【小松漫步】,微信公众号同名,喜欢读书和收集书,文章参考自《这就是搜索引擎核心技术详解》,关注公众号回复【搜索引擎】,即可获取资源,一起交流学习吧

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。