目錄1 問題描述2 解決方案2.1 蠻力法深度優先查詢(depth-first search,
dfs)可以從任意頂點開始訪問圖的頂點,然後把該頂點標記為已訪問。在每次迭代的時候,該演算法緊接著處理與當前頂點鄰接的未訪問頂點。這個過程一直持續,直到遇到乙個終點——該頂點的所有鄰接頂點都已被訪問過。在該終點上,該演算法沿著來路後退一條邊,並試著繼續從那裡訪問未訪問的頂點。再後退到起始頂點上,並且起始頂點也是乙個終點時,該演算法最終停了下來。這樣,起始頂點所在的連通分量的所有頂點都被訪問過了。如果,未訪問過的頂點仍然存在,該演算法必須從其中任一點開始,重複上述過程。
總之,記住一句話,深度優先查詢就是先盡可能達到當前遍歷路徑能夠達到最長的路徑,一旦達到該路徑終點,再回溯,從原來已遍歷過頂點(ps:該頂點包含多個分支路徑)處開始新的分支路徑遍歷。
此處借用演算法設計與分析基礎(第三版)上一段概念介紹,及說明圖形介紹其具體遍歷過程,下面的具體**使用資料就是下圖中相關資料。
具體**如下:
package執行結果:com.liuzhen.chapterthree;
public
class
depthfirstsearch
}
}/** adjmatrix是待遍歷圖的鄰接矩陣
* value是待遍歷圖頂點用於是否被遍歷的判斷依據,0代表未遍歷,非0代表已被遍歷
* result用於存放深度優先遍歷的頂點順序
* number是當前正在遍歷的頂點在鄰接矩陣中的陣列下標編號
*/public
void dfsvisit(int adjmatrix,int value,char result,int
number)}}
public
static
void
main(string args),,,
,,,,
,,};depthfirstsearch test = new
depthfirstsearch();
test.dfs(adjmatrix,value,result);
system.out.println();
system.out.println("判斷節點是否被遍歷結果(0代表未遍歷,非0代表已被遍歷):");
for(int i = 0;i < value.length;i++)
system.out.print(" "+value[i]);
system.out.println();
system.out.println("深度優先查詢遍歷順序如下:");
for(int i = 0;i < result.length;i++)
system.out.print(" "+result[i]);}}
深度為:0,當前出發點:a當前已行走頂點value[0] = 1 當前i值:2到達c地
當前已行走頂點value[2] = 2 當前i值:3到達d地
當前已行走頂點value[3] = 3 當前i值:5到達f地
當前已行走頂點value[5] = 4 當前i值:1到達b地
當前已行走頂點value[1] = 5 當前i值:4到達e地
當前已行走頂點value[4] = 6深度為:6,當前出發點:g
當前已行走頂點value[6] = 7 當前i值:7到達h地
當前已行走頂點value[7] = 8 當前i值:8到達i地
當前已行走頂點value[8] = 9 當前i值:9到達j地
當前已行走頂點value[9] = 10判斷節點是否被遍歷結果(0代表未遍歷,非0代表已被遍歷):
1 5 2 3 6 4 7 8 9 10深度優先查詢遍歷順序如下:
a c d f b e g h i j
關於廣度優先查詢和深度優先查詢
由於最近在做的專案中設計到了虛擬dom的設計,那自然就避免不了需要對虛擬dom中的節點進行遍歷 查詢了,一般來說查詢節點無非就兩種方法 廣度優先查詢和深度優先查詢,這跟我們在資料結構中學習到的樹的遍歷其實是一樣的。ok,廢話不多說,講一下我對這兩種查詢方法的理解吧。首先廣度優先查詢,bfs,它的乙個...
演算法筆記 深度優先搜尋 DFS
深度優先搜尋 depth first search,簡稱深搜 是一種極其常用的演算法,簡單來說,符合以下策略的就可以稱為深度優先搜尋。在圖中行走,沒有走過的點稱為 新點 所有走過的點稱為 舊點 開始時所有的點都是新點,從任意節點1出發,走向任意乙個新節點,同時將新節點標記為舊節點,然後重複此步驟。如...
《演算法筆記》8 1 深度優先搜尋
一.深度優先搜尋 列舉所有完整路徑以遍歷所有情況 實現方式 遞迴 非遞迴 示例一 無效終點 if index n nowk k sum x return 選第 index 個數 temp.push back s index dfs index 1,nowk 1,sum s index sumsqu ...