图的概念:
图就是有若干结点和若干它们之间的边组成的(不是任意两个结点都必须连在一起)。其实所有的数据结构都是一种图,比如链表就是一种一维的图。图是一种对现实世界的模拟,世界由若干实体和它们之间的关系组成。图也是一种网络,比如高铁路线就是图。
不管是什么时候遇到困难的编程问题,问一问自己:“如何用图来表述这个问题?”。图都是用于表示数据之间的关系。 诀窍在于如何定义“关系”。
图的代码实现:
实现的方式主要是邻接列表和邻接矩阵。
邻接列表:
从左边的图变成右边的列表,首先一个误区就是,一个图对应的不是一个只有一个头和一个尾的"一条"列表,应该有结点个数个列表。还有一个误区就是列表内部除了头结点之外,其它结点之间没有指向关系。换句话说,每个列表的意义是除了头结点之外的所有的结点在原来的图中都是指向头结点的,而这些结点之间是否指向并不知道。举例说明,在图中第一个列表说明BCD指向A,BCD之间指向关系从第一个表中并不能看出来,图中的箭头指示只是说明它们是一个列表。
邻接矩阵:
在邻接矩阵实现中,由行和列都表示顶点,由两个顶点所决定的矩阵对应元素表示这里两个顶点是否相连、如果相连这个值表示的是相连边的权重。
往这个图中添加顶点的成本非常昂贵,因为新的矩阵结果必须重新按照新的行/列创建,然后将已有的数据复制到新的矩阵中。
实现方式的选择:
“检查相邻性” 是指对于给定的顶点,尝试确定它是否是另一个顶点的邻居。在邻接列表中检查相邻性的时间复杂度是O(V),因为最坏的情况是一个顶点与每一个顶点都相连。
在稀疏图的情况下,每一个顶点都只会和少数几个顶点相连,这种情况下相邻列表是最佳选择。如果这个图比较密集,每一个顶点都和大多数其他顶点相连,那么相邻矩阵更合适。
大多数情况下使用邻接表。
python实现图:
在Python中,图主要是通过列表和词典来构造。比如说下面这张图,
A --> B
A --> C
B --> C
B --> D
C --> D
D --> C
E --> F
F --> C
就是通过下面这个字典和列表的结合进行构造:
graph = {'A': ['B', 'C'],
'B': ['C', 'D'],
'C': ['D'],
'D': ['C'],
'E': ['F'],
'F': ['C']}