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