《算法导论》第六部分图算法

简要的做一些记录,还有一些没看懂的地方先标记着以后再重新回过头来看。

22.1          图的表示

   图的两种表示方法:

                          1、邻接表

                                    优点:邻接表表示法稍作修改,就能支持其他多种图的变体,因而有很强的适应性。

                                    缺点:如果要确定图中某条边是否存在,只能在顶点u的邻接表中搜索v,除此之外,没有其他更快的方法。

                          2、邻接矩阵

                                   优点:简单明了,在图较小时,更多采用邻接矩阵来表示;

                                           若图不是加权图,在存储邻接矩阵的每一个元素时,可以只用一个二进位,而不必用一个字的空间。

                                   缺点:

                                   特点:一个图的邻接矩阵表示需要占用Θ(v2)的存储空间,它与图中的边数多少是无关的。


22.2       广度优先搜索

     相关:Prim最小生成树算法和Dijkstra单源最短路径算法

     该算法之所以称为广度优先搜索,是因为它始终是将已发现和未发现顶点之间的边界,沿其广度方向向外扩展。

     为了记录搜索的轨迹,广度优先搜索将每个顶点都着色为白色、灰色或黑色。算法开始时,所有的顶点都是白色,随着搜索的进行,各顶点会逐渐变成灰色,然后成为黑色。

     队列Q来管理所有的灰色顶点

         注:1、d[u]表示顶点u到源顶点s的距离

     运行时间分析:广度优先搜索的运行时间是图G的邻接表大小的一个线性函数。

     最短路径:广度优先搜索可以得到从已知源顶点到每个可达顶点的距离,其实也就是最短距离。

                 具体的证明暂时看不懂,就先略了。

     广度优先树


22.3       深度优先搜索

    深度优先搜索和广度优先搜索有很多相同的地方,比如说他也是把每个节点都标记成三种颜色(白,灰,黑),而且其涂色的规则也基本相同等。

   但是,不同的是,深度优先搜索产生的先辈子图有多棵树构成,因此,形成了一个由多棵树构成的森林。

     有两个时间戳:第一个是第一次被访问到变灰色的时间;

                        第二个是第一次被访问到变黑色的时间。

     后面还有像:括号定理,后裔区间嵌套以及白色路径定理,暂时还没看懂,先放着吧。


     记得有人告诉我,理解深搜之前,必须要深刻地理解递归的精髓,在我做深搜之前,我看了模板代码之后,我认为他和递归回溯没有区别,但是,现在看来还是有一定的区别和联系,深搜则是建立在递归和回溯的基础之上,加上了判定,标记,循环等,这更象是递归和回溯的集成和封装,呵呵,这也只是个人浅薄的理解,如有不正确的地方请帮我及时指出!

     深搜虽然没有用到栈,但实际上可以把他看成是模拟,因为回溯也是一个返回之前状态的过程,而深搜就显而易见是一个队列的模式进行搜索。

     深搜不一定能够找到离起始点最短的路径,但深搜可以(如果存在的话),而且,对于某个问题,深搜不是万能的,广搜则是万能的。两种搜索各有所长,各有所短,具体问题具体分析,能够找到一个适合的方式去解题才是最关键。







            If you have any questions about this article, welcome to leave a message on the message board.



Brad(Bowen) Xu
E-Mail : maxxbw1992@gmail.com


原文地址:https://www.cnblogs.com/XBWer/p/2558585.html