码迷,mamicode.com
首页 > 其他好文 > 详细

图的存储结构

时间:2015-05-20 11:24:21      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

图是由边的集合及顶点的集合组成。如果一个图的顶点是有序的,则称为有向图,否则称为无向图,下图展示了有向图和无向图。

技术分享

其中,无向图也可以称为无序图。

技术分享

         顶点的是和顶点相关联的边的数目。

         下面介绍一下图的存储结构,由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,也就是说,图没有顺序映像的存储结构,但是我们还是可以通过数组的数据类型表示元素之间的关系。在实际的应用中,常用的结构有邻接表,邻接多重表和十字链表。下一节我会通过使用javascript中的数组来表示图,所以这里就不介绍了。

邻接表

         接下来看看邻接表,是图的一种链式存储结构。图中每个结点对应一个单链表,单链表中的结点由三个域组成,其中邻接点域(adjvex)指示与顶点邻接的点在图中的位置;链域(nextarc)指示下一条边或弧的结点;数据域(info)存储和边或弧相关的信息,比如权值。在单链表的表头有一个表头结点,表头结点由链域(firstarc)指向链表中的第一个结点,数据域(data)指向其他信息。结构如下:

技术分享

         而这些表头结点则通常是以顺序结构的形式存储,以便随机访问任一顶点的链表。如果无向图中有n个顶点,e条边,而它的邻接表需要n个头结点和2e个表结点。因为表结点要考虑所有结点之间的相互关联,也就是说是边的两倍。

         输入顶点信息即为顶点的编号,则建立邻接表的时间复杂度为O(n+e),否则,需要通过查找才能得到顶点位置,则建立邻接表的时间复杂度为O(n*e)。邻接表结构如下:

技术分享

邻接矩阵

         下面说下邻接矩阵,邻接矩阵就是将顶点的双边关系存放到矩阵中,通过邻接矩阵可以判定任意两个顶点之间是否有边相连,并容易求得各个顶点的度。若考虑无向图的对称性,可以只存入矩阵的下三角或上三角元素,邻接矩阵如下:

技术分享

构建n个顶点和e条边的无向图的时间复杂度为O(n2+e*n),其中初始化耗费O(n2)。邻接矩阵的优势在于当图的密集度比较大时使用比较好。

十字链表

接下来介绍十字链表,十字链表是有向图的另一种链式存储结构。先来分析下刚刚介绍过的邻接表,邻接表很容易找到以v为头的弧,却很难找到以v为尾的弧,这是因为表头结点的缘故。所以需要十字链表,在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点也有一个结点。这些结点的结构如下所示:

技术分享

弧结点中有5个域:其中尾域(tailvex)头域(headvex)分别指示弧尾和弧头这两个顶点在图中的位置,链域(hlink)指向弧头相同的下一条弧,而链域tlink指向弧尾相同的下一条弧,info域指向该弧的相关信息。

弧头相同的弧在同一链表上,弧尾相同的弧也在同一链表上。它们的头结点即为顶点结点,它由3个域组成:其中data域存储相关信息,firstinfirstout两个域,分别指向以该顶点为弧头或弧尾的第一个弧结点。结构示例如下:

技术分享

         所以,在十字链表中很容易找到以v为头的弧,也容易找到以v为尾的弧。而且建立十字链表的时间复杂度和建立邻接表是一样的,所以在有向图的应用中,十字链表是很有用的工具。

邻接多重表

         最后讨论一下邻接多重表,虽然邻接表是无向图的一种很有效的存储结构,在邻接表中容易就得顶点和边的各种信息。但是,在邻接表中每一条边有两个结点,分别在对应节点的链表中,这给某些图的操作带来了不便。比如,在某些情况下需要对边进行操作,如对已被搜索过的边作记号或删除一条边时,此时需要找到表示一条边的两个顶点,这样就会比较繁琐。这时,邻接多重表的作用就会得到体现。

         邻接多重表的结构和十字链表相似,在邻接多重表中,每一条边用一个结点表示,它由如下6个域组成:

技术分享

         mark标志域,可用于标记该条边是否被搜索过;ivexjvex为该边依附的两个顶点在图中的位置;ilink指向下一条依附于顶点ivex的边;jlink指向下一条依附于顶点jvex的边,info为指向和边相关的各种信息的指针域。每个顶点也用一个结点表示,它由如下所示的两个域组成:

技术分享

         data域存储有关信息,firstedge域指示第一条依附于该顶点的边。邻接多重表结构示例如下:

技术分享

技术分享



图的存储结构

标签:

原文地址:http://blog.csdn.net/mevicky/article/details/45867211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!