更改

跳到导航 跳到搜索
删除116字节 、 2020年11月8日 (日) 17:37
无编辑摘要
第1行: 第1行: −
 
+
{{#seo:
 
+
|keywords=图论,有限图,邻域集
 
+
|description=图论,计算机科学,顶点
 
+
}}
'''<font color="#ff8000">图论</font>'''<font color="#ff8000">计算机科学</font>'''中,'''<font color="#ff8000">邻接表 Adjacency List </font>'''是用来表示'''<font color="#ff8000">有限图</font>'''的无序表的集合。每个列表描述图中一个顶点的邻域集。这是计算机程序中常用的几种图形表示法之一。
+
[[图论]][[计算机科学]]中,'''邻接表 Adjacency List'''是用来表示'''有限图 '''的无序表的集合。每个列表描述图中一个顶点的邻域集。这是计算机程序中常用的几种图形表示法之一。
 
   
 
   
[[文件:Simple cycle graph.svg.png|right|缩略图|
+
[[文件:Simple cycle graph.svg.png|right|缩略图|此无向循环图可以用三个无序列表来描述:{a,b},{a,c},{b,c}]]
图:此'''<font color="#ff8000"> 无向循环图</font>'''可以用三个无序列表来描述:{a,b},{a,c},{b,c}]]
      
==实现==
 
==实现==
第27行: 第26行:  
* Cormen et al. suggest an implementation in which the vertices are represented by index numbers.<ref>{{cite book| title = Introduction to Algorithms, Second Edition| publisher = MIT Press and McGraw-Hill | year = 2001|author1 = Thomas H. Cormen|author2 = Charles E. Leiserson| author3 = Ronald L. Rivest| author4 = Clifford Stein }}</ref> Their representation uses an array indexed by vertex number, in which the array cell for each vertex points to a [[singly linked list]] of the neighboring vertices of that vertex. In this representation, the nodes of the singly linked list may be interpreted as edge objects; however, they do not store the full information about each edge (they only store one of the two endpoints of the edge) and in undirected graphs there will be two different linked list nodes for each edge (one within the lists for each of the two endpoints of the edge).
 
* Cormen et al. suggest an implementation in which the vertices are represented by index numbers.<ref>{{cite book| title = Introduction to Algorithms, Second Edition| publisher = MIT Press and McGraw-Hill | year = 2001|author1 = Thomas H. Cormen|author2 = Charles E. Leiserson| author3 = Ronald L. Rivest| author4 = Clifford Stein }}</ref> Their representation uses an array indexed by vertex number, in which the array cell for each vertex points to a [[singly linked list]] of the neighboring vertices of that vertex. In this representation, the nodes of the singly linked list may be interpreted as edge objects; however, they do not store the full information about each edge (they only store one of the two endpoints of the edge) and in undirected graphs there will be two different linked list nodes for each edge (one within the lists for each of the two endpoints of the edge).
 
  Cormen等人提出了一种用索引号来表示顶点的实现方法。Leiserson|作者3 = Ronald L. Rivest|作者4 = Clifford Stein }}</ref>他们的表示方法使用了一个按顶点编号索引的数组,其中每个顶点的数组单元指向该顶点的相邻顶点的[[单链列表]]。在这种表示方式中,单链表的节点可以被解释为边缘对象;但是,它们并不存储每个边缘的全部信息(它们只存储边缘两个端点中的一个),在非定向图中,每个边缘将有两个不同的链表节点(边缘两个端点中的每一个在列表中)。
 
  Cormen等人提出了一种用索引号来表示顶点的实现方法。Leiserson|作者3 = Ronald L. Rivest|作者4 = Clifford Stein }}</ref>他们的表示方法使用了一个按顶点编号索引的数组,其中每个顶点的数组单元指向该顶点的相邻顶点的[[单链列表]]。在这种表示方式中,单链表的节点可以被解释为边缘对象;但是,它们并不存储每个边缘的全部信息(它们只存储边缘两个端点中的一个),在非定向图中,每个边缘将有两个不同的链表节点(边缘两个端点中的每一个在列表中)。
 +
    
它们的表示使用一个按顶点数索引的数组,其中每个顶点的数组单元格指向该顶点的相邻顶点的单链表。在这种表示中,单链表的节点可以解释为边对象; 然而,它们并不存储关于每条边的完整信息(它们只存储边的两个端点中的一个) ,在'''<font color="#ff8000">无向图 Undirected Graph </font>'''中,每条边有两个不同的链表节点(边的两个端点中的每个端点的列表中都有一个)。
 
它们的表示使用一个按顶点数索引的数组,其中每个顶点的数组单元格指向该顶点的相邻顶点的单链表。在这种表示中,单链表的节点可以解释为边对象; 然而,它们并不存储关于每条边的完整信息(它们只存储边的两个端点中的一个) ,在'''<font color="#ff8000">无向图 Undirected Graph </font>'''中,每条边有两个不同的链表节点(边的两个端点中的每个端点的列表中都有一个)。
第32行: 第32行:  
 
 
*The [[object oriented]] incidence list structure suggested by Goodrich and Tamassia has special classes of vertex objects and edge objects. Each vertex object has an instance variable pointing to a collection object that lists the neighboring edge objects. In turn, each edge object points to the two vertex objects at its endpoints.<ref name="A">{{cite book| author = Michael T. Goodrich and Roberto Tamassia | title = Algorithm Design: Foundations, Analysis, and Internet Examples| publisher = John Wiley & Sons | year = 2002  | isbn = 0-471-38365-1}}</ref> This version of the adjacency list uses more memory than the version in which adjacent vertices are listed directly, but the existence of explicit edge objects allows it extra flexibility in storing additional information about edges.   
 
*The [[object oriented]] incidence list structure suggested by Goodrich and Tamassia has special classes of vertex objects and edge objects. Each vertex object has an instance variable pointing to a collection object that lists the neighboring edge objects. In turn, each edge object points to the two vertex objects at its endpoints.<ref name="A">{{cite book| author = Michael T. Goodrich and Roberto Tamassia | title = Algorithm Design: Foundations, Analysis, and Internet Examples| publisher = John Wiley & Sons | year = 2002  | isbn = 0-471-38365-1}}</ref> This version of the adjacency list uses more memory than the version in which adjacent vertices are listed directly, but the existence of explicit edge objects allows it extra flexibility in storing additional information about edges.   
Goodrich和Tamassia提出的[[面向对象]]入射列表结构有特殊的顶点对象和边缘对象类。每个顶点对象都有一个实例变量,指向一个集合对象,该集合对象列出了邻近的边缘对象。反过来,每个边缘对象又指向其端点的两个顶点对象。<ref name="A">{{cite book| author = Michael T. Goodrich and Roberto Tamassia | title = Algorithm Design:   
+
 
 +
Goodrich和Tamassia提出的[[面向对象]]入射列表结构有特殊的顶点对象和边缘对象类。每个顶点对象都有一个实例变量,指向一个集合对象,该集合对象列出了邻近的边缘对象。反过来,每个边缘对象又指向其端点的两个顶点对象。<ref name="A">{{cite book| author = Michael T. Goodrich and Roberto Tamassia | title = Algorithm Design:   
    
这个版本的邻接表比直接列出相邻顶点的版本使用更多的内存,但是显示边对象的存在操作可以允许它在存储额外的关于边的信息方面有额外的灵活性。
 
这个版本的邻接表比直接列出相邻顶点的版本使用更多的内存,但是显示边对象的存在操作可以允许它在存储额外的关于边的信息方面有额外的灵活性。
    +
<br>
 
==操作==
 
==操作==
    
接表数据结构执行的主要操作是列出给定顶点的邻居列表。使用上面详细说明的任何表示方式,都可以在每个邻居的固定时间内执行。换句话说,列出一个顶点 ''v'' 所有邻居的总时间与 ''v'' 的'''<font color="#ff8000">度 Degree </font>'''成正比。
 
接表数据结构执行的主要操作是列出给定顶点的邻居列表。使用上面详细说明的任何表示方式,都可以在每个邻居的固定时间内执行。换句话说,列出一个顶点 ''v'' 所有邻居的总时间与 ''v'' 的'''<font color="#ff8000">度 Degree </font>'''成正比。
 +
    
也可以使用邻接列表来测试两个指定顶点之间是否存在边,但效率不高。在一个邻接表中,每个顶点的邻域都是不排序的,通过对该顶点的邻域进行顺序搜索,可以按照给定两个顶点的最小阶数按时间比例进行边的存在性测试。如果邻域被表示为一个排序数组,则可以使用二进制搜索,时间与次数的对数成正比。
 
也可以使用邻接列表来测试两个指定顶点之间是否存在边,但效率不高。在一个邻接表中,每个顶点的邻域都是不排序的,通过对该顶点的邻域进行顺序搜索,可以按照给定两个顶点的最小阶数按时间比例进行边的存在性测试。如果邻域被表示为一个排序数组,则可以使用二进制搜索,时间与次数的对数成正比。
   −
 
+
<br>
 
==权衡==
 
==权衡==
       
'''<font color="#ff8000">邻接表</font>'''的主要替代方法是'''<font color="#ff8000">邻接矩阵 Adjacency Matrix </font>''',该矩阵的行和列按顶点索引,其单元格包含一个布尔值,该值指示与单元格的行和列对应的顶点之间是否存在边。对于'''<font color="#ff8000">稀疏图 Sparse Graph </font>'''(大多数顶点对不是由边连接的图),'''<font color="#ff8000">邻接表</font>'''比邻接矩阵(存储为二维数组)更节省空间:'''<font color="#ff8000">邻接表</font>'''的空间使用与图中的边和顶点的数量成正比,而对于以这种方式存储的邻接矩阵,其空间与顶点数的平方成正比。然而,通过使用由顶点对索引的'''<font color="#ff8000">哈希表</font>'''而不是数组,可以更有效地存储邻接矩阵的空间,从而匹配'''<font color="#ff8000">邻接表</font>'''的线性空间使用。
 
'''<font color="#ff8000">邻接表</font>'''的主要替代方法是'''<font color="#ff8000">邻接矩阵 Adjacency Matrix </font>''',该矩阵的行和列按顶点索引,其单元格包含一个布尔值,该值指示与单元格的行和列对应的顶点之间是否存在边。对于'''<font color="#ff8000">稀疏图 Sparse Graph </font>'''(大多数顶点对不是由边连接的图),'''<font color="#ff8000">邻接表</font>'''比邻接矩阵(存储为二维数组)更节省空间:'''<font color="#ff8000">邻接表</font>'''的空间使用与图中的边和顶点的数量成正比,而对于以这种方式存储的邻接矩阵,其空间与顶点数的平方成正比。然而,通过使用由顶点对索引的'''<font color="#ff8000">哈希表</font>'''而不是数组,可以更有效地存储邻接矩阵的空间,从而匹配'''<font color="#ff8000">邻接表</font>'''的线性空间使用。
 +
    
'''<font color="#ff8000">邻接表</font>'''和'''<font color="#ff8000">邻接矩阵</font>'''之间的另一个显著区别是它们执行操作的效率。在'''<font color="#ff8000">邻接表</font>'''中,每个顶点的邻居可以有效地列出,在时间上与顶点的程度成正比。在'''<font color="#ff8000">邻接矩阵</font>'''中,这个操作需要的时间与图中顶点的数量成正比,而顶点的数量可能明显高于度。另一方面,'''<font color="#ff8000">邻接矩阵</font>'''允许测试两个顶点是否在固定的时间内彼此相邻; '''<font color="#ff8000">邻接表</font>'''支持这一操作的速度较慢。
 
'''<font color="#ff8000">邻接表</font>'''和'''<font color="#ff8000">邻接矩阵</font>'''之间的另一个显著区别是它们执行操作的效率。在'''<font color="#ff8000">邻接表</font>'''中,每个顶点的邻居可以有效地列出,在时间上与顶点的程度成正比。在'''<font color="#ff8000">邻接矩阵</font>'''中,这个操作需要的时间与图中顶点的数量成正比,而顶点的数量可能明显高于度。另一方面,'''<font color="#ff8000">邻接矩阵</font>'''允许测试两个顶点是否在固定的时间内彼此相邻; '''<font color="#ff8000">邻接表</font>'''支持这一操作的速度较慢。
 
   
 
   
 
+
<br>
 
==数据结构==
 
==数据结构==
       
'''<font color="32CD32">作为一种数据结构,邻接表的主要替代方法是邻接矩阵。因为邻接矩阵中的每个条目只占一个比特(bit) ,所以它可以用非常紧凑的方式表示,只占用相邻空间的n<sup>2</sup>/8}}字节,其中n是图的顶点数。除了避免占用空间外,这种紧凑性还支持局部引用locality of reference。</font>'''
 
'''<font color="32CD32">作为一种数据结构,邻接表的主要替代方法是邻接矩阵。因为邻接矩阵中的每个条目只占一个比特(bit) ,所以它可以用非常紧凑的方式表示,只占用相邻空间的n<sup>2</sup>/8}}字节,其中n是图的顶点数。除了避免占用空间外,这种紧凑性还支持局部引用locality of reference。</font>'''
 +
    
用稀疏邻接矩阵表示邻接表时,将占用更少的空间。这是因为它能避免为不存在的边分配任何空间。在一台32位计算机上,如果使用原始的数组结构实现邻接表,那么对于一个无向图来说,它大约需要占用8e字节的存储空间,其中e表示边的个数。每条边都将会在两个邻接表中重复出现,并分别占用4字节空间。
 
用稀疏邻接矩阵表示邻接表时,将占用更少的空间。这是因为它能避免为不存在的边分配任何空间。在一台32位计算机上,如果使用原始的数组结构实现邻接表,那么对于一个无向图来说,它大约需要占用8e字节的存储空间,其中e表示边的个数。每条边都将会在两个邻接表中重复出现,并分别占用4字节空间。
 +
    
注意到一个'''<font color="#ff8000">无向简单图</font>'''最多可以有 n<sup>2</sup>边(允许循环),我们可以让d=e/n<sup>2</sup>表示该图的密度。然后,8e>n<sup>2</sup>/8当d>1/64时,即邻接表表示比邻接矩阵表示占用更多的空间。因此,图必须足够稀疏,才适合使用邻接表表示。
 
注意到一个'''<font color="#ff8000">无向简单图</font>'''最多可以有 n<sup>2</sup>边(允许循环),我们可以让d=e/n<sup>2</sup>表示该图的密度。然后,8e>n<sup>2</sup>/8当d>1/64时,即邻接表表示比邻接矩阵表示占用更多的空间。因此,图必须足够稀疏,才适合使用邻接表表示。
 +
    
除了空间上的权衡,不同的数据结构也有着不同的操作。在邻接表中找到与给定顶点相邻的所有顶点就像读取邻接表一样简单。对于邻接矩阵,必须扫描整行,这需要花费O(n)的时间。给定的两个顶点之间是否有边可以用邻接矩阵一次确定,并且运行时间与邻接列表中两个顶点的最小度数成正比。
 
除了空间上的权衡,不同的数据结构也有着不同的操作。在邻接表中找到与给定顶点相邻的所有顶点就像读取邻接表一样简单。对于邻接矩阵,必须扫描整行,这需要花费O(n)的时间。给定的两个顶点之间是否有边可以用邻接矩阵一次确定,并且运行时间与邻接列表中两个顶点的最小度数成正比。
    +
<br>
 
==参考资料==
 
==参考资料==
    
{{reflist}}
 
{{reflist}}
   −
 
+
<br>
 
==延伸阅读==
 
==延伸阅读==
    
* {{cite web | author = David Eppstein| year = 1996| title = ICS 161 Lecture Notes: Graph Algorithms| url = http://www.ics.uci.edu/~eppstein/161/960201.html}}
 
* {{cite web | author = David Eppstein| year = 1996| title = ICS 161 Lecture Notes: Graph Algorithms| url = http://www.ics.uci.edu/~eppstein/161/960201.html}}
    +
<br>
 +
==参见==
   −
==其他链接==
+
* The Boost Graph Library implements an efficient [http://www.boost.org/libs/graph adjacency list]
 
  −
{{commons category|Adjacency list}}
  −
 
  −
* The [[Boost Graph Library]] implements an efficient [http://www.boost.org/libs/graph adjacency list]
      
* [http://opendatastructures.org/versions/edition-0.1e/ods-java/12_2_AdjacencyLists_Graph_a.html Open Data Structures, Section 12.2, AdjacencyList: A Graph as a Collection of Lists], [[Pat Morin]]
 
* [http://opendatastructures.org/versions/edition-0.1e/ods-java/12_2_AdjacencyLists_Graph_a.html Open Data Structures, Section 12.2, AdjacencyList: A Graph as a Collection of Lists], [[Pat Morin]]
       +
<br>
 +
----
 +
本中文词条由[[用户:嘉树|嘉树]]参与编译,[[用户:Zc1234567|Zc1234567]]审校,[[用户:薄荷|薄荷]]编辑,欢迎在讨论页面留言。
   −
{{Graph representations}}
+
'''本词条内容源自wikipedia及公开资料,遵守 CC3.0协议。'''
 
  −
 
  −
 
  −
[[Category:Graph data structures]]
  −
 
  −
Category:Graph data structures
  −
 
  −
类别: 图形数据结构
  −
 
  −
<noinclude>
     −
<small>This page was moved from [[wikipedia:en:Adjacency list]]. Its edit history can be viewed at [[邻接矩阵/edithistory]]</small></noinclude>
     −
[[Category:待整理页面]]
+
[[Category:图形数据结构]]
7,129

个编辑

导航菜单