python算法学习——第6天

导读:本篇文章讲解 python算法学习——第6天,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

一、广度优先算法

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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74945.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!