算法基礎——深度優先搜索(DFS)和廣度優先搜索(BFS)

深度優先搜索和廣度優先搜索 都是圖的遍歷方法,從一個頂點出發,沿着邊訪遍圖中所有的頂點。

深度優先搜索(Depth-First-Search 簡稱 DFS):

是一種不撞南不回頭的走法,一條路走到黑, 從一個頂點出發,一直往前走,並標記走過都路口,直到不能再走,就往回走在選一條沒走過的岔路繼續走,直到把把所以頂點都走遍 。

DFS
如果存儲結構不固定訪問順序可以有多種:
在這裏插入圖片描述

在這裏插入圖片描述

//鄰接矩陣的深度優先遞歸算法
function DFS(G,i) {
// i 爲頂點數,G爲鄰接矩陣對
    visited[i] = truefor (let j = 0; j < G.numVertexes; j++) {
    //依次訪問 i 所在的行 ,G.numVertexes頂點數
        if (G.arc[i][j] == 1 && !visited[j]) {
            console.log(G.vexs[i], '->', G.vexs[j])
            //打印上一個頂點和被訪問的頂點
            DFS(j) //對未訪問的頂點進行遞歸
        }
    }
}
//鄰接矩陣的深度遍歷操作
function DFSTraverse() {
    for (let i = 0; i < G.numVertexes; i++) {
        visited[i] = false;
    }
    for (let i = 0; i < G.numVertexes; i++) {
        if (!visited[i])
            DFS(i)
    }
}

詳情請查看:
https://www.cnblogs.com/xbblogs/p/9931893.html

廣度優先搜索(Breadth-First-Search 簡稱 BFS):

是一種地毯式搜索法,從一個頂點出發,依次訪問這個頂點所以相鄰都頂點V1,V2…Vn,再按這些頂點都先後次序依次訪問跟它們相鄰都未被訪問都頂點,直到所以頂點都被訪問。

BFS
廣度優先遍歷實現:
在這裏插入圖片描述

//鄰接矩陣的廣度遍歷算法
function BFSTraverse() {
    let queue = []; //初始化隊列
    for (let i = 0; i < G.numVertexes; i++) {
        visited[i] = false;
    }
    for (let i = 0; i < G.numVertexes; i++) { //對每一個頂點做循環
        if (!visited[i]) { //如果沒有訪問過就處理
            visited[i] = true;
            console.log('打印頂點:', G.vexs[i]) //也可以是其他操作
            queue.push(i); //將此頂點入隊列
            while (queue.length != 0) { //當前隊列不爲空
                queue.shift();//將剛訪問的頂點出隊
                for (let j = 0; j < G.numVertexes; j++) {
                    //判斷其他頂點若與當前頂點存在邊且未訪問過
                    if (G.arc[i][j] == 1 && !visited[j]) {
                        visited[j] = true;
                        console.log(G.vexs[i], '->', G.vexs[j])
                        console.log('打印頂點:', G.vexs[j])
                        queue.push(j) //將此頂點放入隊列
                    }
                }
            }
        }
    }
}

詳情請查看:
https://www.cnblogs.com/xbblogs/p/9931893.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章