栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

广度优先搜索

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

广度优先搜索

广度优先搜索----Python

假如我想阅读一本名为《Python数据结构》的书籍,这个时候需要通过朋友去借,我的朋友也可以通过他们的朋友帮我去借,那么我怎么样通过最少的人际关系接到这本书,这就是最短路径问题。解决最短路径问题的算法被称为广度优先搜索。

广度优先搜索可以回答两类问题:
1.从节点A出发,有前往B节点的路径吗?(在人际关系中,就是有人有这本书吗)

2.从节点A出发,前往节点B的哪条路径最短?(我通过最少的朋友接到这本书)

在借书这个过程中,朋友是一度关系,朋友的朋友是二度关系,以此类推。一度关系胜于二度关系,二度关系胜于三度关系。

因此,在广度优先搜索中,要确定一度关系没有书籍,再去搜索二度关系。

因此,需要按添加顺序进行检查,这里可以使用队列进行设计。

对于检查过的人,务必不要再去检查,否则可能导致无限循环。

#使用函数deque来创建一个双端队列
from collections import deque

graph = {}
#我的朋友
graph['you'] = ['alice', 'bob', 'claire']
#朋友的朋友
graph['alice'] = ['anuj', 'peggy']
graph['bob'] = ['peggy']
graph['claire'] = ['thom', 'jonny']
graph['anuj'] = []
graph['peggy'] = []
graph['thom'] = []
graph['jonny'] = []



def person_has_book(name):
   return name[-1] == 'm'

def test(graph):
   #创建一个队列
   search_queue = deque()
   #将你的朋友都加入到搜索这个队列中
   search_queue += graph['you']
   #这个数组用于记录检查过的人
   searched = []
   
   #只要队列不为空
   while search_queue:
      #就取出其中的第一个人
      person = search_queue.popleft()
      #仅当这个人没检查过时才检查
      if person not in searched:
         # 检查这个人是否有书
         if person_has_book(person):
            print(person + "has this book")
            return True
         #如果没有书。将这个人的朋友都加入到搜索队列中
         else:
            search_queue += graph[person]
            searched.append(person)#将这个人标记为检查
         return False
print(test(graph))
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/689265.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号