算法之廣度優(yōu)先搜索(BFS)

圖算法——廣度優(yōu)先搜索 (breadth-first search旷偿,BFS)狸捅。廣度優(yōu)先搜索讓你能夠找出兩樣?xùn)|西之間的最短距離累提。


你經(jīng)常要找出最短路徑,這可能是前往朋友家的最短路徑朽褪,也可能是國際象棋中把對方將死的最少步數(shù)无虚。解決最短路徑問題的算法被稱為廣度優(yōu)先搜索

圖是什么?
圖由節(jié)點和邊組成嗤堰。一個節(jié)點(node)可能與眾多節(jié)點(edge)直接相連度宦,這些節(jié)點被稱為鄰居

廣度優(yōu)先搜索可回答兩類問題。
第一類問題:從節(jié)點A出發(fā)离唬,有前往節(jié)點B的路徑嗎?
第二類問題:從節(jié)點A出發(fā)戚哎,前往節(jié)點B的哪條路徑最短嫂用?

在你看來,一度關(guān)系勝過二度關(guān)系甘畅,二度關(guān)系勝過三度關(guān)系实夹,以此類推亮航。因此匀们,你應(yīng)先在一度關(guān)系中搜索,確定其中沒有芒果銷售商后重抖,才在二度關(guān)系中搜索祖灰。廣度優(yōu)先搜索就是這樣做的!在廣度優(yōu)先搜索的執(zhí)行過程中恨统,搜索范圍從起點開始逐漸向外延伸三妈,即先檢查一度關(guān)系,再檢查二度關(guān)系悠鞍。

隊列

隊列只支持兩種操作:入隊 和出隊 模燥。
隊列是一種先進先出 (First In First Out掩宜,F(xiàn)IFO)的數(shù)據(jù)結(jié)構(gòu)

實現(xiàn)圖

首先锭亏,需要使用代碼來實現(xiàn)圖硬鞍。圖由多個節(jié)點組成。
的一種結(jié)構(gòu)讓你能夠表示這種關(guān)系锅减,它就是散列表 伐坏!
散列表讓你能夠?qū)㈡I映射到值。在這里每瞒,你要將節(jié)點映射到其所有鄰居纯露。

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"] = []

散列表是無序的埠褪,因此添加鍵—值對的順序無關(guān)緊要

無向圖 (undirected graph)沒有箭頭,直接相連的節(jié)點互為鄰居贷掖。

實現(xiàn)算法

def search(name):    
  search_queue = deque()    
  search_queue += graph[name]    
  searched = []  # 這個數(shù)組用于記錄檢查過的人
  while search_queue: 
    person = search_queue.popleft() 
    if person not in searched: 
    # 僅當(dāng)這個人沒檢查過時才檢查 
      if person_is_seller(person): 
        print person +" is a mango seller!" 
        return True 
      else: 
        search_queue += graph[person]     
        searched.append(person) # 將這個人標(biāo)記為檢查過 
    return False search("you")

渴语,廣度優(yōu)先搜索的運行時間為O (人數(shù) + 邊數(shù)),這通常寫作O (V + E )屠升,其中V 為頂點(vertice)數(shù)狭郑,E 為邊數(shù)。

拓?fù)渑判?/h2>

如果任務(wù)A依賴于任務(wù)B翰萨,在列表中任務(wù)A就必須在任務(wù)B后面。這被稱為拓?fù)渑判颉?/p>

樹是一種特殊的圖阿蝶,其中沒有往后指的邊黄绩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爽丹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌真仲,老刑警劉巖初澎,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異软啼,居然都是意外死亡祸挪,警方通過查閱死者的電腦和手機捕仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門盈罐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钓葫,你說我怎么就攤上這事票顾。” “怎么了豆同?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵含鳞,是天一觀的道長。 經(jīng)常有香客問我鸭廷,道長,這世上最難降的妖魔是什么佳晶? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任讼载,我火速辦了婚禮,結(jié)果婚禮上淤刃,老公的妹妹穿的比我還像新娘吱型。我一直安慰自己,他們只是感情好铝侵,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布触徐。 她就那樣靜靜地躺著,像睡著了一般疟丙。 火紅的嫁衣襯著肌膚如雪鸟雏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天炊琉,我揣著相機與錄音又活,去河邊找鬼。 笑死柳骄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耐薯。 我是一名探鬼主播隘世,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丙者,長吁一口氣:“原來是場噩夢啊……” “哼营密!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纷捞,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤被去,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惨缆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡寂汇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年骄瓣,在試婚紗的時候發(fā)現(xiàn)自己被綠了耍攘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扒磁,死狀恐怖渗磅,靈堂內(nèi)的尸體忽然破棺而出嚷硫,到底是詐尸還是另有隱情,我是刑警寧澤脆贵,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布起暮,位于F島的核電站,受9級特大地震影響筒捺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜五嫂,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一沃缘、第九天 我趴在偏房一處隱蔽的房頂上張望则吟。 院中可真熱鬧,春花似錦氓仲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抬驴,卻和暖如春缆巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陕悬。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工捉超, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枝誊。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓惜纸,卻偏偏與公主長得像绝骚,于是被迫代替她去往敵國和親压汪。 傳聞我的和親對象是個殘疾皇子古瓤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容