【问题标题】:Depth first search current implementation problem when I try to run it当我尝试运行它时,深度优先搜索当前的实现问题
【发布时间】:2019-01-07 12:01:58
【问题描述】:

我在这里尝试分享我的深度优先搜索 (DFS) 实现。我正在尝试了解它如何在无向图中遍历,这意味着并非所有节点都组成一个图,而是两个不同的图。我一直在寻找只有一张图的 DFS 的小基础知识。我在中遇到了一个问题“如果有多个图并且没有连接会发生什么?” 所以我开始使用我从简单 DFS 中获得的知识来研究如何做到这一点执行。但是,它比我想象的要复杂一些。这是我遇到的代码示例:

"""DFS implemention."""

    adjacency_matrix = {
                        1: [2, 3],
                        2: [4, 5],
                        3: [5],
                        4: [6],
                        5: [6],
                        6: [7],
                        7: [],
                        8: [9],
                        9: [8]
                        }

        def DFS_un(graph):
        """Traversal for undirected graphs."""
            vertices = graph[0]
            edges = graph[1]

        def visit(vertex):
            if vertex in visited:
                return
            visited.add(vertex)
            print(vertex)
            if vertex in edges:
                for e in edges[vertex]:
                    visit(e)
        visited = {}
        for v in vertices:
            visit(v)

    if __name__ == '__main__':
        DFS_un(adjacency_matrix)

错误信息是这样写的:

Traceback (most recent call last):
  File "dfs.py", line 33, in <module>
    DFS_dis(adjacency_matrix)
  File "dfs.py", line 17, in DFS_dis
    vertices = graph[0]
KeyError: 0

如果您看到,我使用的是一张图,但它有无向数,即 8 和 9 (89)。为什么我没有正确获得输出?抱歉,也学习了一些 Python3 :)。感谢您的帮助!

【问题讨论】:

  • vertices = graph[0] 是缩进错误,也指缺少键。

标签: python-3.x search graph microsoft-distributed-file-system undirected-graph


【解决方案1】:

你想要:

vertices = graph.keys()
edges = graph.values()

'Graph' 是一个字典对象。 graph[0] 表示法表示找到与 key=0 关联的值。由于您没有 key=0,因此您会收到错误消息。

您可能会将字典与列表混淆。 my_list[0] 说给我 my_list 中位置 0 的值。

【讨论】:

  • 我想将访问过的顶点作为字典保存到visited 中,这样我就可以提取访问过的顶点而无需再次计算。
  • 谢谢你帮助我,我看到了我做错了什么:)
【解决方案2】:

我已经发现了我的问题。 @blueenvelope 对字典的想法是正确的,因为没有使用关键字,因此出于某种原因给了我 0... 最后,它最终从未连接的顶点读取整个图形列表。

我的变量 verticesedges 被错误地实现并很快理解了它的目的。 Keys 用于查找特定的字典,所以我从图形顶点中提取键。我的边缘也是如此,但也会从特定键中提取这些边缘的 。这是完整的固定代码:

adjacency_matrix = {
                    1: [2, 3],
                    2: [4, 5],
                    3: [5],
                    4: [6],
                    5: [6],
                    6: [7],
                    7: [],
                    8: [9],
                    9: [8]
                    }

def DFS_un(graph):
    """Traversal for undirected graphs."""
    vertices = graph.keys()
    edges = graph.values()
    visited = []

    def visit(vertex):
        if vertex in visited:
            return
        print("Visited vertex: ")
        visited.append(vertex)
        print(visited)
        print("Current vertex: ")
        print(vertex)
        print("\n")
        if vertex in edges:
            for e in edges[vertex]:
                visit(e)
    for v in vertices:
        visit(v)

if __name__ == '__main__':
    DFS_un(adjacency_matrix)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多