python算法----广度优先搜索

今天我们来学习一下另一种算法----广度优先搜索
解决最短路径问题的算法被称为广度优先搜索

图是什么:

图模拟一组连接,图用于模拟不同的东西是如何相连的
图由节点(node)和边(edge)组成
一个节点可能与众多节点直接相连,这些节点被称为邻居

查找最短路径:

第一类问题:从节点A出发,又前往节点B的路径吗?
第二类问题:从节点A出发,前往节点B哪条路径最短?
解决第二类问题,我们可以看做一度关系大于二度关系,二度关系大于三度关系…,因此我们现在一度关系中查找,若没有找到,则在二度关系中查找…直到找到目标,我们可以依次将一度关系,二度关系…按顺序加入到一个查找名单,这样我们就会先找到离我们最近的目标了,有一种可以实现这种目的的数据结构----队列

队列:

队列类似于栈,你不能随机的访问队列中的元素,队列只支持两种操作:入队和出队
队列是一种先进先出(First In First Out,FIFO)的数据结构,而栈是一种后进先出(Last In First Out,LIFO)的数据结构

实现图:

散列表能够实现每个节点都与邻节点相连的关系,散列表能够将键映射到值
键—值对的添加顺序重要吗?散列表是无序的,因此添加键—值对的 顺序无关紧要
节点与节点的关系是单向的,没有指向别人的箭头我们称为有向图
节点与节点之间没有箭头,直接相连的节点互为邻居,这就叫做无向图

实现算法:

更新队列时,我使用术语“入队”和“出队”,但你也可能遇到术语“压入”和“弹出”。 压入大致相当于入队,而弹出大致相当于出队
在Python中,可使用函数deque来创建一个双端队列
from collections import deque 导入模块
具体的代码:

from collections import deque

my_dict = {
    
    "a": ["a", "b", "c"], "b": ["d", "e"], "c": [], "d": [], "e": ["a"]}

def find_friend(name):
    my_deque = deque()
    my_deque += my_dict["a"]
    finish = []
    while my_deque:
        person = my_deque.popleft()
        if not person in finish:
            if person == "e":
                print("找到了!")
                return True
            else:
                my_deque += my_dict[person]
                finish.append(person)
    print("没找到!")
    return False

find_friend("a")

广度优先搜索的运行时间为 O(人数 + 边数),这通常写作O(V + E),其中V为顶点(vertice)数,E为边数

猜你喜欢

转载自blog.csdn.net/Layfolk_XK/article/details/108363882