寫給媳婦兒的算法(十一)——廣度優(yōu)先搜索

【引言】我們生活中都會(huì)有過“找人”的經(jīng)歷。比如甫何,我們想簡(jiǎn)單的找一個(gè)醫(yī)生來咨詢一些事情嚎莉,或者找一個(gè)律師或者是老師。我們會(huì)怎么找呢沛豌?怎么才能找到呢趋箩?我們往往希望找到的這個(gè)人是跟我們關(guān)系最近的那一個(gè),或者是朋友加派,或者是朋友的朋友叫确,如果是朋友的朋友的朋友,我們的信任感或者說覺得這個(gè)關(guān)系就不那么牢靠了芍锦。這個(gè)過程就是一個(gè)搜索的過程竹勉,而我們的人際關(guān)系網(wǎng)就是一個(gè)

廣度優(yōu)先搜索就是一個(gè)首先搜索自己身邊最近的人娄琉,如果沒有次乓,我們?cè)贁U(kuò)大搜索范圍的一種搜索方法。

算法過程

我們可以想象孽水,我們?cè)谡胰说倪^程票腰,實(shí)際上就是我們搜索我們?nèi)穗H關(guān)系關(guān)系網(wǎng)中的人的過程,而這個(gè)人際關(guān)系網(wǎng)女气,就是由一個(gè)個(gè)朋友杏慰、朋友的朋友……來構(gòu)建的,我們可以把這種關(guān)系看做是一個(gè)

我的人際關(guān)系圖tx~.png

圖是有方向的炼鞠,箭頭的方向表示的是從屬關(guān)系缘滥,被指的人是前者的朋友,其實(shí)應(yīng)該是互相指的雙向箭頭谒主,但是因?yàn)槲业拇嬖诔螅抑荒芡ㄟ^一個(gè)人來找到他的朋友,所以有了單向的方向霎肯。即使是這樣擎颖,也會(huì)存在一個(gè)人同時(shí)是幾個(gè)人的朋友這種情況凹耙,可能會(huì)出現(xiàn)一個(gè)環(huán),如上圖肠仪,這個(gè)環(huán)也可能是來回循環(huán)的。

廣度優(yōu)先搜索

廣度優(yōu)先搜索备典,顧名思義异旧,就是盡量的先 廣泛 的來搜索。

比如提佣,我要買房子吮蛹,我就要要找到我身邊人際網(wǎng)中的一個(gè)搞房地產(chǎn)的人。我該怎么辦呢拌屏?按照廣度優(yōu)先搜索的話潮针,我應(yīng)該這么辦:
首先,我遍尋我身邊的朋友倚喂,也就是直接跟我是朋友的人每篷,看看他們是不是搞房地產(chǎn)的人,如果有搞房地產(chǎn)的人端圈,我就算是以一個(gè)比較短的路徑焦读,一個(gè)比較短的時(shí)間找到了我所需要的人(黑圈中的人):


我的朋友們.png

然后,當(dāng)我遍尋我身邊直接的朋友沒有找到搞房地產(chǎn)的人的時(shí)候舱权,此時(shí)我就知道矗晃,我身邊朋友這個(gè)范圍已經(jīng)找不到了,此時(shí)我就要增加我的搜索范圍宴倍,來找我的朋友的朋友了(紅圈之內(nèi)张症,黑圈之外):


遍尋朋友的朋友.png

如果我找到了,那么這個(gè)搜索過程就結(jié)束了鸵贬,如果沒有找到俗他,我再繼續(xù)搜索朋友的朋友的朋友……,一次次的增加搜索的范圍阔逼。

這就是廣度優(yōu)先搜索的過程拯辙,所謂廣度,就是每一次搜索的范圍要盡量的廣泛颜价,比如涯保,我第一次搜索,范圍就是最廣泛的周伦,我 遍尋 了我身邊所有的 朋友夕春;第二次搜索,我 遍尋 了我身邊 朋友的朋友 专挪;如果有第三次及志,我就繼續(xù)遍尋我朋友的朋友的朋友……片排,很幸運(yùn),我在我的朋友的朋友中速侈,找到了我要找的人率寡,這樣就以廣度優(yōu)先的搜索方式完成了我找人的目的!

