对于一个有 V V V个点, E E E条边的图:
存储方法 | add_edge(v,w) | get_adj(v) | 遍历 | has_edge(v,w) | 空间复杂度 |
---|---|---|---|---|---|
邻接矩阵 | Θ ( 1 ) \Theta(1) Θ(1) | Θ ( V ) \Theta(V) Θ(V) | Θ ( V 2 ) \Theta(V^2) Θ(V2) | Θ ( 1 ) \Theta(1) Θ(1) | Θ ( V 2 ) \Theta(V^2) Θ(V2) |
边的集合 | Θ ( 1 ) \Theta(1) Θ(1) | Θ ( E ) \Theta(E) Θ(E) | Θ ( E ) \Theta(E) Θ(E) | Θ ( E ) \Theta(E) Θ(E) | Θ ( E ) \Theta(E) Θ(E) |
邻接表 | Θ ( 1 ) \Theta(1) Θ(1) | Θ ( d e g r e e ( v ) ) \Theta(degree(v)) Θ(degree(v)) | Θ ( V + E ) \Theta(V+E) Θ(V+E) | Θ ( d e g r e e ( v ) ) \Theta(degree(v)) Θ(degree(v)) | Θ ( V + E ) \Theta(V+E) Θ(V+E) |
在实践中,大部分图是稀疏的(节点的度不大,边较少),并且get_adj(v)
使用频率高,故邻接表的使用时最为广泛的。图类定义如下:
class Graph(object):
def __init__(self, points_nums, is_directed):
self.__points_nums = points_nums
self.__adj = [[] for _ in range(points_nums)]
self.__directed = is_directed
def add_edge(self, point1, point2):
self.__adj[point1].append(point2)
self.__in_degree[point2] += 1
if not self.__directed:
self.__adj[point2].append(point1)
def get_adj(self, point):
return self.__adj[point]
def get_point_nums(self):
return self.__points_nums