99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)據(jù)結(jié)構(gòu)與算法:圖的遍歷過程中,搜索方法的不同

電子工程師 ? 來源:lp ? 2019-04-04 16:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 引言

遍歷是指從某個節(jié)點(diǎn)出發(fā),按照一定的的搜索路線,依次訪問對數(shù)據(jù)結(jié)構(gòu)中的全部節(jié)點(diǎn),且每個節(jié)點(diǎn)僅訪問一次。

在二叉樹基礎(chǔ)中,介紹了對于樹的遍歷。樹的遍歷是指從根節(jié)點(diǎn)出發(fā),按照一定的訪問規(guī)則,依次訪問樹的每個節(jié)點(diǎn)信息。樹的遍歷過程,根據(jù)訪問規(guī)則的不同主要分為四種遍歷方式:

(1)先序遍歷(2)中序遍歷(3)后序遍歷(4)層次遍歷

類似的,圖的遍歷是指,從給定圖中任意指定的頂點(diǎn)(稱為初始點(diǎn))出發(fā),按照某種搜索方法沿著圖的邊訪問圖中的所有頂點(diǎn),使每個頂點(diǎn)僅被訪問一次,這個過程稱為圖的遍歷。遍歷過程中得到的頂點(diǎn)序列稱為圖遍歷序列。

圖的遍歷過程中,根據(jù)搜索方法的不同,又可以劃分為兩種搜索策略:

(1)深度優(yōu)先搜索(DFS,Depth First Search)(2)廣度優(yōu)先搜索(BFS,Breadth First Search)

2 深度優(yōu)先搜索

2.1 算法思想

深度優(yōu)先搜索思想:假設(shè)初始狀態(tài)是圖中所有頂點(diǎn)均未被訪問,則從某個頂點(diǎn)v出發(fā),首先訪問該頂點(diǎn),然后依次從它的各個未被訪問的鄰接點(diǎn)出發(fā)深度優(yōu)先搜索遍歷圖,直至圖中所有和v有路徑相通的頂點(diǎn)都被訪問到。若此時尚有其他頂點(diǎn)未被訪問到,則另選一個未被訪問的頂點(diǎn)作起始點(diǎn),重復(fù)上述過程,直至圖中所有頂點(diǎn)都被訪問到為止。

2.2 算法特點(diǎn)

深度優(yōu)先搜索是一個遞歸的過程。首先,選定一個出發(fā)點(diǎn)后進(jìn)行遍歷,如果有鄰接的未被訪問過的節(jié)點(diǎn)則繼續(xù)前進(jìn)。若不能繼續(xù)前進(jìn),則回退一步再前進(jìn),若回退一步仍然不能前進(jìn),則連續(xù)回退至可以前進(jìn)的位置為止。重復(fù)此過程,直到所有與選定點(diǎn)相通的所有頂點(diǎn)都被遍歷。

深度優(yōu)先搜索是遞歸過程,帶有回退操作,因此需要使用棧存儲訪問的路徑信息。當(dāng)訪問到的當(dāng)前頂點(diǎn)沒有可以前進(jìn)的鄰接頂點(diǎn)時,需要進(jìn)行出棧操作,將當(dāng)前位置回退至出棧元素位置。

2.3 圖解過程

2.3.1 無向圖深度優(yōu)先搜索

以圖2.3.1.1中所示無向圖說明深度優(yōu)先搜索遍歷過程。

圖2.3.1.1

(1)首先選取頂點(diǎn)A為起始點(diǎn),輸出A頂點(diǎn)信息,且將A入棧,并標(biāo)記A為已訪問頂點(diǎn)。

(2)A的鄰接頂點(diǎn)有C、D、F,從中任意選取一個頂點(diǎn)前進(jìn)。這里我們選取C頂點(diǎn)為前進(jìn)位置頂點(diǎn)。輸出C頂點(diǎn)信息,將C入棧,并標(biāo)記C為已訪問頂點(diǎn)。當(dāng)前位置指向頂點(diǎn)C。

(3)頂點(diǎn)C的鄰接頂點(diǎn)有A、D和B,此時A已經(jīng)標(biāo)記為已訪問頂點(diǎn),因此不能繼續(xù)訪問。從B或者D中選取一個頂點(diǎn)前進(jìn),這里我們選取B頂點(diǎn)為前進(jìn)位置頂點(diǎn)。輸出B頂點(diǎn)信息,將B入棧,標(biāo)記B頂點(diǎn)為已訪問頂點(diǎn)。當(dāng)前位置指向頂點(diǎn)B。

