我的Java學習-資料結構裡圖的深度優先搜尋演算法
阿新 • • 發佈:2018-12-17
資料結構的學習比較枯燥乏味,尤其是在學習搜尋演算法的時候。在反覆的學習和程式碼的研究後,其實還是能夠在裡面找到些東西讓自己回味。 圖的深度優先搜尋,從圖的某一頂點v出發,遍歷任何一個與v相鄰的沒有被訪問的頂點v2,v3等,再從v2出發,遍歷任何一個與v2相鄰的沒有被訪問的頂點v4, v5等,重複直到所有頂點都被訪問。 儲存所有頂點最後顯示出來,可以考慮用StringBuilder類物件,依次append()方法,將所有訪問過的不重複的頂點加入進去。也可以用ArrayList 類物件,將頂點儲存進去。如果只是顯示出來,顯然StringBuilder更加簡單。 考慮某個頂點是否被訪問過,可以使用boolean[number]陣列方式來儲存每個頂點的被訪問情況,如果已經訪問,將對應元素置為true。在遍歷的演算法裡,新增陣列元素的訪問判斷。 用棧來儲存某個頂點出發相鄰沒有被訪問的頂點。為什麼用棧而不是其他的連結串列來完成呢?顯然是棧更加合適,每次訪問某一個頂點,棧提供給外界訪問的只有棧頂元素,效率更高。棧的演算法也簡單,進棧,出棧。
public String depthFirstSearch(int v) { //深度優先圖的搜尋演算法 if(v < 0 || v >= numOfVexs){ //確保v是某一個頂點的數字 throw new ArrayIndexOutOfBoundsException(); } visited = new boolean[numOfVexs]; //設定訪問標記 StringBuilder sb = new StringBuilder(); //儲存訪問過頂點名稱 Stack<Integer> stack = new Stack<Integer>(); //用棧來完成遍歷 stack.push(v); //將頂點的數字入棧 visited[v] = true; //將頂點確定為已經訪問 while( !stack.isEmpty() ){ v = stack.pop(); sb.append(vexs[v] + ","); //頂點加入sb顯示名稱 for(int i = numOfVexs - 1; i >= 0; i --){ //對所有頂點遍歷 if( (edges[v][i] != 0 && edges[v][i] != Integer.MAX_VALUE) && !visited[i] ){ //如果頂點i與v有連線並且沒有被訪問 stack.push(i); //將頂點i入棧 visited[i] = true; } } } //如果sb長度大於0,返回sb名稱,否則返回空null return sb.length() > 0 ? sb.substring(0, sb.length() - 1) : null; }