【JavaScript数据结构】图概念、结构分析、广度深度优先、最短路径问题

图的表示方式

  • 主要以无向图学习
    在这里插入图片描述在这里插入图片描述

如何用JS表示邻接图?

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  • 为什么不用类定义?因为结构过于复杂
let Graph = function(){
    //存储顶点
    let vertices = []
    //存储边
    let adjList = {}

    //1.添加顶点
    this.addVertex = function(v){
        vertices.push(v)
        adjList[v] = []
    }

    // 2.添加边
    this.addEdge = function(a,b){
        adjList[a].push(b)
        adjList[b].push(a)
    }
}

let g = new Graph()

g.addVertex('A')
g.addVertex('B')
g.addEdge('A','B')

图遍历:广度优先和深度优先

在这里插入图片描述
在这里插入图片描述

广度优先遍历

  • 采用队列的方法
    在这里插入图片描述
  • 使用数组的push()shif()方法模拟队列
function initColor(){
        let color = {}
        for(let i = 0;i<vertices.length;i++){
            color[vertices[i]] = 'white'
        }
        return color
    }
    this.bfs = function(v,callback){
        let color = initColor()
        let queue = []
        // 入队
        queue.push(v)

        while(!queue.length){
            let now = queue.shift()
            let bian = adjList[now]
            for(let i = 0;i < bian.length;i++){
                let w = bian[i]
                if (color[i] == 'white'){
                	//未发现的全部入列 并且标识为已发现
                    color[i] = 'grey'
                    queue.push(w)
                }
            }
            color[now] = 'black'
            if(callback){
                callback(now)
            }

        }
    }

最短路径问题

在这里插入图片描述- 设置两个对象记录起点到任意点的距离和任意一个点的回溯点

let d = {}
let pred = {}
  • 初始化
for(let i = 0;i < vertices.length;i++){
            d[vertices[i]] = 0
            pred[vertices[i]] = null
        }
  • 设置回溯点
if (color[i] == 'white'){
      color[i] = 'grey'
         // 设置回溯点
         pred[w] = now
         d[w] =d[now] + 1

         queue.push(w)
     }

在这里插入图片描述

  • 广度优先算法能保证每个回溯点是最近的
let s = g.bfs()
let stack = []
var best_short = function(from,to){
    let v = to
    while(v !== from){
        stack.push(v)
        v = s.pred[to]
    }

    while(stack.length){
        console.log(stack.pop());
    }

}

深度优先遍历DFS

  • 主要使用递归
    let dfsVisit = function(u,color,callback){
        color[u] = 'gery'
        let n = adjList[u]
        for(let i = 0;i < n.length;i++){
            let w = n[i]
            if(color[w] == 'white'){
                dfsVisit(w,color,callback)
            } 
        }
        color[u] = 'black'
    }
    this.dfs = function (v, color, callback){
        color = initColor()
        dfsVisit(v,color,callback)
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值