具體的實(shí)現(xiàn)邏輯是倚搬,我借助一個(gè)隊(duì)列冶共,首先把我所有的朋友加入隊(duì)列,從隊(duì)列頭一個(gè)個(gè)的來查看我的朋友是不是我要找的人每界,如果某個(gè)朋友不是我要找的捅僵,那么我就把他的朋友繼續(xù)加入隊(duì)列的末尾,把他從隊(duì)列頭中拿走眨层,繼續(xù)的查看隊(duì)列中第二個(gè)朋友庙楚,重復(fù)這個(gè)過程,直到我的隊(duì)列中的所有人都被我查看過了趴樱,沒有找到馒闷,那我身邊就沒有這樣的人。


隊(duì)列的示意圖.png

算法實(shí)現(xiàn)

#coding:utf-8

# 引入隊(duì)列叁征,實(shí)際上用數(shù)組也是完全沒問題的窜司,有這個(gè)就用這個(gè)
from collections import deque

# 廣度優(yōu)先搜索的過程
def breadth_first_search(career, name):
    search_queue = deque()
    search_queue += friends[name]
    searched = []
    # 只要待查找的數(shù)組不為空,就一直搜索下去
    while search_queue:
        # 從隊(duì)列的頭找出一個(gè)朋友
        person = search_queue.popleft()
        # 如果這個(gè)朋友沒有在已查找的數(shù)組中航揉,就確認(rèn)他的身份(為了防止幾個(gè)人都互相是朋友的死循環(huán)塞祈,如果查過這個(gè)人,就不再查了)
        if person not in searched:
            # 如果這個(gè)人是要找的人帅涂,直接返回
            if careers[person] == career:
                return person
            # 如果這個(gè)人不是要找的人议薪,就把這個(gè)人的朋友放入帶查找的隊(duì)列的末尾
            else:
                search_queue.extend(friends[person])
                searched.append(person)
    # 如果關(guān)系網(wǎng)上所有的人中都沒有要找的人,就直接返回沒有
    return False

# 構(gòu)建人物的基本職業(yè)信息以及朋友網(wǎng)
careers = {"我": "屌絲",
          "呂志安": "醫(yī)生",
          "李小飛": "律師",
          "林連杰": "老總",
          "王洲": "房地產(chǎn)",
          "王忠義": "護(hù)士",
          "封趙蒙": "保險(xiǎn)"}

friends = {"我": ["呂志安", "李小飛", "林連杰"],
          "呂志安": ["封趙蒙"],
          "李小飛": ["王洲", "王忠義"],
          "林連杰": [],
          "王洲": ["王忠義"],
          "王忠義": [],
          "封趙蒙": []}

# 進(jìn)行廣度優(yōu)先搜索媳友,來查找 我 的身邊做 房地產(chǎn) 的朋友
searched_man = breadth_first_search("房地產(chǎn)", "我")
if searched_man:
    print("你身邊做“房地產(chǎn)”的朋友是: {}".format(searched_man))
else:
    print("你身邊沒有做“房地產(chǎn)”的朋友")

結(jié)果是:

我身邊做房地產(chǎn)的朋友是王洲斯议,我二哥.png



上一篇:寫給媳婦兒的算法(十)——斐波那切數(shù)列
下一篇:寫給媳婦兒的算法(十二)——狄克斯特拉算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市醇锚,隨后出現(xiàn)的幾起案子哼御,更是在濱河造成了極大的恐慌,老刑警劉巖焊唬,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恋昼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赶促,警方通過查閱死者的電腦和手機(jī)液肌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸥滨,“玉大人嗦哆,你說我怎么就攤上這事谤祖。” “怎么了老速?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵粥喜,是天一觀的道長。 經(jīng)常有香客問我橘券,道長额湘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任约郁,我火速辦了婚禮,結(jié)果婚禮上但两,老公的妹妹穿的比我還像新娘鬓梅。我一直安慰自己,他們只是感情好谨湘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布绽快。 她就那樣靜靜地躺著,像睡著了一般紧阔。 火紅的嫁衣襯著肌膚如雪坊罢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天擅耽,我揣著相機(jī)與錄音活孩,去河邊找鬼。 笑死乖仇,一個(gè)胖子當(dāng)著我的面吹牛憾儒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乃沙,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼起趾,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了警儒?” 一聲冷哼從身側(cè)響起训裆,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜀铲,沒想到半個(gè)月后边琉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡记劝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年艺骂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隆夯。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钳恕,死狀恐怖别伏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忧额,我是刑警寧澤厘肮,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站睦番,受9級(jí)特大地震影響类茂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜托嚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一巩检、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧示启,春花似錦兢哭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舍咖,卻和暖如春矩父,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背排霉。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國打工窍株, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攻柠。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓夹姥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辙诞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辙售,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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