广度优先搜索

广度优先搜索遍历

又称作宽度优先搜索,简称BFS,是一种图形搜索演算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,则演算终止。广度优先搜索的实现一般采用open-closed表。

       BFS是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。

使用广度优先搜索算法可以解决两种问题:
1)是否存在解
       广度优先搜索算法具有完全性。这意指无论图形的种类如何,只要目标存在,则BFS一定会找到。然而,若目标不存在,且图为无限大,则BFS将不收敛(不会结束)。
2)最优解
       若所有边的长度相等,广度优先搜索算法是最佳解——亦即它找到的第一个解,距离根节点的边数目一定最少。但是它只能得到最少边数,如果是加权图,返回的也是最少的边数。

时间复杂度:最差情形下,BFS必须寻找所有到可能节点的所有路径,因此其时间复杂度为 O(|V| + |E|),其中 |V| 是节点的数目,而 |E| 是图中边的数目。

空间复杂度:因为所有节点都必须被储存,因此BFS的空间复杂度为 O(|V| + |E|),其中 |V| 是节点的数目,而 |E| 是图中边的数目。
注:另一种说法称BFS的空间复杂度为O(B^M),其中 B 是最大分支系数,而 M 是树的最长路径长度。由于对空间的大量需求,因此BFS并不适合解非常大的问题。

示例:
找出以’M’结尾的单词
在这里插入图片描述

代码实现:

from collections import deque

graph = {}
#起点为‘you'
graph['you'] = ['BOB','ALICE','CLAIRE']
graph['BOB'] = ['ANUJ','PEGGY']
graph['ALICE'] = ['PEGGY']
graph['CLAIRE'] = ['THOM','JONNY']
graph['ANUJ'] = []
graph['PEGGY'] = []
graph['THOM'] = []
graph['JONNY'] = []
searched_list = []

def person_is_seller(name):
    return name[-1] == 'M'

def BFS(name):
    #创建队列
    search_queue = deque()
    #将要检查的单词存入
    search_queue += graph[name]
    while search_queue:
        #弹出队首
        person = search_queue.popleft()
        if person not in searched_list:
            #检查是否符合
            if person_is_seller(person):
                print(person)
                prin
                return True
            else:
                #不符合,将该单词的邻居加入队列
                search_queue += graph[person]
                #将该单词加入被检查表,防止重复检查
                searched_list.append(person)

    return False

BFS('you')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值