【问题标题】:Graph: time & space complexity of changing from edge list to adjacency list representation and vice versa图:从边缘列表更改为邻接列表表示的时间和空间复杂度,反之亦然
【发布时间】: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) 的时间复杂度。我错过了什么?我假设nm 变量分别指的是顶点和边,但请随时纠正我。

邻接表到边表的转换:

我尝试了这种转换,只是想看看他是否指的是逆转换。要从邻接列表切换,我必须遍历每个顶点 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]]

所以我的转换工作。

这些帖子与邻接列表有关,但未提及时间复杂度。

Post 1

Post 2

【问题讨论】:

    标签: python graph big-o adjacency-list


    【解决方案1】:

    我的理解是,我们所要做的就是通过每个边缘,然后 添加到每个边列表中第一个顶点的邻接列表 从而给出 O(E) 的时间复杂度。

    将边缘列表转换为邻接列表确实是O(E)。有E个边,所以应该有E个操作。 然而,打印(或呈现)邻接列表本身是O(V+E)。这就是为什么。

    想一想,如果任何顶点之间没有边,你仍然必须遍历每个顶点,你最终会得到这样的结果:

    {1: [], 2: [], 3: [], 4: [],... v: []}
    

    所以V的操作次数是必须的。最重要的是,如果边确实存在,则必须为每个顶点打印相邻顶点。您必须总共打印 E 次相邻的顶点。总和为 O(V+E)。

    总结一下: 从边缘列表转换为邻接列表:O(E) 呈现邻接表(独立于转换):O(V+E)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      相关资源
      最近更新 更多