[在python中实现图形]:是否优先于字典的连接节点列表?

时间:2016-02-07 08:05:16

标签: python python-2.7 dictionary

我有一个创建节点图/地图的任务。

GRAPH = {}

""" ===================================================================
    This function makes a network out of the two nodes
    node1, node2 and puts them in a dictionary: graph
    ---------------------
    node1 : Dictionary
        key: node2 [neighbouring node]
        value: 1
    ---------------------
    node2 : Dictionary
        key: node1 [neighbouring node] 
        value: 1
===================================================================== """
def make_link(graph, node1, node2):
    if node1 not in graph:
        graph[node1] = {}
    (graph[node1])[node2] = 1
    if node2 not in graph:
        graph[node2] = {}
    (graph[node2])[node1] = 1
    return graph

flights = []
flights.append(("LAX","DFW"))
flights.append(("SAE","LAX"))
flights.append(("ORD","LAX"))
flights.append(("ORD","SAE"))

for (x,y) in flights:
    make_link(GRAPH, x, y)

print GRAPH

输出:

codewingx@CodeLair:~/repo/python/Graphs$ python map.py
{'DFW': {'LAX': 1}, 'LAX': {'DFW': 1, 'ORD': 1, 'SAE': 1}, 'ORD': {'LAX': 1, 'SAE': 1}, 'SAE': {'ORD': 1, 'LAX': 1}}

我发现它是多余的,因为只有连接的节点的值为1.

Q1。我不应该使用连接节点列表而不是内部字典吗? 喜欢:

{'DFW': ['LAX'], 'LAX': ['DFW', 'ORD', 'SAE'], 'ORD':['LAX','SAE'],'SAE':['ORD','LAX']}

Q2。我是否应该添加所有节点并在连接其他0时给它们值1?

1 个答案:

答案 0 :(得分:1)

Q1:不会。对于会员资格测试,列表的字典会更慢。您可以使用set的dict来避免冗余1值。

但是,在使用图表时,我们经常需要与节点和边缘关联的额外信息("标签","着色")。例如。在您的示例中,您可以存储每条边的航班价格或持续时间 - 它自然会取代1。

(这适用于有向图,其中LAX-> SAE和SAE-> LAX价格是独立的。无向图是更难实现的;一个巧妙的技巧是一个字典,其是2元素frozenset;但复制数据可能最简单。)

Q2:没有理由浪费(大多数图表的边缘远小于n ** 2)并且在动态添加/删除节点时很难维护。您可以使用collections.defaultdict(int) 模拟 0,无论您在哪里存储1(警告:它会在访问时 存储 0)但我建议仅查看node2 in graph[node1]进行连接性检查,并留下graph[node1][node2]以获取额外的边缘数据(如果有)。