zoukankan      html  css  js  c++  java
  • 最短路径问题与广度优先搜索

    解决最短路径问题的算法被称为广度优先(breadth-first search,BFS)搜索。

    广度优先搜索是一种用于图的查找算法,可解决两类问题:

    从节点A出发,有前往节点B的路径吗?

    从节点A出发,前往节点B的哪条路径最短?

    最短路径问题的解决步骤:

    1.使用图建立问题模型;

    图用于模拟不同的东西是如何相连的。

    2.使用广度优先搜索解决问题。

    广度优先搜素算法从邻居节点及邻近节点的邻居节点中搜索,直到搜索到目标。

    首先搜索一度 关系,再搜索二度关系 ,然后三度关系,......

    因此,广度优先搜索不仅查到从A到B的路径,而且找到的是最短的路径。

    只有按添加顺序查找时,才能实现这样的目的;可以使用队列(queue)来实现。

    队列工作原理:先进先出(First In First Out,FIFO)。

    队列操作:入队,出队。

    图的实现:

    图由一系列的节点和边组成;每个节点都与邻近节点相连,可以使用散列表来实现图。

    散列表是无序的,添加键-值对的顺序是无关的。

    1.图的表示(每个节点都与邻近节点 相连,散列表)

    2.算法实现

    from collections import deque
    graph = {}
    graph["you"] = {"alice", "bob", "claire"}
    # 一度关系
    graph["alice"] = ["peggy"]
    graph["bob"] = ["anuj", "peggy"]
    graph["claire"] = ["thom","jonny"]
    # 二度关系
    graph["peggy"] = []
    graph["anuj"] = []
    graph["thom"] = []
    graph["jonny"] = []


    # 判断name是否以m结尾
    def person_is_seller(name):
    return name[-1] == 'm'


    # breadth-first-search(BFS)
    def search(name):
    search_queue = deque() # 创建队列
    search_queue += graph[name] # 将邻近加入到创建的搜索队列中
    searched = [] # 记录搜索过的人,防止形成无限循环
    while search_queue:
    person = search_queue.popleft() # 出队
    if person not in searched: # 是否位目标
    if person_is_seller(person):
    print("%s is a seller" %(person))
    else:
    search_queue += graph[person] # 不是,将邻近加入到搜索队列
    searched.append(person) # 加入到已经搜索过的列表
    return False


    if __name__ == '__main__':
    search("you")
  • 相关阅读:
    node 父子进程传递对象
    js 按照字母进行分组
    native react 代码智能提示
    VScode 使用emmet
    c# webapi swagger
    c# 前台和后台线程
    Java——字节和字符的区别
    Java——类的访问修饰符
    Java——面向对象
    Java——内存中的数组
  • 原文地址:https://www.cnblogs.com/songyuejie/p/11374406.html
Copyright © 2011-2022 走看看