1. 程式人生 > >我的Java學習-資料結構裡圖的深度優先搜尋演算法

我的Java學習-資料結構裡圖的深度優先搜尋演算法

資料結構的學習比較枯燥乏味,尤其是在學習搜尋演算法的時候。在反覆的學習和程式碼的研究後,其實還是能夠在裡面找到些東西讓自己回味。 圖的深度優先搜尋,從圖的某一頂點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;
    }