(4)頂點(diǎn)B的鄰接頂點(diǎn)只有C、E,C已被標(biāo)記,不能繼續(xù)訪問,因此選取E為前進(jìn)位置頂點(diǎn),輸出E頂點(diǎn)信息,將E入棧,標(biāo)記E頂點(diǎn),當(dāng)前位置指向E。

(5)頂點(diǎn)E的鄰接頂點(diǎn)均已被標(biāo)記,此時無法繼續(xù)前進(jìn),則需要進(jìn)行回退。將當(dāng)前位置回退至頂點(diǎn)B,回退的同時將E出棧。

(6)頂點(diǎn)B的鄰接頂點(diǎn)也均被標(biāo)記,需要繼續(xù)回退,當(dāng)前位置回退至C,回退同時將B出棧。

(7)頂點(diǎn)C可以前進(jìn)的頂點(diǎn)位置為D,則輸出D頂點(diǎn)信息,將D入棧,并標(biāo)記D頂點(diǎn)。當(dāng)前位置指向頂點(diǎn)D。

(8)頂點(diǎn)D沒有前進(jìn)的頂點(diǎn)位置,因此需要回退操作。將當(dāng)前位置回退至頂點(diǎn)C,回退同時將D出棧。

(9)頂點(diǎn)C沒有前進(jìn)的頂點(diǎn)位置,繼續(xù)回退,將當(dāng)前位置回退至頂點(diǎn)A,回退同時將C出棧。

(10)頂點(diǎn)A前進(jìn)的頂點(diǎn)位置為F,輸出F頂點(diǎn)信息,將F入棧,并標(biāo)記F。將當(dāng)前位置指向頂點(diǎn)F。

(11)頂點(diǎn)F的前進(jìn)頂點(diǎn)位置為G,輸出G頂點(diǎn)信息,將G入棧,并標(biāo)記G。將當(dāng)前位置指向頂點(diǎn)G。

(12)頂點(diǎn)G沒有前進(jìn)頂點(diǎn)位置,回退至F。當(dāng)前位置指向F,回退同時將G出棧。

(13)頂點(diǎn)F沒有前進(jìn)頂點(diǎn)位置,回退至A,當(dāng)前位置指向A,回退同時將F出棧。

(14)頂點(diǎn)A沒有前進(jìn)頂點(diǎn)位置,繼續(xù)回退,棧為空,則以A為起始的遍歷結(jié)束。若圖中仍有未被訪問的頂點(diǎn),則選取未訪問的頂點(diǎn)為起始點(diǎn),繼續(xù)執(zhí)行此過程。直至所有頂點(diǎn)均被訪問。

(15)采用深度優(yōu)先搜索遍歷順序?yàn)锳->C->B->E->D->F->G。

2.3.2 有向圖深度優(yōu)先搜索

以圖2.3.2.1中所示有向圖說明深度優(yōu)先搜索遍歷過程。

圖2.3.2.1 有向圖

(1)以頂點(diǎn)A為起始點(diǎn),輸出A,將A入棧,并標(biāo)記A。當(dāng)前位置指向A。

(2)以A為尾的邊只有1條,且邊的頭為頂點(diǎn)B,則前進(jìn)位置為頂點(diǎn)B,輸出B,將B入棧,標(biāo)記B。當(dāng)前位置指向B。

(3)頂點(diǎn)B可以前進(jìn)的位置有C與F,選取F為前進(jìn)位置,輸出F,將F入棧,并標(biāo)記F。當(dāng)前位置指向F。

(4)頂點(diǎn)F的前進(jìn)位置為G,輸出G,將G入棧,并標(biāo)記G。當(dāng)前位置指向G。

(5)頂點(diǎn)G沒有可以前進(jìn)的位置,則回退至F,將F出棧。當(dāng)前位置指向F。

(6)頂點(diǎn)F沒有可以前進(jìn)的位置,繼續(xù)回退至B,將F出棧。當(dāng)前位置指向B。

(7)頂點(diǎn)B可以前進(jìn)位置為C和E,選取E,輸出E,將E入棧,并標(biāo)記E。當(dāng)前位置指向E。

(8)頂點(diǎn)E的前進(jìn)位置為D,輸出D,將D入棧,并標(biāo)記D。當(dāng)前位置指向D。

