图的表达与遍历--邻接矩阵和邻接表

今天开始准备学习一个新的数据结构---图,貌似听着挺复杂的,当然实际也不容易啦,所以先从理论上对图有个大概的认识,其实之前咱们学的二叉树就是一种特殊的图,怎么个特殊法呢?因为它没有环,但是图是可以,它没有祖先,子孙的关系,如下:

如果任意两个结点都有一条边,如下:

此时就叫"完成图"。

那如果有一个单向的关系,如下:

此时就叫"有向图"。

那如果有一个双向的关系,如下:

那此时就叫"双向有向图"

当然图在计算机中还有其它的很多特性待之后慢慢研究,试想一样这么复杂的一个数据结构,明显比二叉树要复杂,那如何去表达它呢?这里有两种方式来表达:邻接矩阵和邻接表,具体如下:

邻接矩阵:

何为邻接矩阵,先维基百科一下:

上图还是有些抽象,下面举一个例子来展示其形成矩阵的整个过程,咱们对这样的图进行研究:

可以画一个这样的矩阵:

好,下面再来一一根据图的关系来填充这个矩阵,如下:

 

至此所有关系都表示完,剩下木有填充的框里全部用0填充,最后矩阵如下:

这样就通过邻接矩阵将咱们的图表达出来了,但是~~明显这种表式法很浪费空间,咱们举例的结点比较少,要是有100万个结点而只有5000条边呢?那浪费的空间就可想而知了,这时邻接表就可以很好的解决这个空间的问题。

邻接表:

那如果用邻接表来表示同样的图,其实是由数组与链表相结合来表式的,具体表现如下:

然后以此类推,完整的表达图的邻接表如下:

很显然这种表式图的方法相对于邻接矩阵是比较省空间的,下面来算一下这两种表示方法空间复杂度,假如图有V个结点,E条边,对于邻接矩阵表达占用的空间为V^2,因为横向和纵向都是V;而如果是用邻接表表达占用的空间则为V+E,所以说这里从空间复杂度角度来看在选择用哪种方式去表达图的时候,如果发现边比较少结点比较多时用邻接表是比较合适的,如果边不是很稀疏的时候可以选择邻接矩阵。

原文地址:https://www.cnblogs.com/webor2006/p/7866724.html