当前位置:文档之家› 算法设计与分析(第二版) 第7章

算法设计与分析(第二版) 第7章


图7-1 有向图示例
广度优先搜索直接实现了我们上述的过程。初始时,队 列Q中只含顶点s,即距离为0的顶点。对于后续距离d = 1, 2,3,…,在某时刻,队列Q中只包含距离为d的所有顶点。 随着这些顶点被处理(执行出队操作),其尚未被访问的近邻 被插入到队尾。图7-2给出了访问图7-1中顶点时的当前队列, 其中a为起始点,顶点按照字母顺序排列。队列Q中字母上 方的数字表示起始点到该顶点的距离。而且图7-2右边的广 度优先搜索树包含了每个顶点最先被访问时所通过的那些边。 由此可得,从a开始的每条路径都是最短路径。因此,这棵 树称为最短路径树(shortest path tree)。
对于图7-1,以结点a作为源点s,将该图划分为若干层: s自身,与s距离为1的那些顶点作为一层,与s距离为2的那 些结点作为另一层,以此类推。一种简便的计算从s到其他 顶点的距离的方法是逐层进行计算。一旦计算出距离为0,1, 2,…,d的那些顶点,就很容易确定出距离为d+1的顶点。 这些顶点就是那些与距离为d的那层顶点相邻的尚未被访问 的顶点。这就给出一个在任一给定时刻只有两层是活跃的迭 代算法:在某层d,其中的顶点完全被访问过;在d+1层, 要通过扫描第d层顶点的近邻,来找出该层的顶点。
表7-1 应用领域与图模型
7.1 图 的 表 示
可以使用邻接矩阵来表示一个图。对于有n(= |V|)个顶点 的图,其邻接矩阵的第(i,j)个元素为
ai, j
1, vi到v j存在一条边 0, vi、v j 间无边
其中,vi(i = 1, …, n)为图中顶点。对于一个无向图,因为其 中的每条边{u,v}可从两个方向看待,因而该邻接矩阵是对 称的。这种表示的好处是可在常量时间内检查图中是否存在 某条边,只需要访问一次内存。而矩阵需要O(n2)的空间。 如果图中的边数不是很多,这种表示方式浪费空间。
第7章 图算法
7.1 图的表示 7.2 广度优先搜索 7.3 Dijkstra算法 7.4 Bellman-Ford算法 7.5 Floyd-Warshall算法 习题
许多应用问题可以归结为图模型上的问题。因而,我们 可以用图作为表示和求解问题的工具。例如,在航线图中, 图中的顶点可以表示机场,边可以表示飞行航线,边上的权 值则可能表示距离或费用。在电路图中,图中的顶点表示逻 辑门、寄存器、引脚或处理器,边表示接线,边上的权值可 能表示接线长度或传输延迟。在作业调度问题中,图中的顶 点表示作业,边表示优先关系,边上的权值可能表示优先级。 在金融问题中,图中的顶点表示股票或流通货币,边表示交 易或事务处理,边上的权值可能表示费用。表7-1列举了不 同应用领域在图模型中的意义。
BFS算法的执行过程如图7-3所示。
图7-3 BFS算法的执行过程
7.3 Dijkstra算法
给定加权有向图G = (V,E),定义权函数w为边到其上 实值的映射w:E→R。路径p =〈v0,v1,…,vk〉上的权定 义为这条路径边上的权值之和,即
使用哪一种表示法,取决于顶点集|V|中顶点之间的关系、 图中的顶点数以及边数|E|。|E|的规模可与|V|相当或与|V|2相 当(所有边可能相连)。如果是前者,则称该图是稀疏的,否 则称该图是稠密的。我们将在后续的章节中看到,|E|与|V|之 间的这个关系将会成为我们选择合适图算法的主要因素。
7.2 广度优先搜索
图7-2 图7-1的广度优先队列Q及其广度优先搜索树
广度优先搜索算法如下所示。
前驱
BFS(G, s)
1
for each vertex v V[G] //初始化到顶点v的最短路径及
2 3 4 5 6 7 8 9 长度
do d[v]
[v] NIL
d[s] 0 Q
//初始化队列Q
ENQUEUE(Q, s)
图的另一种表示方法是邻接表表示法。这种方法只需要 与边数成正比的空间,由|V|个链表组成,每个顶点都有一个 链表。顶点u的链表存放由u出发所指向的顶点,也就是说, 存放(u,v)∈E的那些顶点v。因此,如果图为有向图,则每 条边只在一个链表中出现; 如果图为无向图,则每条边在 两个链表中出现。无论是哪种情况,数据结构的总规模为 O(|E|)。在这种情况下,检查某条边(u,v)不再为常量时间, 因为这个过程需要查找u的邻接表。但通过一个顶点的所有 近邻还是可以比较容易地完成这个过程。我们很快就可知, 这个过程证明是图算法中的一个很有用的操作。对于无向图, 这种表示是对称的,当且仅当u在v队列中存在顶点
do u DEQUEUE(Q) //摘取队列中最小元素
for each vertex v Adj[u] //更新顶点v的最短路径
10
do if d[v] =
11
then d[v] d[u] + 1
12
ENQUEUE(Q, v)
以下分析算法的运行时间。初始化后,第10行的测试保 证每个顶点至多入队一次,且至多出队一次。入队和出队操 作所需时间为常量时间O(1) O(V)。由于仅在顶点出队时才扫描该顶点的邻接表,因此, 每个邻接表至多被扫描一次。由于所有邻接表的长度之和为 Θ(E),因此扫描邻接表所花费的总时间为O(E)。初始化的开 销为O(V)。因此,BFS的总运行时间为O(V+E)。由此可得, 广度优先搜索算法的运行时间为G的邻接表表示规模的线性 时间。
广度优先搜索(Breadth First Search,BFS)是图搜索中最 简单的算法之一,也是很多重要图算法的基础算法。 Dijkstra单源点最短路径算法就使用了与BFS类似的思想。 给定一个图G = (V,E)以及一个称为源点的特殊顶点s,BFS 系统地探索图G中的边,找出由s可达的那些顶点。BFS计算 出从s到每个可达顶点的距离(最少边数)。同时,还形成一 棵根为s的广度优先树,这棵树中包括了由s可达的所有顶点。 对于由s可达的任一顶点v,在这棵广度优先树中从s到v的路 径对应于图G中从s到v的一条最短路径,也就是说,包含了 边数最少的一条路径。BFS算法对于有向图和无向图均适用。
相关主题