【知识强化】第五章 图 5.3 图的遍历
上一節(jié)課我們介紹了有關(guān)圖的基本操作,那么除了上節(jié)課我們介紹的那些相關(guān)基本操作之外,還有一種非常重要的操作就是有關(guān)圖的遍歷。那么圖的遍歷分為兩種,有廣度優(yōu)先搜索,也就是廣度優(yōu)先遍歷。還有深度優(yōu)先搜索。本節(jié)課我們就來學習圖的廣度優(yōu)先搜索。
那么首先我們先來了解介紹一下,圖的遍歷是什么呢?什么是圖的遍歷。其實它圖的遍歷與樹的遍歷以及線性表的遍歷是類似的。它是從圖中某一個頂點出發(fā),按照某種搜索方法沿著圖中的邊對圖中的所有頂點訪問一次,并且只訪問一次。這就是圖的遍歷。那么提到圖的遍歷,提到廣度優(yōu)先搜索,其實它與我們之前學習過樹的層次遍歷的順序是類似的。
那么首先我們先來復習一下,樹的層次遍歷。那么這樣編號的順序是不是就是樹的層次遍歷的順序啊。
我們按照編號的順序依次地訪問樹中的每一個結(jié)點,并且每個結(jié)點只訪問1次。這就是樹的層次遍歷的過程。那么其實,如果我們把該樹看作成一個圖的話,樹的層次遍歷的過程就是圖的廣度優(yōu)先搜索的這樣一個順序。
那么接下來我們就來介紹一下圖的廣度優(yōu)先搜索。首先我們要訪問起始的一個頂點,頂點V。接著我們由該頂點出發(fā),依次訪問V的各個未被訪問過的的鄰接頂點w1,w2,...wi。w1-wi都是V的各個未被訪問過的鄰接頂點。好,接著應該如何訪問呢?我們要訪問它們的所有未被訪問過的鄰接頂點。那么接著我們只要重復該過程,從這些訪問過的頂點出發(fā),再訪問它們未被訪問過的一些頂點,然后依此類推就可以訪問該圖中的所有頂點了。這就是廣度優(yōu)先搜索的過程。我們發(fā)現(xiàn)在廣度優(yōu)先搜索當中,其實我們是優(yōu)先先訪問靠近起始頂點的那些頂點的,這一點與樹的層次遍歷是一致的。那么廣度優(yōu)先搜索和樹的層次遍歷是完全一樣的嗎?我們可以直接把樹的層次遍歷算法直接搬到廣度優(yōu)先搜索上嗎?答案是不是的。
我們發(fā)現(xiàn)在廣度優(yōu)先搜索的描述過程當中,我們強調(diào)了一定是未被訪問過的各個鄰接頂點。好,為什么要強調(diào)的是未被訪問的鄰接頂點呢?我們來看這樣一個例子。這是我們剛剛舉的那一個圖的例子。我們對它進行廣度優(yōu)先搜索。這與它對應樹的層次遍歷的順序是一致的。
那么此時我們在頂點4、
本節(jié)課我們來學習深度優(yōu)先搜索。
首先我們先來復習一下上節(jié)課所學習的廣度優(yōu)先搜索。廣度優(yōu)先搜索類似于樹的層次遍歷,假設我們現(xiàn)在有一個初始頂點1,那么我們從該頂點出發(fā),依次地訪問該圖當中的每一個頂點。那么我們知道廣度優(yōu)先搜索是優(yōu)先訪問離1較近的那一些頂點的,這就是廣度優(yōu)先搜索。
好,廣度優(yōu)先搜索與樹的層次遍歷比較類似。那深度優(yōu)先搜索呢?其實深度優(yōu)先搜索與樹的先序遍歷訪問比較相似。我們先來復習一下樹的先序遍歷。
首先這是一棵樹,然后我們從根結(jié)點1出發(fā),來訪問根結(jié)點。然后訪問根結(jié)點的一棵子樹的根結(jié)點,也就是頂點2。然后依舊訪問頂點2的一棵子樹的根結(jié)點,也就是頂點4。然后按照這樣的規(guī)則訪問頂點7。
那么頂點4的所有的結(jié)點已經(jīng)訪問完畢了,所以我們要訪問頂點2的另一棵子樹的根結(jié)點也就是頂點5。
然后按照這樣的規(guī)則我們訪問了該樹當中的所有頂點。
依舊,如果把樹看成一個圖的的話,那么這樣的順序其實就是這樣一個圖它的深度優(yōu)先搜索的順序。我們在這樣一個類似樹的圖的例子當中發(fā)現(xiàn),是不是廣度優(yōu)先搜索和深度優(yōu)先搜索與它們的名字非常符合啊。廣度優(yōu)先搜索是按照圖的寬度的范圍這樣進行擴展頂點的,
深度優(yōu)先搜索則是按照這樣一條路徑的深度的走向去訪問頂點的。
好,接下來我們就來學習一下,深度優(yōu)先搜索在書中是怎樣描述的。那么這里深度優(yōu)先搜索它的縮寫為DFS,D代表的是深度的意思。首先第一步我們要訪問起始的這個頂點V,然后呢然后我們要從V出發(fā),訪問V的任意一個鄰接且未被訪問過的鄰接頂點wi。大家要注意一下,這里是任意,任意一個符合條件的鄰接頂點都可以,沒有次序的要求。好,接著我們要從wi出發(fā),再訪問滿足條件的鄰接頂點。這里也是任意的一個鄰接且未被訪問的鄰接頂點yi。那么如果wi沒有符合這樣的條件的鄰接頂點呢,我們要退回到它的上一層頂點,也就是V。我們是從V到wi的。然后我們只要重復這樣的過程,直到所有頂點被訪問為止。這樣我們就實現(xiàn)了深度優(yōu)先搜索DFS。
那么大家要注意一下,這里與BFS廣度優(yōu)先搜索一樣,我們也強調(diào)了一定是未被訪問過的這些鄰接頂點。那么也是同樣的要求,我們要為了避免某一個頂點訪問了多次,這樣就不符合圖的遍歷的定義了。我們一起來看一下這個圖的例子。
我們從頂點1出發(fā),首先呢,我們要訪問起始頂點V,也就是訪問這個起始頂點頂點1。然后我們要訪問V的某一個鄰接且未被訪問過的鄰接頂點,這里有頂點2和頂點3,我們訪問哪一個都可以。那么我們訪問頂點2。然后我們從頂點2出發(fā),來訪問頂點2的未被訪問過的任意的一個鄰接頂點,這里我們選取了頂點4。那么接著我們按照相同的步驟訪問了頂點5。大家可能會有疑問,這里為什么我們又訪問了頂點5呢?頂點5明明是頂點2的鄰接頂點啊。我們發(fā)現(xiàn),其實頂點5是不是也是頂點4的鄰接頂點啊,這里我們是通過頂點4訪問到頂點5的。接著我們發(fā)現(xiàn)頂點5是不是沒有符合條件的鄰接頂點了,所以我們返回到了它的上一層頂點也就是頂點4。然后我們依舊從頂點4開始進行訪問,訪問頂點4的一個任意一個鄰接的且未被訪問過的鄰接頂點。這里我們只剩下了頂點7,所以我們要訪問頂點7。然后頂點7依舊沒有符合條件的頂點,我們退回到頂點4,頂點4也沒有符合條件的頂點了,我們又退回到頂點2,依舊退回到頂點1。
那么頂點1有一個符合條件的頂點就是頂點3。這里頂點3沒有被訪問,且與1鄰接。然后頂點3我們依舊要訪問它的一個符合條件的鄰接頂點,就是頂點6。好,這樣我們就訪問過了所有的頂點,實現(xiàn)了深度優(yōu)先搜索。好,這就是DFS,深度優(yōu)先搜索的一個過程。那么接下來我們就來討論一下,如何實現(xiàn)它呢?上一節(jié)課實現(xiàn)廣度優(yōu)先搜索時,我們利用了一個隊列還有一個標記數(shù)組來實現(xiàn)了廣度優(yōu)先搜索。因為隊列可以實現(xiàn)樹的層次遍歷。
那么這里呢?這里的深度優(yōu)先搜索,它與樹的先序遍歷比較像,那么大家聯(lián)想一下,其實深度優(yōu)先搜索它是不是可以用遞歸的形式來實現(xiàn)啊。那么這里,因為遞歸也轉(zhuǎn)化為棧的形式,我們可以將先序遍歷轉(zhuǎn)化為棧的形式,所以深度優(yōu)先搜索一定也可以利用棧來實現(xiàn)。
那么除了遞歸或者是棧,我們還缺了一個輔助的標記數(shù)組,這里與廣度優(yōu)先搜索是一樣的。那么我們用這兩種數(shù)據(jù)結(jié)構(gòu),就可以實現(xiàn)DFS的一個算法。
接下來我們來學習一下深度優(yōu)先搜索是如何用代碼來實現(xiàn)它的。那么這就是一個深度優(yōu)先搜索DFS的代碼。這里我們采用的是遞歸的形式。我們來看一下這個代碼。首先
總結(jié)
以上是生活随笔為你收集整理的【知识强化】第五章 图 5.3 图的遍历的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为传输服务器系统类型,服务器操作系统类
- 下一篇: 绿米空调伴侣接入iobroker_普通空