数据结构图之上吊攻略

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wydyd110/article/details/82944392

六度分割理论(小世界理论,六度空间理论):你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个中间人你就能够认识任何一个陌生人。

从陈家庄到张家村,怎么走最快呢?怎么修公路使得村村通的花费最少呢?

 

以上例子都是在实际中的应用。

1 图的定义与术语

一种“多对多”的关系。

采用G= (V,E) 表示
—— V 是顶点 (vertex) 集合
—— E 是边 (edge) 的集合

1.1 无向图

1.2 有向图(directed graph)

1.3 标号图(labeled graph)

1.4 带权图(weighted graph)

1.5 顶点的度

1.6 子图

1.7 回路 (cycle,也称为环)

回路:起点等于终点的路径

1.8 有根图(树,森林)

1.9 连通图

图中任意两顶点均连通

对无向图 G= (V,E) 而言,如果从 V1 到 V2 有一条路径 (从 V2 到 V1 也一定有一条路径) ,则称 V1 和V2 是连通的 (connected)

2.0 无向图连通分支(连通分量)

2.1 其他

2.2 网络(Activity On Vertex,AOV)

2 图的存储结构

2.1 相邻矩阵(adjacency matrix,或邻接矩阵)

(1)有向图的相邻矩阵

(2)无向图的相邻矩阵

对于无向图的存储,可以省一半空间


2.2 邻接表( adjacency list )

(1)无向图的邻接表表示

无向图同一条边在邻接表中出现两次

(2)带权图的邻接表表示

(3)有向图的邻接表(出边表)

(4)有向图的逆邻接表(入边表)

2.3 十字链表 (Orthogonal List)

十字链表 (Orthogonal List) 可以看成是邻接表和逆邻接表的结合

参考:《高级数据结构之猝死攻略(一)》

3 图的遍历(graph traversal)

给出一个图G和其中任意一个顶点V0,从V0出发系统地访问G中所有的顶点,每个顶点访问而且只访问一次

会遇到的问题:

(1)从一顶点出发,可能不能到达所有其它的顶点
         如:非连通图
(2)也有可能会陷入死循环
         如:存在回路的图

解决办法:

(1)为每个顶点保留一个 标志位 (mark bit)
(2)算法开始时,所有顶点的标志位置零
(3)在遍历的过程中,当某个顶点被访问时,其标志位就被标记为已访问

3.1 深度优先遍历(depth-first search,DFS)

类似于树的先序遍历


3.2 广度优先遍历(breadth-first search,BFS)

类似于树的层序遍历


3.3 拓扑排序(topological sort)

如果图中从V到W有一条有向路径,则V一定排在W之前。满足此条件的顶点序列称为一个拓扑序列
 获得一个拓扑序的过程就是拓扑排序
AOV如果有合理的拓扑序,则必定是有向无环图(Directed Acyclic Graph, DAG)

网络(AOV)为带权的连通图

4 最短路径

4.1 单源最短路径(single-source shortest paths)

某固定源点出发,求其到所有其他顶点的最短路径。‘

4.1.1 无权图的单源最短路算法

按照递增(非递减)的顺序找出到各个顶点的最短路

4.1.2 有权图的单源最短路算法

按照递增的顺序找出到各个顶点的最短路

4.2 每对结点间的最短路径

任意两顶点间的最短路径
 

5 最小生成树(minimum-cost spanning tree, MST)

5.1 贪心算法

5.2 Prim 算法

5.3 Kruskal 算法

(1)

(2)

(3)

(4)

攻略结束,各位可以开始上吊了。


本文参考自:

张铭《数据结构与算法》

陈越,何钦铭《数据结构》

程杰《大话数据结构》

猜你喜欢

转载自blog.csdn.net/wydyd110/article/details/82944392