邻接表
在图论中,邻接表代表一个图中的所有边或弧。
邻接表存储表示,需要保存一个顺序存储的顶点表和每个顶点上的边的链接表。
邻接表(Adjacency List),即数组与链表相结合的存储方法。
如果是无向图,那么每条边由两个结点组成,分别代表边的两个端点;
如果是有向图,那么每条边是一个结点对,分别代表边的始点和终点。
一般来说,邻接表是无向的。
在计算机科学中,邻接表描述一种紧密相关的数据结构,用于表征图。在邻接表的表示中,对于图中的每个顶点,我们将保存所有其它与之相连的顶点(即“邻接表”)。例如,由van Rossum提出的,使用 哈希表将每个顶点和该顶点的邻接点数组关连起来,就可以看作是上述表 示方法的一种实现。又如,在Cormenetal中,顶点数组的每个元素都指向一个邻接点单链表。
邻接表结构的困难之一是无法明确在什么地方保存相关边的长度或花销。为了解决这个问题,一些算法,如 Goodrich and Tamassia 所提出的面向对象邻接表,有时也称关联度,它为每个顶点保存一个对象表,每个对象表示指向顶点的那条边的关联度。为了完善这个结构,每条边必须指向两个组成其端点的顶点。这个额外的边对象使得它比直接列出所有边的邻接表消耗更多的内存,但它不失为一种保存边相关信息的好方法。
可用于替代邻接表的主要有邻接矩阵。用稀疏邻接矩阵表示邻接表时,将占用更少的空间。这是因为它能避免为不存在的边分配任何空间。除了空间方面的考虑外,不同的数据结构也使得不同的操作变得更容易。在一个邻接表中,给定一个顶点,我们能很容易地找出它的所有邻边,因为只需要读取它的邻接表就可以了。在一个邻接矩阵中,相同的操作则需要扫描一行,花费大约 O(n) 时间。而如果你想知道给定的两个顶点间是否存在有边,在邻接矩阵里可以立刻查到,在邻接表中则需要花费以边的最小关联度成比例的时间。
邻接表的处理方法是这样的。
1、图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
2、图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。
若是有向图,邻接表的结构是类似的,以顶点作为弧尾来存储边表容易得到每个顶点的出度,而以顶点为弧头的表容易得到顶点的入度,即逆邻接表。
对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可。