python算法学习——第6天

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

一、广度优先算法

假设你经营着一个芒果农场,需要寻找芒果销售商,以便将芒果卖给他。在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")


猜你喜欢

转载自blog.csdn.net/weixin_43624626/article/details/114049643