图形GyD.F4y2Ba
在自然世界和社会中,有许多系统都适用于数学和计算建模。然而,并不是所有的东西都很容易被编码为一个有坐标和动量的粒子系统。一些系统和问题,如社会网络、生态和遗传调控方案,本质上是与时空描述分离的,而是更自然地以反映其拓扑性质的图来表达。简单地说,图表就是节点和边缘的集合,节点代表了某些类别的对象,如人、公司董事会、蛋白质或地球上的目的地,而边缘则代表了友谊、桥梁或分子结合的相互作用。GyD.F4y2Ba
内容GyD.F4y2Ba
什么是图?GyD.F4y2Ba
以美国东海岸的公路系统为例。道路检查员的任务是撰写关于每条公路现状的报告。对他来说,穿越所有城市最经济的方式是什么?这个问题可以用图来建模。GyD.F4y2Ba
事实上,由于图是点和线,它们看起来像的路线图。该点被称为顶点或节点和线被称为边缘。它们可以具有分配给它们的值(加权),或者它们可能只是一个路径(未加权)的存在仅仅指示器。更正式地说,一个图可被定义如下:GyD.F4y2Ba
曲线图GyD.F4y2Ba 由一组的GyD.F4y2Ba 的GyD.F4y2Ba顶点GyD.F4y2Ba(或者GyD.F4y2Ba节点GyD.F4y2Ba)和一套GyD.F4y2Ba 边缘(或GyD.F4y2Ba圆弧GyD.F4y2Ba),使得每个边缘GyD.F4y2Ba 与一对顶点相关联GyD.F4y2Ba .曲线图GyD.F4y2Ba 与顶点GyD.F4y2Ba 和边缘GyD.F4y2Ba 被编写为GyD.F4y2Ba .GyD.F4y2Ba
因为图是如此普遍,所以定义不同类型的图是很有用的。以下是最常见的图表类型:GyD.F4y2Ba
无向图:GyD.F4y2Ba无向图是指它的边没有方向,也就是说没有方向与任何边相关联。边缘GyD.F4y2Ba 和GyD.F4y2Ba 是等价的。GyD.F4y2Ba
有向图:GyD.F4y2Ba有向图有向图GyD.F4y2Ba 由一组GyD.F4y2Ba 顶点(或节点)和一组边(或弧),使得每个边缘的GyD.F4y2Ba 与一个有序顶点对相关联。如果有一条边GyD.F4y2Ba ,它是从边缘完全不同GyD.F4y2Ba .GyD.F4y2Ba
有向无环图GyD.F4y2Ba有向无环图(DAG)是一个没有有向环的有向图。循环是任何路径GyD.F4y2Ba 使得这些边GyD.F4y2Ba 那GyD.F4y2Ba 那GyD.F4y2Ba ,GyD.F4y2Ba 所有存在,从而形成一个循环。DAG是没有一个单一周期的曲线图。GyD.F4y2Ba
列出所有边缘和无向图的顶点GyD.F4y2Ba 在上图中。GyD.F4y2Ba
这个图GyD.F4y2Ba 由顶点集合组成GyD.F4y2Ba = {马萨诸塞州,缅因州,康涅狄格州,纽约州,马里兰州,新泽西州}。GyD.F4y2Ba
它的边缘GyD.F4y2Ba {(缅因州,马萨诸塞州),(马萨诸塞州,康涅狄格州),(康涅狄格州,纽约州),(纽约,缅因州),(纽约,马萨诸塞州),(新泽西州,缅因州),(马里兰州,纽约州),(缅因州马里兰州)}。GyD.F4y2Ba
注意,由于图是无向的,元组在表示边时的顺序并不重要。GyD.F4y2Ba
图的表示GyD.F4y2Ba
上面我们通过绘制它代表了一个曲线图。为了表示它在一台计算机,但是,我们需要这些图的更正式的方式。在这里,我们讨论了代表图的两种最常见的方式:邻接矩阵和邻接表。GyD.F4y2Ba
的邻接矩阵GyD.F4y2Ba
表示上述使用邻接矩阵图形。GyD.F4y2Ba
为了获得该图的邻接矩阵,我们第一个标签的行和列与相应的有序顶点。如果存在两个顶点之间的边缘GyD.F4y2Ba 和GyD.F4y2Ba ,则在矩阵它们相应的细胞将被分配GyD.F4y2Ba .如果不存在边,则单元格将被赋值GyD.F4y2Ba .上图的邻接矩阵是这样的GyD.F4y2Ba
邻接表GyD.F4y2Ba
图的邻接表表示是一种将图中的每个顶点(或节点)与其各自的相邻顶点列表相关联的方法。一种常见的方法是创建一个GyD.F4y2Ba哈希表GyD.F4y2Ba.该表将包含每个顶点作为键,并将该顶点的相邻顶点列表作为值。GyD.F4y2Ba
对于上面的例子,邻接表的表示法如下:GyD.F4y2Ba
我们可以看到,由于邻接矩阵非常稀疏,所以邻接表在内存上的开销要小得多。GyD.F4y2Ba
大多数图算法都涉及到访问每个顶点GyD.F4y2Ba ,从根节点开始GyD.F4y2Ba .有实现这一目标的几种方法。最常见的两种遍历算法是广度优先搜索和深度优先搜索。GyD.F4y2Ba
广度优先搜索GyD.F4y2Ba
在一个GyD.F4y2Ba广度优先搜索GyD.F4y2Ba,我们从开始节点开始,接着是它的相邻节点,然后从开始节点通过一条路径可以到达的所有节点包含两条边、三条边,以此类推。形式上,BFS算法访问图中的所有顶点GyD.F4y2Ba ,这是GyD.F4y2Ba 远离源顶点的边GyD.F4y2Ba 访问任何顶点之前GyD.F4y2Ba 边走。这样做,直到没有更多的顶点是从可达GyD.F4y2Ba .下面的图片展示了这个遍历过程:GyD.F4y2Ba
对于一个图GyD.F4y2Ba 和源顶点GyD.F4y2Ba ,宽度优先搜索遍历的边缘GyD.F4y2Ba 找到所有可到达的顶点GyD.F4y2Ba .它也计算到任何可到达顶点的最短距离。在广度优先搜索树对应于从根的最短路径中的两个点之间的任何路径GyD.F4y2Ba 到任何其他节点GyD.F4y2Ba .GyD.F4y2Ba
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16GyD.F4y2Ba |
|
我们可以把BFS中的三种顶点看作是GyD.F4y2Ba树GyD.F4y2Baverties,那些已被截取的数据结构。GyD.F4y2Ba边缘GyD.F4y2Ba顶点,那些与树顶点相邻但尚未访问的顶点,以及GyD.F4y2Ba未被发现的GyD.F4y2Ba顶点,那些我们还没有遇到的顶点。如果每个访问的顶点都连接到使其被添加到数据结构中的边,那么这些边就形成了树。GyD.F4y2Ba
为了系统地搜索图的连通分量,我们从边缘上的一个顶点开始,其他所有顶点都不可见,然后执行以下步骤,直到所有顶点都被访问过:“移动一个顶点。GyD.F4y2Ba 从边缘到树,并把任何看不见的顶点相邻GyD.F4y2Ba 。在边缘”图遍历方法,它是如何决定哪个顶点应该从边缘到树被移动差异,广度优先搜索,我们要选择的,这是至少最近遇到边缘的顶点,这与使用一个队列来保存在边缘的顶点。GyD.F4y2Ba
什么是队列的状态在BFS的每一次迭代中,如果从节点'叫什么名字?GyD.F4y2Ba
下表显示了作为过程的队列的内容。BFS访问上图中的顶点。BFS将访问与DFS相同的顶点。在这个例子中,它们都是。GyD.F4y2Ba
深度优先搜索GyD.F4y2Ba
深度优先搜索GyD.F4y2Ba探索边出了最近发现的顶点GyD.F4y2Ba 仍然有未开发的边缘离开它。Once all of ’s edges have been explored, the search “backtracks” to explore edges leaving the vertex from which was discovered. This process continues until we have discovered all the vertices that are reachable from the original source vertex. If any undiscovered vertices remain, then depth-first search selects one of them as a new source, and it repeats the search from that source. The algorithm repeats this entire process until it has discovered every vertex:
- 访问一个顶点GyD.F4y2Ba .GyD.F4y2Ba
- 马克GyD.F4y2Ba 参观了。GyD.F4y2Ba
- 递归访问每个未访问的顶点GyD.F4y2Ba .GyD.F4y2Ba
递归执行DFS的:GyD.F4y2Ba
1 2 3 4 5GyD.F4y2Ba |
|
非递归实现DFS的,它延迟一个顶点是否已经被发现,直到顶点已经从栈中弹出。GyD.F4y2Ba
1 2 3 4 5 6 7 8 9GyD.F4y2Ba |
|
对比遍历GyD.F4y2Ba
与树遍历类似,广度优先搜索的代码与深度优先搜索的代码略有不同。最常被提及的区别是,BFS使用队列来存储替代选择,而不是堆栈。然而,这个小小的变化导致了一个经典的图遍历算法。深度优先搜索沿着一条路径进行,直到这条路径通向目标或达到极限。当一条路被完全探索完时,我们就回到原路。然而,BFS同时从起始位置探索所有路径。GyD.F4y2Ba
当我们增大图的大小时,深度优先搜索和广度优先搜索之间的对比非常明显。深度优先搜索通过寻找远离起始点的新顶点来探索图,只有当遇到死点时才取更近的顶点;广度优先搜索完全覆盖了起点附近的区域,只有当所有接近的东西都被查看过时,才会进一步搜索。同样,访问节点的顺序很大程度上取决于这种顺序对顶点在邻接表中出现顺序的影响。GyD.F4y2Ba
额外问题GyD.F4y2Ba
约翰生活在十个房屋的树上,它是他和在树冠上的其他居民的最理想和田园诗般的地方。他们在这些房屋中投入了大量的时间,并确保没有其他人孤立的房子,他们在每个房子之间建造了一个新鲜,精致的桥梁!GyD.F4y2Ba
不幸的是,十屋之树也不能幸免于雷雨,桥梁也没有精心设计。这是一个危险的夜晚,狂风呼啸,雨雪交加,所以桥的几率并不高——每一座桥的存活几率似乎都和被摧毁的几率一样大!GyD.F4y2Ba
幸运的是,由于十屋树上有这么多桥,当约翰第二天早上醒来时,他发现他可以只用现有的桥去每一所房子,尽管可能需要绕道。当他们开始重建时,约翰变得很好奇。他们这么幸运的几率有多大?GyD.F4y2Ba
更正式地说,如果GyD.F4y2Ba 是概率,在风暴之后,约翰能够遍历每个房子,是什么GyD.F4y2Ba
细节和假设:GyD.F4y2Ba
- 事实上,十个房屋的树木含有精确的10个房屋。GyD.F4y2Ba
- 在暴风雨来临之前,每一对独特的房子之间都有一座桥。GyD.F4y2Ba
- 暴风雨以独立的概率摧毁每一座桥GyD.F4y2Ba .GyD.F4y2Ba
- 约翰被允许穿过别人的房子来试图达到所有人,但他必须只使用幸存的桥梁到达那里。允许没有藤蔓摆动。GyD.F4y2Ba