【问题标题】:Implementing a graph without a library in Python在 Python 中实现没有库的图
【发布时间】:2021-07-18 02:29:37
【问题描述】:

我是 Python 新手,正在尝试在不使用库的情况下构建有向图。有人可以确认我是否正确理解了这个例子吗?

from collections import defaultdict 
class Graph:
    def __init__(graph):
        graph.dict = defaultdict(list)
    def add(graph,node,adjacent_node): 
        graph.dict[node].append(adjacent_node)    #line 6
        graph.dict[adjacent_node].append(node)    #line 7

graph = Graph()
graph.add('1','2') 
graph.add('2','5') 
graph.add('2','3') 
graph.add('4','5') 
graph.add('4','3') 
graph.add('6','4') 
graph.add('6','5')
print('Dictionary:',graph.dict)

_____
Output:
Dictionary: defaultdict(<class 'list'>, {'1': ['2'], '2': ['1', '5', '3'], '5': ['2', '4', '6'], '3': ['2', '4'], '4': ['5', '3', '6'], '6': ['4', '5']})

据我了解,这个例子是构建一个无向

  • 在第 6 行,他们正在添加从原始节点到相邻节点的路径
  • 在第 7 行,他们正在添加从相邻节点 BACK 到原始节点的路径

这对吗?

如果这些是节点,我也有点困惑,为什么它们需要到下一个节点的路径?一旦我创建了 addEdges 函数,边缘是否会处理这个问题,或者这个函数是否足以同时添加节点和边缘?

example source

【问题讨论】:

  • 直到最后一段,您的理解都是正确的。 add 已经添加了边以及节点(如果它们不存在)。如果你想要一个有向图(有向图),请删除第 7 行。
  • 知道了,谢谢@ggorlen

标签: python graph directed-graph undirected-graph


【解决方案1】:

您在此处使用adjacency list 表示图表。

在您当前的实现中,add 创建从nodeadjacent_node 的无向边。 “无向边”意味着如果你在node,你可以转换到adjacent_node,如果你在adjacent_node,你可以转换到node。这是一种双向关系。

add 也会在这些节点不存在时创建这些节点,这要感谢defaultdict。将节点视为 dict 中的键,将边视为与节点关联的列表中的元素。

如果你想要一个有向图,这意味着add 应该只创建一条从源到目标的边:

def add(graph,node,adjacent_node): 
    graph.dict[node].append(adjacent_node)
    # graph.dict[adjacent_node].append(node)  # <- skip if you want a directed graph

无需在此处添加更多函数来表示图形。

【讨论】:

  • 谢谢你,你的解释清楚了很多。我指的是我正在处理的一个项目的这个例子,数据是无序的,所以我认为这会起作用。
  • 谢谢!此外,您是否会说使用邻接矩阵将是有向图的更好方法?您引用的 wiki 页面提到它是邻接列表的替代方案。
  • 表示图的方法有很多,而且它依赖于应用程序,因此客观上对于所有用例的有向图来说,这两种方法都不是更好。见1234
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
相关资源
最近更新 更多