廣度優先搜索


圖算法——廣度優先搜索(breadth-first search,BFS)。
 廣度優先搜索指出是否有從A到B的路徑。

 如果有,廣度優先搜索將找出最短路徑。

 

你需要在你們的朋友中,找到一位芒果銷售商。檢查名單中的每個人時,你都將其朋友加入名單。

這樣一來,你不僅在朋友中查找,還在朋友的朋友中查找。別忘了,你的目標是在你的人際

關系網中找到一位芒果銷售商。因此,如果Alice不是芒果銷售商,就將其朋友也加入到名單中。
這意味着你將在她的朋友、朋友的朋友等中查找。使用這種算法將搜遍你的整個人際關系網,直
到找到芒果銷售商。這就是廣度優先搜索算法

 

一度關系勝過二度關系,二度關系勝過三度關系,以此類推。因此,你應先在一度關系中搜索,

確定其中沒有芒果銷售商后,才在二度關系中搜索。廣度優先搜索就是這樣做的!

在廣度優先搜索的執行過程中,搜索范圍從起點開始逐漸向外延伸,即先檢查一度關系,再檢查二度關系。

 

 

 

 在you 的人際關系中找到最近的Mongo Seller

使用隊列的數據結構,廣度優先搜索,python 代碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

' breadth first search '
__author__ = 'chris'

from collections import deque
graph = {}
graph['you'] = [{'name':'Tom','profession':'Engineer'},{'name':'Sarah','profession':'Teacher'},
                {'name':'Linda','profession':'Singer'},{'name':'Trump','profession':'Dancer'},]
graph['Sarah'] = [{'name':'Jack','profession':'Actor'},{'name':'James','profession':'Athlete'},]
graph['Linda'] = [{'name':'Kobe','profession':'Singer'},{'name':'Chris','profession':'Mongo Seller'},]
graph['Tom'] = [{'name':'Jim','profession':'Carpenter'},{'name':'David','profession':'Gardener'},
                {'name': 'Robin', 'profession': 'Engineer'},]
graph['Robin'] = [{'name':'Jason','profession':'Solider'}]
graph['Jason'] = [{'name':'Aya','profession':'Mongo Seller'}]

search_deque = deque()# 聲明一個隊列
search_deque.extend(graph['you']) # 將你自己朋友加入到隊列中

while search_deque:
    person = search_deque.popleft()
    if person['profession'] == 'Mongo Seller':
        print('關系最近的Mongo Seller是'+ person['name'])
        break
    else:
         if person['name'] in graph.keys():
             search_deque.extend(graph[person['name']])

 

如果你在你的整個人際關系網中搜索芒果銷售商,就意味着你將沿每條邊前行(記住,邊是
從一個人到另一個人的箭頭或連接),因此運行時間至少為O(邊數)。
你還使用了一個隊列,其中包含要檢查的每個人。將一個人添加到隊列需要的時間是固定的,
即為O(1),因此對每個人都這樣做需要的總時間為O(人數)。所以,廣度優先搜索的運行時間為
O(人數 + 邊數),這通常寫作O(V + E),其中V為頂點(vertice)數,E為邊數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM