【算法导论】06 广度优先搜索(待修改)

度数:亲密程度,类似“六步可以找到世界上任何一个人”,其中第一度,就是关系最亲密的,第二度,就是从第一度辐射出去的,差不多就是这个意思。 

步骤:

1、建立图模型,构建节点和边

2、广度优先搜索,相当于队列,先进先出(First in First out)

走第一步:先放进去双子峰,

1和2放进去。

第二部:划掉双子峰,走3,划掉1

走4和5,划掉2

最后1-3-金门大桥,广度上说是最短的

最后找到了THOM,2度的时候,最后一个字母是M 

“键—值 ” 对的添加顺序重要吗? -- 不重要,最后图都是一样的

key是某一度,value是这一度连接的下一度

放进value后,value入队,其对应的key出队

例:看队列里的第一个是什么,

先放进去you,然后放进去alice,bob,claire

此时第一个是alice:peggy入队,同时alice出队

此时第一个是bob: anuj, peggy入队,同时bob出队,由于peggy已经在队列里,就不用再进了

此时第一个是claire:thom和jonny入队,同时Claire出队

peggy出去,后面没有入队的了

anuj出去,没有入队

thom,此时符合条件,后面不用看了

graph = {}
graph['you'] = ['alice','bob','claire']
graph['bob'] = ['anuj','peggy']
graph['alice'] = ['peggy']
graph['claire'] = ['thom','jonny']
graph['anuj']=[]
graph['peggy']=[]
graph['thom']=[]
graph['jonny']=[] 

from collections import deque        # 导入队列deque

def person_is_seller(name):
    return name[-1] == 'm'        # 这里我们假设,只有芒果销售商的名字,最后一个字母是m

# 建立图结构    
graph = {}
graph['you'] = ['alice','bob','claire']
graph['alice'] = ['peggy']
graph['claire'] = ['thom','jonny']
graph['anuj'] = []
graph['peggy']= []
graph['thom']=[]
graph['jonny'] = []

def search(name):
    search_queue = deque()        # 创建队列,把you的朋友放进来,
    search_queue += graph[name]  # 此时有Alice,bob,claire
    # 存放已经搜索过的人名的数组
    searched = []              # 存放弹出的元素
    while search_queue:        # 判断队列是否为空,不空继续
        person = search_queue.popleft()        # 弹出来Alice,还没放到search里,放到person变量里
        # 避免重复搜索
        if not person in searched:        # 问person是不是在search里,如果不在,继续
            if person_is_seller(person):        # 问person是不是芒果商
                print person + "is a mango seller!"
                return True
            else:
                search_queue += graph[person]        # 不是就把Alice的朋友放下来,把peggy放进去
                # 将此人设置为searched
                searched.append(person)        # 把Alice放search里,然后回到while
     return False

    search('you')        # 从you开始找
      


    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值