深度優先遍歷與廣度優先遍歷 遞歸與非遞歸思路


深度優先遍歷

 

1.深度優先遍歷的遞歸定義

 

  假設給定圖G的初態是所有頂點均未曾訪問過。在G中任選一頂點v為初始出發點(源點),則深度優先遍歷可定義如下:首先訪問出發點v,並將其標記為已訪問過;然后依次從v出發搜索v的每個鄰接點w。若w未曾訪問過,則以w為新的出發點繼續進行深度優先遍歷,直至圖中所有和源點v有路徑相通的頂點(亦稱為從源點可達的頂點)均已被訪問為止。若此時圖中仍有未訪問的頂點,則另選一個尚未訪問的頂點作為新的源點重復上述過程,直至圖中所有頂點均已被訪問為止。

  圖的深度優先遍歷類似於樹的前序遍歷。采用的搜索方法的特點是盡可能先對縱深方向進行搜索。這種搜索方法稱為深度優先搜索(Depth-First Search)。相應地,用此方法遍歷圖就很自然地稱之為圖的深度優先遍歷

 

2.基本實現思想:

(1)訪問頂點v;

(2)從v的未被訪問的鄰接點中選取一個頂點w,從w出發進行深度優先遍歷;

(3)重復上述兩步,直至圖中所有和v有路徑相通的頂點都被訪問到。

 

3.偽代碼

遞歸實現

1)訪問頂點v;visited[v]=1;//算法執行前visited[n]=0

(2)w=頂點v的第一個鄰接點;

(3)while(w存在)  

           if(w未被訪問)

                   從頂點w出發遞歸執行該算法;             w=頂點v的下一個鄰接點;

 

非遞歸實現

 (1)棧S初始化;visited[n]=0;

 (2)訪問頂點v;visited[v]=1;頂點v入棧S

 (3)while(棧S非空)

            x=棧S的頂元素(不出棧);

            if(存在並找到未被訪問的x的鄰接點w)

                    訪問w;visited[w]=1;

                    w進棧;

            else

                     x出棧;

 

 

廣度優先遍歷

 

1.廣度優先遍歷定義

 

 圖的廣度優先遍歷BFS算法是一個分層搜索的過程,和樹的層序遍歷算法類同,它也需要一個隊列以保持遍歷過的頂點順序,以便按出隊的順序再去訪問這些頂點的鄰接頂點。 

2.基本實現思想

 

(1)頂點v入隊列。

(2)當隊列非空時則繼續執行,否則算法結束。

(3)出隊列取得隊頭頂點v;訪問頂點v並標記頂點v已被訪問。

(4)查找頂點v的第一個鄰接頂點col。

(5)若v的鄰接頂點col未被訪問過的,則col入隊列。

(6)繼續查找頂點v的另一個新的鄰接頂點col,轉到步驟(5)。

        直到頂點v的所有未被訪問過的鄰接點處理完。轉到步驟(2)。

廣度優先遍歷圖是以頂點v為起始點,由近至遠,依次訪問和v有路徑相通而且路徑長度為1,2,……的頂點。為了使“先被訪問頂點的鄰接點”先於“后被訪問頂點的鄰接點”被訪問,需設置隊列存儲訪問的頂點。

 

 

3.偽代碼

(1)初始化隊列Q;visited[n]=0;

(2)訪問頂點v;visited[v]=1;頂點v入隊列Q;

(3) while(隊列Q非空)   

              v=隊列Q的對頭元素出隊;

              w=頂點v的第一個鄰接點;

             while(w存在) 

                     如果w未訪問,則訪問頂點w;

                     visited[w]=1;

                     頂點w入隊列Q;

                     w=頂點v的下一個鄰接點。

轉自http://www.cnblogs.com/biyeymyhjob/archive/2012/07/18/2596983.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM