python算法学习——第6天

本文介绍了广度优先搜索(BFS)算法,通过一个芒果农场寻找芒果销售商的例子进行阐述。利用散列表来表示图的节点及其邻接关系,并通过队列实现搜索。在搜索过程中,遇到每个节点时会检查其是否为销售商,若不是,则将其邻居加入队列。最终,通过优化避免重复检查,确保搜索效率。提供的代码展示了如何在Python中实现BFS算法。
摘要由CSDN通过智能技术生成

今天看的《算法图解》广度优先算法,对一些相关内容做了一些整理。

一、广度优先算法

假设你经营着一个芒果农场,需要寻找芒果销售商,以便将芒果卖给他。在Facebook,你与芒果销售商有联系吗?为此,你可在朋友中查找。
假设你没有朋友是销售商,那么你必须在朋友的朋友中查找。
朋友关系图
这样一来,你不仅在朋友中查找,还在朋友的朋友中查找。别忘了,你的目标是在你的人际关系网中找到一位芒果销售商。因此,如果Alice不是芒果销售商,就将其朋友也加入到名单中。这意味着你将在她的朋友、朋友的朋友等中查找。使用这种算法将搜遍你的整个人际关系网,直到找到芒果销售商。这就是广度优先搜索算法。

1、实现 图:

首先,需要使用代码来实现图。图由多个节点组成。
每个节点都与邻近节点相连,如果表示类似于 “你→Bob” 这样的关系呢?好在你知道的一种结构让你能够表示这种关
系,它就是散列表
记住,散列表让你能够将键映射到值。在这里,你要将节
点映射到其所有邻居。

2、实现算法:
在这里插入图片描述
3、代码实现:

# 散列表定义
graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["jonny"] = []
graph["thom"] = []

def person_is_seller(name):  # 函数person_is_seller,判断一个人是不是芒果销售商
    return  name[-1] == 'm'
# 创建一个队列
from collections import deque
search_queue = deque()   # 创建一个(搜索)队列
search_queue += graph["you"]  #将你的邻居都加到这个搜索队列中
                  # graph["you"]是一个数组,其中包含你的所有的邻居,如["alice", "bob", "claire"]。

while search_queue:
    person = search_queue.popleft()
    if person_is_seller(person):
        print(person + " is a mango seller!")
        break
    else:
        search_queue += graph[person]



这个函数检查人的姓名是否以m结尾:如果是,他就是芒果销售商。这种判断方法有点搞笑,但就这个示例而言是可行的。

4、代码优化:

检查一个人之前,要确认之前没检查过他,这很重要。为此,你可使用一个列表来记录检查过的人。
考虑到这一点后,广度优先搜索的最终代码如下。

# 散列表定义
graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["jonny"] = []
graph["thom"] = []

# 创建一个队列
from collections import deque
# search_queue = deque()   # 创建一个(搜索)队列
# search_queue += graph["you"]  #将你的邻居都加到这个搜索队列中
#                   # graph["you"]是一个数组,其中包含你的所有的邻居,如["alice", "bob", "claire"]。

def person_is_seller(name):  # 函数person_is_seller,判断一个人是不是芒果销售商
    return  name[-1] == 'm'

# if __name__=="__main__":
def BFS_search(name):
    search_queue = deque()  # 创建一个(搜索)队列
    search_queue += graph[name]  #将name的邻居都加到这个搜索队列中
    searched =[]  # 这个数组用于记录检查过的人
    while search_queue:
        person = search_queue.popleft()
        if person not in searched:
            if person_is_seller(person):
                print(person + " is a mango seller!")
                return  True
            else:
                search_queue += graph[person]
                searched.append(person)
    return False

BFS_search("you")


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunqk5665

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值