第9章 图论和网络爬虫

以下内容学习、摘录自《数学之美》

第9章 图论和网络爬虫_第1张图片

离散数学包括数理逻辑、集合论、图论和近世代数四个分支。它是当代数学的一个重要分支,也是计算机科学的数学基础。第8章谈到了如何建立搜索引擎的索引,那么如何自动下载互联网所有的网页呢?这需要用到图论中的遍历( Traverse)算法。

图论的起源可追溯到大数学家欧拉( Leonhard Euler)。1736年,欧拉来到普鲁士的哥尼斯堡( Konigsberg,大哲学家康德的故乡,现在是俄罗斯的加里宁格勒),发现当地居民有一项消遣活动,就是试图将下图中的每座桥恰好走过一遍并回到原出发点,但从来没有人成功过。

第9章 图论和网络爬虫_第2张图片

欧拉证明了这种走法是不可能的,他的方法是:把每一块连通的陆地作为一个顶点,每一座桥当成图的一条边,那么就把哥尼斯堡的七座桥抽象成下面的图。

对于图中的每一个顶点,将与之相连的边的数量定义为它的度( Degree)。

定理:如果一个图能够从一个顶点出发,每条边不重复地遍历一遍回到这个顶点,那么每一顶点的度必须为偶数

证明:假如能够遍历图的每一条边各一次,那么对于每个顶点,需要从某条边进入顶点,同时从另一条边离开这个顶点。进入和离开顶点的次数是相同的,因此每个顶点有多少条进入的边,就有多少条出去的边。也就是说,每个顶点相连的边的数量是成对出现的,即每个顶点的度都是偶数。

在“哥尼斯堡的七座桥抽象图”中,与多个顶点相连的边的数量(度)为奇数,因此,这个图无法从一个顶点出发,遍历每条边各一次然后回到这个顶点。

图的遍历算法分两种:1.广度优先搜索(Breath-First Search,简称BFS);2.深度优先搜索(Depth-First Search,简称DFS)。

现在看看图论的遍历算法和搜索引擎的关系。互联网虽然很复杂,但是说穿了其实就是一张大图而已——可以把每一个网页当作一个节点,把那些超链接( Hyperlinks)当作连接网页的弧。网络爬虫( Web Crawlers)用图的遍历算法,自动地访问到每一个网页并把它们存起来。

“如何构建一个网络爬虫”是我在 Google最常用的一道面试题,能有效地考察出一个候选人的计算机科学理论基础、算法能力及工程素养。这道题的妙处在于它没有完全对和错的答案,但是有好和不好、可行和不可行的答案,而且可以不断地往深处下问。一个好候选人的标准时:即使他没做过网络爬虫,也能较全面的考虑各种问题。而那些仅仅有执行能力的三流工程师, 往往没有“考虑周全”的思维习惯

网络爬虫在工程实现上要考虑的细节非常多,其中大的方面有这样几点:首先,用BFS还是DFS?虽然从理论上讲,这两个算法(在不考虑时间因素的前提下)都能够在大致相同的时间1里“爬下”整个“静态”互联网上的内容,但是工程上的两个假设—不考虑时间因素,互联网静态不变,都是现实中做不到的。网络爬虫对网页遍历的次序不是简单的BFS或者DFS,而是有一个相对复杂的下载优先级排序的方法。管理这个优先级排序的子系统一般称为调度系统( Scheduler),由它来决定当一个网页下载完成后接下来下载哪一个。

为了防止一个网页被多次下载,网络爬虫使用散列表(Hash Table,也叫哈希表)来记录哪些网页已经被下载过。在一台下载服务器上建立和维护散列表并不是一个难事,但“量变导致质变”,互联网巨大的网页数量导致必须用上千台服务器一起下载网页,这时维护一张统一的散列表就不那么简单了。首先,这张散列表会大到一台服务器存储不下,其次,还要解决并发问题。

在图论出现后的很长时间里,现实世界中图的规模都是在几千个节点以内(比如公路图、铁路图等)。那时候,图的遍历比较简单,因此在工业界没有多少人专门研究这个问题。过去,即使是计算机专业的学生大部分人也体会不到这个领域的研究有什么实际用处,因为大家在工作中可能永远用不上。但是随着互联网的出现,图的遍历方法一下子有了用武之地。很多数学方法就是这样,看上去没有什么实际用途,但是随着时间的推移会突然派上大用场。这恐怕是世界上还有很多人毕生研究数学的原因。

点击这里可以查看《数学之美》的其它学习笔记。

你可能感兴趣的:(第9章 图论和网络爬虫)