博客
关于我
python图的深度优先和广度优先
阅读量:646 次
发布时间:2019-03-15

本文共 2481 字,大约阅读时间需要 8 分钟。

回溯法是一种选优搜索法,以达标为先,将不达标的路径及时回溯。结合图遍历,我们可以通过深度优先和广度优先两种算法实现对图结构的遍历。

深度优先算法

  • 从初始节点v开始标记其已访问。
  • 查找v的第一个邻接节点w。
  • 若w存在且未被访问,则继续深入;否则回溯到上一个节点,寻找下一个未被访问的邻接点。
  • 访问w并标记为已访问,继续查找w的邻接节点wi。
  • 重复上述过程直至所有节点均被访问。
  • 广度优先算法

  • 将起始节点v入队列。
  • 当队列不为空时,取出队头节点v,标记其已访问。
  • 查找v的第一个邻接节点col。
  • 若col未被访问且未入队,入队并标记已访问。
  • 继续查找下一个未被访问的邻接节点 col,并执行步骤4。
  • 当所有邻接节点处理完后,回到步骤2执行。
  • 代码示例

    class Graph(object):    def __init__(self, *args, **kwargs):        self.node_neighbors = {}        self.visited = {}    def add_nodes(self, nodelist):        for node in nodelist:            self.add_node(node)    def add_node(self, node):        if not node in self.nodes():            self.node_neighbors[node] = []    def add_edge(self, edge):        u, v = edge        if v not in self.node_neighbors[u] and u not in self.node_neighbors[v]:            self.node_neighbors[u].append(v)            if u != v:                self.node_neighbors[v].append(u)    def nodes(self):        return self.node_neighbors.keys()    def depth_first_search(self, root=None):        order = []        def dfs(node):            self.visited[node] = True            order.append(node)            for n in self.node_neighbors[node]:                if not n in self.visited:                    dfs(n)        if root:            dfs(root)        for node in self.nodes():            if not node in self.visited:                dfs(node)        print("深度优先顺序:", order)        return order    def breadth_first_search(self, root=None):        queue = []        order = []        def bfs():            while len(queue) > 0:                node = queue.pop(0)                self.visited[node] = True                for n in self.node_neighbors[node]:                    if not n in self.visited and not n in queue:                        queue.append(n)                        order.append(n)        if root:            queue.append(root)            order.append(root)            bfs()        for node in self.nodes():            if not node in self.visited:                queue.append(node)                order.append(node)                bfs()        print("广度优先顺序:", order)        return order# 初始化图结构g = Graph()g.add_nodes([i+1 for i in range(8)])g.add_edge((1, 2))g.add_edge((1, 3))g.add_edge((2, 4))g.add_edge((2, 5))g.add_edge((4, 8))g.add_edge((5, 8))g.add_edge((3, 6))g.add_edge((3, 7))g.add_edge((6, 7))# 测试nodes: [1, 2, 3, 4, 5, 6, 7, 8]广度优先顺序: [1, 2, 3, 4, 5, 6, 7, 8]深度优先顺序: [1, 2, 4, 8, 5, 3, 6, 7]

    以上内容通过深度优先算法和广度优先算法实现了对图的遍历。代码中图的节点及边的建立,结合遍历算法,展示了不同遍历顺序的结果。

    转载地址:http://zbymz.baihongyu.com/

    你可能感兴趣的文章
    【Jquery】获取当前窗口的宽度值/高度值
    查看>>
    Android 架构组件 – 让天下没有难做的 App
    查看>>
    启动MongoDB出现1053错误
    查看>>
    能解决数据可视化大屏需求的3款可视化工具
    查看>>
    欢迎来到小迪博客
    查看>>
    【Altium Designer21】工作栏中文解析
    查看>>
    [87]用secureCRT连接虚拟机中的Ubuntu系统,出现“远程主机拒绝连接”错误
    查看>>
    Shell脚本防DNS攻击检测并删除肉机IP
    查看>>
    如何在VSCode中定制JSON的IntelliSense
    查看>>
    椭圆曲线的定义
    查看>>
    多代理区块链框架客户端的操作
    查看>>
    RSA操作中的公钥和私钥的生成
    查看>>
    go语言中类的继承和方法的使用
    查看>>
    caffe训练的时候遇到的text-format 错误解决方案。
    查看>>
    Java 8新特性(一):Lambda表达式
    查看>>
    Little Zu Chongzhi's Triangles
    查看>>
    cf-A. Wet Shark and Odd and Even(水)
    查看>>
    Train Problem II(卡特兰数+大数乘除)
    查看>>
    一些技术博客
    查看>>
    第01问:MySQL 一次 insert 刷几次盘?
    查看>>