广度优先搜索

广度优先:

在最短的时间查找最优的方法。比如路径,下棋的AI算法。
广度优先搜索:样一来,你不仅在朋友中查找,还在朋友的朋友中查找。别忘了,你
的目标是在你的人际关系网中找到一位芒果销售商。因此,如果Alice不
是芒果销售商,就将其朋友也加入到名单中。这意味着你将在她的朋
友、朋友的朋友等中查找。使用这种算法将搜遍你的整个人际关系网,
直到找到芒果销售商。这就是广度优先搜索算法。类似脉脉的额人际关系网。快速查找你需要人际关系。

第一类问题:从节点A出发,有前往节点B的路径吗?(在你的人
际关系网中,有芒果销售商吗?)
第二类问题:从节点A出发,前往节点B的哪条路径最短?(哪个
芒果销售商与你的关系最近?)
刚才你看到了如何回答第一类问题,下面来尝试回答第二类问题——谁
是关系最近的芒果销售商。例如,朋友是一度关系,朋友的朋友是二度
关系

在你看来,一度关系胜过二度关系,二度关系胜过三度关系,以此类
推。因此,你应先在一度关系中搜索,确定其中没有芒果销售商后,才
在二度关系中搜索。广度优先搜索就是这样做的!在广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸,即先检查一度关系,再
检查二度关系。顺便问一句:将先检查Claire还是Anuj呢?Claire是一度
关系,而Anuj是二度关系,因此将先检查Claire,后检查Anuj。
你也可以这样看,一度关系在二度关系之前加入查找名单。
你按顺序依次检查名单中的每个人,看看他是否是芒果销售商。这将先
在一度关系中查找,再在二度关系中查找,因此找到的是关系最近的芒
果销售商。广度优先搜索不仅查找从A到B的路径,而且找到的是最短
的路径

注意,只有按添加顺序查找时,才能实现这样的目的。换句话说,如果
Claire先于Anuj加入名单,就需要先检查Claire,再检查Anuj。如果
Claire和Anuj都是芒果销售商,而你先检查Anuj再检查Claire,结果将如
何呢?找到的芒果销售商并非是与你关系最近的,因为Anuj是你朋友的
朋友,而Claire是你的朋友。因此,你需要按添加顺序进行检查。有一
个可实现这种目的的数据结构,那就是队列(queue)。

对列:队列的工作原理与现实生活中的队列完全相同。假设你与朋友一起在公
交车站排队,如果你排在他前面,你将先上车。队列的工作原理与此相
同。队列类似于栈,你不能随机地访问队列中的元素。队列只支持两种
操作:入队和出队。

下面的一段简单的代码实现了广度搜索(找出销售商的角色):

from collections import deque
graph={}
graph['you'] = [ 'bob', 'claire']
graph['bob'] = ['anum','anuj', 'peggy1']
graph['claire'] = ['thom', 'jonny']

search_queue = deque()
search_queue += graph['you']

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

def search(name):
    search_queue = deque()
    search_queue += graph[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

search('you')

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容