【发布时间】:2018-05-31 21:33:24
【问题描述】:
我正在处理一个有向图,我很困惑 Alberto Miranda 对 Quora 的解释如何得出时间复杂度 O(n+m) [我假设他的意思是 O(V+E) 用于顶点和边]。
可以在时间 O(n+m) 内将边列表 L 转换为邻接表表示 A。然后,可以在 O(n+m) 时间内对表示 A 执行 DFS,总共 O(n+m)。
以下是我对从一种表示形式转换为另一种表示形式的理解:
对于从边缘列表到邻接列表的转换:
我的理解是,我们所要做的就是遍历每条边并添加到每个边列表中第一个顶点的邻接列表中,从而给出O(E) 的时间复杂度。我错过了什么?我假设n 和m 变量分别指的是顶点和边,但请随时纠正我。
邻接表到边表的转换:
我尝试了这种转换,只是想看看他是否指的是逆转换。要从邻接列表切换,我必须遍历每个顶点 V,然后遍历 V 的每个边 E 给我 O(V+E)。
我为它写了代码来检查
这是我所代表的图表: 需要注意的是,顶点 3 不是邻接表表示中的键,因此不包含在从邻接表到边表的转换中。
from collections import defaultdict
class AdjacencyListGraph:
def __init__(self):
self.graph = defaultdict(list)
def addEdge(self, u, v):
self.graph[u].append(v)
class EdgeListGraph:
def __init__(self):
self.graph = []
def addEdge(self, u, v):
self.graph.append([u, v])
def addAllEdgesAtOnce(self, edgeList):
self.graph = edgeList
def edgeListToAdjacencyList(edgeListGraph):
adjacencyListGraph = AdjacencyListGraph()
for edge in edgeListGraph.graph:
adjacencyListGraph.addEdge(edge[0], edge[1])
return adjacencyListGraph
def adjacencyListToEdgeList(adjacencyListGraph):
edgeListGraph = EdgeListGraph()
for vertex in adjacencyListGraph.graph.keys():
for child in adjacencyListGraph.graph[vertex]:
edgeListGraph.addEdge(vertex, child)
return edgeListGraph
edgeList = [
[1, 2],
[2, 3],
[1, 3],
[4, 1],
[4, 5],
[5, 6],
[6, 4]
]
edgeListGraph = EdgeListGraph()
edgeListGraph.addAllEdgesAtOnce(edgeList)
adjacencyListGraph = edgeListToAdjacencyList(edgeListGraph)
print(adjacencyListGraph.graph)
# trying to reverse the conversion
convertedEdgeListGraph = adjacencyListToEdgeList(adjacencyListGraph)
print(convertedEdgeListGraph.graph)
给出结果
>>> defaultdict(<class 'list'>, {1: [2, 3], 2: [3], 4: [1, 5], 5: [6], 6: [4]})
>>> [[1, 2], [1, 3], [2, 3], [4, 1], [4, 5], [5, 6], [6, 4]]
所以我的转换工作。
这些帖子与邻接列表有关,但未提及时间复杂度。
【问题讨论】:
标签: python graph big-o adjacency-list