(9)頂點(diǎn)D的前進(jìn)位置為C,輸出C,將C入棧,并標(biāo)記C。當(dāng)前位置指向C。

(10)頂點(diǎn)C沒有前進(jìn)位置,進(jìn)行回退至D,回退同時將C出棧。

(11)繼續(xù)執(zhí)行此過程,直至棧為空,以A為起始點(diǎn)的遍歷過程結(jié)束。若圖中仍有未被訪問的頂點(diǎn),則選取未訪問的頂點(diǎn)為起始點(diǎn),繼續(xù)執(zhí)行此過程。直至所有頂點(diǎn)均被訪問。

2.4 算法分析

當(dāng)圖采用鄰接矩陣存儲時,由于矩陣元素個數(shù)為n^2,因此時間復(fù)雜度就是O(n^2)。

當(dāng)圖采用鄰接表存儲時,鄰接表中只是存儲了邊結(jié)點(diǎn)(e條邊,無向圖也只是2e個結(jié)點(diǎn)),加上表頭結(jié)點(diǎn)為n(也就是頂點(diǎn)個數(shù)),因此時間復(fù)雜度為O(n+e)。

3 廣度優(yōu)先搜索

3.1 算法思想

廣度優(yōu)先搜索思想:從圖中某頂點(diǎn)v出發(fā),在訪問了v之后依次訪問v的各個未曾訪問過的鄰接點(diǎn),然后分別從這些鄰接點(diǎn)出發(fā)依次訪問它們的鄰接點(diǎn),并使得“先被訪問的頂點(diǎn)的鄰接點(diǎn)先于后被訪問的頂點(diǎn)的鄰接點(diǎn)被訪問,直至圖中所有已被訪問的頂點(diǎn)的鄰接點(diǎn)都被訪問到。如果此時圖中尚有頂點(diǎn)未被訪問,則需要另選一個未曾被訪問過的頂點(diǎn)作為新的起始點(diǎn),重復(fù)上述過程,直至圖中所有頂點(diǎn)都被訪問到為止。

3.2 算法特點(diǎn)

廣度優(yōu)先搜索類似于樹的層次遍歷,是按照一種由近及遠(yuǎn)的方式訪問圖的頂點(diǎn)。在進(jìn)行廣度優(yōu)先搜索時需要使用隊(duì)列存儲頂點(diǎn)信息。

3.3 圖解過程

3.3.1 無向圖的廣度優(yōu)先搜索

例如:圖3.3.1.1所示的無向圖,采用廣度優(yōu)先搜索過程。

圖3.3.1.1

(1)選取A為起始點(diǎn),輸出A,A入隊(duì)列,標(biāo)記A,當(dāng)前位置指向A。

(2)隊(duì)列頭為A,A出隊(duì)列。A的鄰接頂點(diǎn)有B、E,輸出B和E,將B和E入隊(duì),并標(biāo)記B、E。當(dāng)前位置指向A。

(3)隊(duì)列頭為B,B出隊(duì)列。B的鄰接頂點(diǎn)有C、D,輸出C、D,將C、D入隊(duì)列,并標(biāo)記C、D。當(dāng)前位置指向B。

(4)隊(duì)列頭為E,E出隊(duì)列。E的鄰接頂點(diǎn)有D、F,但是D已經(jīng)被標(biāo)記,因此輸出F,將F入隊(duì)列,并標(biāo)記F。當(dāng)前位置指向E。

(5)隊(duì)列頭為C,C出隊(duì)列。C的鄰接頂點(diǎn)有B、D,但B、D均被標(biāo)記。無元素入隊(duì)列。當(dāng)前位置指向C。

(6)隊(duì)列頭為D,D出隊(duì)列。D的鄰接頂點(diǎn)有B、C、E,但是B、C、E均被標(biāo)記,無元素入隊(duì)列。當(dāng)前位置指向D。

(7)隊(duì)列頭為F,F(xiàn)出隊(duì)列。F的鄰接頂點(diǎn)有G、H,輸出G、H,將G、H入隊(duì)列,并標(biāo)記G、H。當(dāng)前位置指向F。

(8)隊(duì)列頭為G,G出隊(duì)列。G的鄰接頂點(diǎn)有F,但F已被標(biāo)記,無元素入隊(duì)列。當(dāng)前位置指向G。

(9)隊(duì)列頭為H,H出隊(duì)列。H的鄰接頂點(diǎn)有F,但F已被標(biāo)記,無元素入隊(duì)列。當(dāng)前位置指向H。

