算法基础——深度优先搜索(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

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