廣度優先遍歷的演算法
『壹』 基本演算法——深度優先搜索(DFS)和廣度優先搜索(BFS)
深度優先搜索和廣度優先搜索,都是圖形搜索演算法,它兩相似,又卻不同,在應用上也被用到不同的地方。這里拿一起討論,方便比較。
一、深度優先搜索
深度優先搜索屬於圖演算法的一種,是一個針對圖和樹的遍歷演算法,英文縮寫為DFS即Depth First Search。深度優先搜索是圖論中的經典演算法,利用深度優先搜索演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆數據結構來輔助實現DFS演算法。其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。
基本步奏
(1)對於下面的樹而言,DFS方法首先從根節點1開始,其搜索節點順序是1,2,3,4,5,6,7,8(假定左分枝和右分枝中優先選擇左分枝)。
(2)從stack中訪問棧頂的點;
(3)找出與此點鄰接的且尚未遍歷的點,進行標記,然後放入stack中,依次進行;
(4)如果此點沒有尚未遍歷的鄰接點,則將此點從stack中彈出,再按照(3)依次進行;
(5)直到遍歷完整個樹,stack里的元素都將彈出,最後棧為空,DFS遍歷完成。
二、廣度優先搜索
廣度優先搜索(也稱寬度優先搜索,縮寫BFS,以下採用廣度來描述)是連通圖的一種遍歷演算法這一演算法也是很多重要的圖的演算法的原型。Dijkstra單源最短路徑演算法和Prim最小生成樹演算法都採用了和寬度優先搜索類似的思想。其別名又叫BFS,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。基本過程,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則演算法中止。一般用隊列數據結構來輔助實現BFS演算法。
基本步奏
(1)給出一連通圖,如圖,初始化全是白色(未訪問);
(2)搜索起點V1(灰色);
(3)已搜索V1(黑色),即將搜索V2,V3,V4(標灰);
(4)對V2,V3,V4重復以上操作;
(5)直到終點V7被染灰,終止;
(6)最短路徑為V1,V4,V7.
『貳』 廣度優先遍歷是什麼
1.廣度優先遍歷的思想廣度優先遍歷類似樹的按層次遍歷。設初始狀態時圖中的所有頂點未被訪問,則演算法思想為:首先訪問圖中某指定的起始頂點v,並將其標記為已訪問過,然後由v出發依次訪問v的各個未被訪問的鄰接點v1,v2,…,vk;並將其均標識為已訪問過,再分別從v1,v2,…,vk出發依次訪問它們未被訪問的鄰接點,並使「先被訪問頂點的鄰接點」先於「後被訪問頂點的鄰接點」被訪問。直至圖中所有與頂點v路徑相通的頂點都被訪問到。
若G是連通圖,則遍歷完成;否則,在圖G中另選一個尚未訪問的頂點作為新源點繼續上述搜索過程,直至圖G中所有頂點均被訪問為止。
2.廣度優先遍歷示例例如,對圖7-18(a)所示的圖G,假設指定從頂點v1開始進行廣度優先遍歷,首先訪問v1,因與v1相鄰並且未被訪問過的頂點有v2和v6,則訪問v2和v6,然後訪問與v2相鄰並未訪問的鄰接點v2,v7,再訪問與v6相鄰並且未被訪問過的鄰接點v5,按這樣的次序依次訪問與v2相鄰並且未被訪問過的鄰接點v4,v8,與v7相鄰並且未被訪問過的鄰接點v9,此時,與v5,v4,v8,v9相鄰並且未被訪問過的鄰接點沒有了,即圖G中的所有頂點訪問完,其遍歷序列為:v1->v2->v6->v2->v7->v5->v4->v8->v9。這種順序不是唯一的,如果從v1出發後,相鄰的多個頂點優先選擇序號大的頂點訪問,其遍歷序列為:v1->v6->v2->v5->v7->v2->v4->v9->v8。同理,圖7-18(b)是假設從v1開始,相鄰的多個頂點優先選擇序號小的頂點訪問,其遍歷序列為:v1->v2->v2->v4->v5->v6->v7->v8;相鄰的多個頂點優先選擇序號大的頂點訪問,其遍歷序列為:v1->v2->v2->v7->v6->v5->v4->v8。圖7-18(c)假設從a開始,相鄰的多個頂點優先選擇ASCII碼小的頂點訪問,其遍歷序列為:a->b->d->e->f->c->g;相鄰的多個頂點優先選擇ASCII碼大的頂點訪問,其遍歷序列為:a->f->e->d->b->g->c。
2.廣度優先遍歷的演算法在廣度優先遍歷中,要求先被訪問的頂點其鄰接點也被優先訪問,因此,必須對每個頂點的訪問順序進行記錄,以便後面按此順序訪問各頂點的鄰接點。應利用一個隊列結構記錄頂點的訪問順序,將訪問的每個頂點入隊,然後再依次出隊。
在廣度優先遍歷過程中,為了避免重復訪問某個頂點,也需要創建一個一維數組visited[n](n是圖中頂點的數目),用來記錄每個頂點是否已被訪問過。
『叄』 廣度優先演算法
廣度優先演算法(Breadth-First Search),同廣度優先搜索,又稱作寬度優先搜索,或橫向優先搜索,簡稱BFS,是一種圖形搜索演演算法。簡單的說,BFS是從根節點開始,沿著樹的寬度遍歷樹的節點,如果發現目標,則演算終止。廣度優先搜索的實現一般採用open-closed表。
『肆』 廣度優先遍歷的演算法
template <int max_size>
void Digraph<max_size> ::
breadth_first(void (*visit)(Vertex &)) const
/* Post: The function *visit has been performed at each vertex of the Digraph in breadth-first order.
Uses: Methods of class Queue. */
{
Queue q;
bool visited [max_size];
Vertex v, w, x;
for (all v in G) visited [v] = false;
for (all v in G)
if (!visited [v]) {
q.append (v);
while (!q.empty ( )){
q.retrieve (w);
if (!visited [w]) {
visited [w] = true; (*visit) (w);
for (all x adjacent to w) q.append (x); }
q.serve ( ); } }
}
廣度優先搜索演算法pascal 演算法框架
Program BFS;
初始化,存儲初始狀態(記錄初始結點);
設隊列首指針closed=0;隊列尾指針open:=1;
repeat
首指針closed後移一格,取其所指向的結點;
for r:=1 to max_r do
begin
if子結點符合條件 且 子結點沒有重復擴展 then
begin
尾指針open加1;把新結點存入隊列尾;
記錄相關信息;
if 達到目標 then 輸出且結束;
end;
until closed>=open(隊列空)
『伍』 深度優先遍歷與廣度優先遍歷的區別
一、指代不同
1、深度優先遍歷:是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。
2、廣度優先遍歷:系統地展開並檢查圖中的所有節點,以找尋結果。
二、特點不同
1、深度優先遍歷:所有的搜索演算法從其最終的演算法實現上來看,都可以劃分成兩個部分──控制結構和產生系統。正如前面所說的,搜索演算法簡而言之就是窮舉所有可能情況並找到合適的答案,所以最基本的問題就是羅列出所有可能的情況,這其實就是一種產生式系統。
2、廣度優先遍歷:並不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。
三、演算法不同
1、深度優先遍歷:把根節點壓入棧中。每次從棧中彈出一個元素,搜索所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記為它下一級元素的前驅。找到所要找的元素時結束程序。如果遍歷整個樹還沒有找到,結束程序。
2、廣度優先遍歷:把根節點放到隊列的末尾。每次從隊列的頭部取出一個元素,查看這個元素所有的下一級元素,把它們放到隊列的末尾。並把這個元素記為它下一級元素的前驅。找到所要找的元素時結束程序。如果遍歷整個樹還沒有找到,結束程序。
『陸』 圖的遍歷方法主要包括
圖的遍歷方法主要包括深度優先搜索法和廣度(寬度)優先搜索法兩種演算法。
廣度優先遍歷(Breadth First Search),又稱為廣度優先搜索,簡稱BFS。深度優化遍歷(Depth First Search),也有稱為深度優化搜索,簡稱為DFS。事實上,我們在樹的遍歷中早已涉及DFS,層序遍歷、中序遍歷和後序遍歷都屬於深度優先遍歷的方式,因為這些遍歷方式本質上都歸結於棧。
圖的遍歷方法復雜性介紹
① 在圖結構中,沒有一個「自然」的首結點,圖中任意一個頂點都可作為第一個被訪問的結點。
② 在非連通圖中,從一個頂點出發,只能夠訪問它所在的連通分量上的所有頂點,因此,還需考慮如何選取下一個出發點以訪問圖中其餘的連通分量。
③ 在圖結構中,如果有迴路存在,那麼一個頂點被訪問之後,有可能沿迴路又回到該頂點。
④ 在圖結構中,一個頂點可以和其它多個頂點相連,當這樣的頂點訪問過後,存在如何選取下一個要訪問的頂點的問題。
『柒』 JS 深度優先遍歷(DFS)和廣度優先遍歷(BFS)
深度優先遍歷DFS
自定義:深度單線遊走,從根走完最後一個節點,在遊走兄弟節點,走完兄弟的所有子節點,循環之。
銀高返 遞歸演算法:
function deepFirstSearch(node, nodeList = []) {
if (node) {
nodeList.push(node);
var children = node.children;
for (var i = 0; i < children.length; i++)
//每次遞歸的時候將 需要遍歷的節點 和 節點所存儲的數組傳下去
deepFirstSearch(children[i], nodeList);
}
return nodeList;
}
非遞歸演算法:
function deepFirstSearch(node) {
var nodes = [];
if (node != null) {
var stack = [];
stack.push(node);
while (stack.length != 0) {
var item = stack.pop();
nodes.push(item);
var children = item.children;
for (var i = children.length - 1; i >= 0; i--)
stack.push(children[i]);
}
}
return nodes;
}
廣度優先遍歷(BFS)
自定義:從根開始 層層推進 走完一層 走下一層 (猶如爬樓,走完一層的樓梯,繼續下一層的樓梯)
遞鋒飢歸演算法:(容易念森棧溢出)
function breadthFirstSearch(node) {
var nodes = [];
var i = 0;
if (!(node == null)) {
nodes.push(node);
breadthFirstSearch(node.nextElementSibling);
node = nodes[i++];
breadthFirstSearch(node.firstElementChild);
}
return nodes;
}
非遞歸演算法:(推薦)
function breadthFirstSearch(node) {
var nodes = [];
if (node != null) {
var queue = [];
queue.unshift(node);
while (queue.length != 0) {
var item = queue.shift();
nodes.push(item);
var children = item.children;
for (var i = 0; i < children.length; i++)
queue.push(children[i]);
}
}
return nodes;
}