img

(10)隊(duì)列空,則以A為起始點(diǎn)的遍歷結(jié)束。若圖中仍有未被訪問的頂點(diǎn),則選取未訪問的頂點(diǎn)為起始點(diǎn),繼續(xù)執(zhí)行此過程。直至所有頂點(diǎn)均被訪問。

3.3.2 有向圖的廣度優(yōu)先搜索

以圖3.3.2.1所示的有向圖為例進(jìn)行廣度優(yōu)先搜索。

圖3.3.2.1

(1)選取A為起始點(diǎn),輸出A,將A入隊(duì)列,標(biāo)記A。

(2)隊(duì)列頭為A,A出隊(duì)列。以A為尾的邊有兩條,對應(yīng)的頭分別為B、C,則A的鄰接頂點(diǎn)有B、C。輸出B、C,將B、C入隊(duì)列,并標(biāo)記B、C。

(3)隊(duì)列頭為B,B出隊(duì)列。B的鄰接頂點(diǎn)為C,C已經(jīng)被標(biāo)記,因此無新元素入隊(duì)列。

(4)隊(duì)列頭為C,C出隊(duì)列。C的鄰接頂點(diǎn)有E、F。輸出E、F,將E、F入隊(duì)列,并標(biāo)記E、F。

(5)隊(duì)列頭為E,E出隊(duì)列。E的鄰接頂點(diǎn)有G、H。輸出G、H,將G、H入隊(duì)列,并標(biāo)記G、H。

(6)隊(duì)列頭為F,F(xiàn)出隊(duì)列。F無鄰接頂點(diǎn)。

(7)隊(duì)列頭為G,G出隊(duì)列。G無鄰接頂點(diǎn)。

(8)隊(duì)列頭為H,H出隊(duì)列。H鄰接頂點(diǎn)為E,但是E已被標(biāo)記,無新元素入隊(duì)列。

(9)隊(duì)列為空,以A為起始點(diǎn)的遍歷過程結(jié)束,此時圖中仍有D未被訪問,則以D為起始點(diǎn)繼續(xù)遍歷。選取D為起始點(diǎn),輸出D,將D入隊(duì)列,標(biāo)記D。

(10)隊(duì)列頭為D,D出隊(duì)列,D的鄰接頂點(diǎn)為B,B已被標(biāo)記,無新元素入隊(duì)列。

(11)隊(duì)列為空,且所有元素均被訪問,廣度優(yōu)先搜索遍歷過程結(jié)束。廣度優(yōu)先搜索的輸出序列為:A->B->E->C->D->F->G->H。

3.4 算法分析

假設(shè)圖有V個頂點(diǎn),E條邊,廣度優(yōu)先搜索算法需要搜索V個節(jié)點(diǎn),時間消耗是O(V),在搜索過程中,又需要根據(jù)邊來增加隊(duì)列的長度,于是這里需要消耗O(E),總得來說,效率大約是O(V+E)。

4 總結(jié)

圖的遍歷主要就是這兩種遍歷思想,深度優(yōu)先搜索使用遞歸方式,需要棧結(jié)構(gòu)輔助實(shí)現(xiàn)。廣度優(yōu)先搜索需要使用隊(duì)列結(jié)構(gòu)輔助實(shí)現(xiàn)。在遍歷過程中可以看出,對于連通圖,從圖的任意一個頂點(diǎn)開始深度或廣度優(yōu)先遍歷一定可以訪問圖中的所有頂點(diǎn),但對于非連通圖,從圖的任意一個頂點(diǎn)開始深度或廣度優(yōu)先遍歷并不能訪問圖中的所有頂點(diǎn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4711

    瀏覽量

    95448
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40761
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12645

原文標(biāo)題:數(shù)據(jù)結(jié)構(gòu)與算法:30張圖弄懂“圖的兩種遍歷方式”

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數(shù)據(jù)結(jié)構(gòu)算法中文第
    發(fā)表于 12-20 21:22

    數(shù)據(jù)結(jié)構(gòu)算法分析

    數(shù)據(jù)結(jié)構(gòu)算法分析
    發(fā)表于 06-05 10:46

    【下載】《嵌入式系統(tǒng)軟件設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)

    教學(xué)參考書。內(nèi)容簡介  根據(jù)嵌入式系統(tǒng)軟件設(shè)計(jì)需要的“數(shù)據(jù)結(jié)構(gòu)”知識編寫而成。書中基本內(nèi)容有:常用線性數(shù)據(jù)結(jié)構(gòu)在嵌入式系統(tǒng)的實(shí)現(xiàn)和相關(guān)算法;樹和
    發(fā)表于 11-30 17:46

    收藏 | 程序員面試,你必須知道的8大數(shù)據(jù)結(jié)構(gòu)

    可以用兩種形式表示:鄰接矩陣鄰接表常見圖遍歷算法廣度優(yōu)先搜索深度優(yōu)先搜索面試關(guān)于的常見問題:
    發(fā)表于 09-30 09:35

    數(shù)據(jù)結(jié)構(gòu)的幾個重要知識點(diǎn)

    。如果你從事編程的工作,不管你現(xiàn)在是不是需要用到數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識,在工作的過程中理解、掌握好數(shù)據(jù)結(jié)構(gòu),對現(xiàn)在的工作和以后的發(fā)展都是有幫助的。
    發(fā)表于 02-27 15:01

    數(shù)據(jù)結(jié)構(gòu)、算法與應(yīng)用(C++語言描述)

    本書在簡要回顧了基本的C++ 程序設(shè)計(jì)概念的基礎(chǔ)上,全面系統(tǒng)地介紹了隊(duì)列、堆棧、樹、等基本數(shù)據(jù)結(jié)構(gòu),以及貪婪算法、分而治之算法、分枝定界算法
    發(fā)表于 09-05 11:31 ?85次下載
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>、<b class='flag-5'>算法</b>與應(yīng)用(C++語言描述)

    數(shù)據(jù)結(jié)構(gòu)教程,下載

    1. 數(shù)據(jù)結(jié)構(gòu)的基本概念 2. 算法數(shù)據(jù)結(jié)構(gòu)3. C語言的數(shù)據(jù)類型及其算法描述要點(diǎn)4. 學(xué)習(xí)算法
    發(fā)表于 05-14 17:22 ?0次下載
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>教程,下載

    C#數(shù)據(jù)結(jié)構(gòu)算法分析_ 魏寶剛

    數(shù)據(jù)結(jié)構(gòu)算法分析》描述了各種類型的數(shù)據(jù)結(jié)構(gòu),包括線性表、樹、堆、,以及查找、排序等算法。自始至終將
    發(fā)表于 12-15 16:46 ?0次下載
    C#<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>和<b class='flag-5'>算法</b>分析_ 魏寶剛

    數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告

    數(shù)據(jù)結(jié)構(gòu) 包含鄰接矩陣構(gòu)造 的深度優(yōu)先遍歷 的廣度優(yōu)先
    發(fā)表于 12-10 16:06 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)算法習(xí)題

    數(shù)據(jù)結(jié)構(gòu)算法習(xí)題,ACM專用,刷題初期按照這個地方刷很好
    發(fā)表于 03-03 18:25 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)算法

    全國C語言考試公共基礎(chǔ)知識點(diǎn)——數(shù)據(jù)結(jié)構(gòu)算法,該資料包含了有關(guān)數(shù)據(jù)結(jié)構(gòu)算法的全部知識點(diǎn)。
    發(fā)表于 03-30 14:27 ?0次下載

    引入深度遍歷機(jī)制的分布式數(shù)據(jù)結(jié)構(gòu)插值算法

    引入深度遍歷機(jī)制的分布式數(shù)據(jù)結(jié)構(gòu)插值算法_龔健虎
    發(fā)表于 01-08 14:55 ?0次下載

    算法數(shù)據(jù)結(jié)構(gòu)——接口

    第三章為算法數(shù)據(jù)結(jié)構(gòu),本文為3.2.3 接口。
    的頭像 發(fā)表于 09-19 17:41 ?8922次閱讀
    <b class='flag-5'>算法</b>與<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>——接口

    大牛分享平時如何學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法

    數(shù)據(jù)結(jié)構(gòu)算法的地位對于一個程序員來說不言而喻。今天這篇文章不是來勸你們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法的,也不是來和你們說數(shù)據(jù)結(jié)構(gòu)
    的頭像 發(fā)表于 11-02 11:25 ?3254次閱讀

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識分享(

    有哪些常見的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡要分享算法基礎(chǔ)、常見的數(shù)據(jù)結(jié)構(gòu)以及排序算法。
    的頭像 發(fā)表于 04-06 16:48 ?833次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識分享(<b class='flag-5'>中</b>)