更改

删除356字节 、 2020年10月21日 (三) 17:12
无编辑摘要
第102行: 第102行:  
   | title = Introduction to Algorithms, Second Edition
 
   | title = Introduction to Algorithms, Second Edition
   −
  −
 
   
这个版本的邻接表比直接列出相邻顶点的版本使用更多的内存,但是显示边对象的存在操作可以允许它在存储额外的关于边的信息方面有额外的灵活性。
 
这个版本的邻接表比直接列出相邻顶点的版本使用更多的内存,但是显示边对象的存在操作可以允许它在存储额外的关于边的信息方面有额外的灵活性。
   第110行: 第108行:     
接表数据结构执行的主要操作是列出给定顶点的邻居列表。使用上面详细说明的任何表示方式,都可以在每个邻居的固定时间内执行。换句话说,列出一个顶点 ''v'' 所有邻居的总时间与 ''v'' 的'''<font color="#ff8000">度 Degree </font>'''成正比。
 
接表数据结构执行的主要操作是列出给定顶点的邻居列表。使用上面详细说明的任何表示方式,都可以在每个邻居的固定时间内执行。换句话说,列出一个顶点 ''v'' 所有邻居的总时间与 ''v'' 的'''<font color="#ff8000">度 Degree </font>'''成正比。
      
也可以使用邻接列表来测试两个指定顶点之间是否存在边,但效率不高。在一个邻接表中,每个顶点的邻域都是不排序的,通过对该顶点的邻域进行顺序搜索,可以按照给定两个顶点的最小阶数按时间比例进行边的存在性测试。如果邻域被表示为一个排序数组,则可以使用二进制搜索,时间与次数的对数成正比。
 
也可以使用邻接列表来测试两个指定顶点之间是否存在边,但效率不高。在一个邻接表中,每个顶点的邻域都是不排序的,通过对该顶点的邻域进行顺序搜索,可以按照给定两个顶点的最小阶数按时间比例进行边的存在性测试。如果邻域被表示为一个排序数组,则可以使用二进制搜索,时间与次数的对数成正比。
第116行: 第113行:  
==权衡==
 
==权衡==
 
权衡
 
权衡
      
'''<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>'''支持这一操作的速度较慢。
第127行: 第122行:  
数据结构
 
数据结构
    +
'''<font color="32CD32">作为一种数据结构,邻接表的主要替代方法是邻接矩阵。因为邻接矩阵中的每个条目只占一个比特(bit) ,所以它可以用非常紧凑的方式表示,只占用相邻空间的n<sup>2</sup>/8}}字节,其中n是图的顶点数。除了避免占用空间外,这种紧凑性还支持局部引用locality of reference。</font>'''
   −
'''<font color="32CD32">作为一种数据结构,邻接表的主要替代方法是邻接矩阵。因为邻接矩阵中的每个条目只占一个比特(bit) ,所以它可以用非常紧凑的方式表示,只占用相邻空间的<sup>2</sup>/8}}字节,其中}}是图的顶点数。除了避免占用空间外,这种紧凑性还支持局部引用。</font>'''
+
用稀疏邻接矩阵表示邻接表时,将占用更少的空间。这是因为它能避免为不存在的边分配任何空间。在一台32位计算机上,如果使用原始的数组结构实现邻接表,那么对于一个无向图来说,它大约需要占用8e字节的存储空间,其中e表示边的个数。每条边都将会在两个邻接表中重复出现,并分别占用4字节空间。
   −
  --[[用户:黄秋莉|黄秋莉]][[用户讨论:黄秋莉|讨论]]  【审校】“其中}}是图的顶点数”中的“}}”不清楚是什么
+
注意到一个'''<font color="#ff8000">无向简单图</font>'''最多可以有 n<sup>2</sup>边(允许循环),我们可以让d=e/<sup>2</sup>表示该图的密度。然后,8e><sup>2</sup>/8当d>1/64}时,即邻接表表示比邻接矩阵表示占用更多的空间。因此,图必须足够稀疏,才适合使用邻接表表示。
   −
然而,对于一个稀疏的图,邻接表只需要较少的空间,因为它不浪费任何空间来表示边不存在。在32位计算机上使用一个简单的数组实现,一个无向图的邻接表需要大约 = 8}字节的空间,其中}是图的边数。
+
除了空间上的权衡,不同的数据结构也有着不同的操作。在邻接表中找到与给定顶点相邻的所有顶点就像读取邻接表一样简单。对于邻接矩阵,必须扫描整行,这需要花费O(n)的时间。给定的两个顶点之间是否有边可以用邻接矩阵一次确定,并且运行时间与邻接列表中两个顶点的最小度数成正比。
  --[[用户:黄秋莉|黄秋莉]][[用户讨论:黄秋莉|讨论]]  【审校】“其中}是图的边数”中的“}”不清楚是什么
+
   
 
  −
注意到一个'''<font color="#ff8000">无向简单图</font>'''最多可以有 < sup > 2 </sup > -)/2≈ v < sup > 2 </sup > }边,允许循环,我们可以让/< sup > 2 </sup > }表示该图的密度。然后,> < sup > 2 </sup >/8}当/< sup > 2 </sup > > 1/64}时,即邻接表表示比邻接矩阵表示占用更多的空间。因此,图必须足够稀疏,才适合使用邻接表表示。
  −
 
  −
除了空间上的权衡,不同的数据结构也有着不同的操作。在邻接表中找到与给定顶点相邻的所有顶点就像读取邻接表一样简单。对于邻接矩阵,必须扫描整行,这需要花费)}的时间。给定的两个顶点之间是否有边可以用邻接矩阵一次确定,并且运行时间与邻接列表中两个顶点的最小度数成正比。
  −
  --[[用户:黄秋莉|黄秋莉]][[用户讨论:黄秋莉|讨论]] 【审校】“这需要花费)}的时间”中“)}”不知道是什么内容
   
==参考资料==
 
==参考资料==
  
11

个编辑