我已经看到了图的邻接表的多种表示形式,但我不知道要使用哪个。
class Node(object):
def __init__(self, val):
self.val = val
self.connections_distance = {}
# key = node: val = distance
def add(self, neighborNode, distance):
if neighborNode not in self.connections_distance:
self.connections_distance[neighborNode] = distance
class Graph(object):
def __init__(self):
self.nodes = {}
# key = node.val : val = node object
# multiple methods
例如图:
0连接到1和2
1连接到0和2
2连接到0和1
或者如果[a,b,c]是并且包含a,b和c的数组,并且[x-> y-> z]是包含x,y和z的链表:
表示形式:[[1->2], [0->2], [0->1]]
问题:每种表示形式的优缺点是什么,使用更广泛的是什么?
答案 0 :(得分:1)
注意:一种表示包含距离而另一种不包含距离是有点奇怪的。他们俩都容易包括距离,或者两者都忽略,所以很容易,所以我将省略细节(您可能对set()
而不是{}
感兴趣)。
这两种表示形式似乎都是邻接表的变体(在https://stackoverflow.com/a/62684297/3798897中有进一步说明)。从概念上讲,这两种表示形式之间没有太大区别-您有一个节点集合,每个节点都有一个对邻居集合的引用。您的问题实际上是两个独立的问题:
(1)您应该使用字典还是数组来保存节点集合?
(2)是否应该使用集合或链接列表来保存相邻节点的集合?
与往常一样,您的特定问题可以左右选择。例如,我提到数组的插入/删除性能要比字典差,但是如果您几乎不执行插入/删除操作,那将无关紧要,稍微减少的内存将开始具有吸引力。