当前位置: 首页 > 文档资料 > Python 数据结构 >

Graph Algorithms

优质
小牛编辑
130浏览
2023-12-01

图是解决许多重要数学挑战的非常有用的数据结构。 例如,计算机网络拓扑或分析化学化合物的分子结构。 它们还用于城市交通或路线规划,甚至用于人类语言和语法。 所有这些应用程序都有一个共同的挑战,即使用它们的边缘遍历图形并确保访问图形的所有节点。 有两种常见的已建立的方法来进行这种遍历,如下所述。

深度优先遍历:

也称为深度优先搜索(DFS),此算法遍历深度病房运动中的图形并使用堆栈记住在任何迭代中发生死角时获取下一个顶点以开始搜索。 我们使用set数据类型在python中为图形实现DFS,因为它们提供了跟踪访问和未访问节点所需的功能。


class graph:
    def __init__(self,gdict=None):
        if gdict is None:
            gdict = {}
        self.gdict = gdict
# Check for the visisted and unvisited nodes
def dfs(graph, start, visited = None):
    if visited is None:
        visited = set()
    visited.add(start)
    print(start)
    for next in graph[start] - visited:
        dfs(graph, next, visited)
    return visited
gdict = { "a" : set(["b","c"]),
                "b" : set(["a", "d"]),
                "c" : set(["a", "d"]),
                "d" : set(["e"]),
                "e" : set(["a"])
                }
dfs(gdict, 'a')

执行上述代码时,会产生以下结果 -

a b d e c

广度优先遍历

也称为广度优先搜索(BFS),该算法遍历图宽度区域运动并使用队列记住在任何迭代中发生死角时获取下一个顶点以开始搜索。 请访问我们网站上的此链接,了解图表的BFS步骤的详细信息。

我们使用前面讨论的队列数据结构在python中为图形实现BFS。 当我们继续访问相邻的未访问节点并继续将其添加到队列中时。 然后我们开始只将没有未访问节点的节点出列。 当没有下一个相邻节点被访问时,我们停止程序。

import collections
class graph:
    def __init__(self,gdict=None):
        if gdict is None:
            gdict = {}
        self.gdict = gdict
def bfs(graph, startnode):
# Track the visited and unvisited nodes using queue
        seen, queue = set([startnode]), collections.deque([startnode])
        while queue:
            vertex = queue.popleft()
            marked(vertex)
            for node in graph[vertex]:
                if node not in seen:
                    seen.add(node)
                    queue.append(node)
def marked(n):
    print(n)
# The graph dictionary
gdict = { "a" : set(["b","c"]),
                "b" : set(["a", "d"]),
                "c" : set(["a", "d"]),
                "d" : set(["e"]),
                "e" : set(["a"])
                }
bfs(gdict, "a")

执行上述代码时,会产生以下结果 -

 a c b d e