JS实现图结构封装,使用邻接表实现(广度优先搜索,深度优先搜索)

JS实现图结构使用邻接表实现(广度优先搜索,深度优先搜索)

1.获取到的知识

  • 层序遍历
    • 实现原理:先对每层做标记,如果标记一次进行遍历,遇到已经遍历过的,跳过
  • 巧妙之处:对于图结构的表示中有一种邻接表,类似于哈希表中的链地址法,可以方便的把顶点和每个每条边对应起来,每个边也对应的是一个顶点,这样就可以把图机构抽象成程序储存起来,下图的邻接表可以用链表或者数组都可以实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QRGjgJbV-1601890213224)(data:image/jpeg;base64,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)]

2. 广度优先搜索和深度优先搜索

2.1 广度优先搜索的巧妙之处 (BFS)

1.广度优先搜索原理主要是利用队列来实现,先把所有的内容都给搜索到,然后再依次的去处理每一个搜索到的内容

2.利用一个对象或者Map来储存是否是已经遍历或者探测过的对象,来避免重复查询

bfs() {
    //0 首先需要一个标识符来确定每个顶点是否已经进入过队列
    let queue = [];
    let vertexesMap = this.isExpload();
    //1. 拿到第一个顶点,加入队列中
    vertexesMap.set(this.vertexes[0], true);
    queue.push(this.vertexes[0]);
    //2. 根据队列不为空循环处理队列的内容
    while (queue.length != 0) {
      //3. 执行队列中的第一个顶点
      //4. 拿到顶点之后,弹出顶点
      let vertexe = queue.shift();
      //5. 对这个顶点执行相应的操作,实际可是传递一个回调函数来进行处理
      console.log(vertexe);
      //6. 循环探测该顶点的边连接的其他的所有顶点。
      let otherVertexes = this.edges.get(vertexe);
      for (let i = 0; i < otherVertexes.length; i++) {
        //7. 对探测的顶点进行判断
        //7.1 如果顶点没有加入,则把该顶点加入队列
        if (!vertexesMap.get(otherVertexes[i])) {
          vertexesMap.set(otherVertexes[i],true);
          queue.push(otherVertexes[i]);
        }
        //7.2 如果顶点已经被加入过队列,则不再加入.
      }

    }
  }

2.2 深度优先搜索

​ 深度优先搜索算法和哈希表的先序、中序、后序、遍历思想差不多一致,只不过多了一个用于储存顶点是否发生改变的状态。

通过储存每个顶点是否已经被探测过,来觉得是否对该顶点进行遍历处理

//深度优先搜索 DeepFirstSearch 
  dfs(){
    //深度搜索原理是通过递归,先把一个分支上的所有内容都遍历完成,然后再去遍历其他的分支
    //1.获取所有状态
    let vertexesMap = this.isExpload();
    this.dfsNode(this.vertexes[0],vertexesMap);
  }
  //遍历处理每个顶点
  dfsNode(vertexe,vertexesMap){
    //1. 需要标识符来判断是否已经处理过。
    
    //1.1 处理传入的顶点,并把顶点切换为已经处理
    console.log(vertexe);
    vertexesMap.set(vertexe,true);
    //2.获取传入顶点的边所对应的顶点;
    let vertexes = this.edges.get(vertexe);
    //3.根据循环遍历获得的顶点
    for(let i=0;i<vertexes.length;i++){
      //4.判断顶点是否已经处理过
      //4.1 如果没有处理过,继续调用该函数,进行处理遍历
      if(  !vertexesMap.get(vertexes[i])  ){
        this.dfsNode(vertexes[i],vertexesMap);
      }
      //4.2 如果处理过则不用管了,
    }

  }

3.完整图结构封装代码

/* 图结构封装 */
class Graph {
  constructor() {
    //需要的属性,图结构表示方法使用:邻接表
    //1.顶点
    this.vertexes = [];
    //2.边
    this.edges = new Map();
  }
  //插入一个顶点
  insertVertexes(v) {
    this.vertexes.push(v);
    this.edges.set(v, []);
  }
  //插入一条边
  insertEdge(v1, v2) {
    this.edges.get(v1).push(v2);
    this.edges.get(v2).push(v1);
  }
  //返回一个Map,包含一个 key(元素) 和 一个val (是否已经被探测过)
  isExpload() {
    let vertexesMap = new Map();
    let vertexes = this.vertexes;
    for (let i = 0; i < vertexes.length; i++) {
      vertexesMap.set(vertexes[i], false);
      let edges = this.edges.get(vertexes[i]);
      for (let j = 0; j < edges.length; j++) {
        vertexesMap.set(edges[j], false);
      }
    }
    return vertexesMap;
  }
  //广度优先搜索 BFS BroundFirstSearch
  bfs() {
    //广度优先搜索原理主要是利用队列来实现,先把所有的内容都给搜索到,然后再依次的去处理每一个搜索到的内容
    //0 首先需要一个标识符来确定每个顶点是否已经进入过队列
    let queue = [];
    let vertexesMap = this.isExpload();
    //1. 拿到第一个顶点,加入队列中
    vertexesMap.set(this.vertexes[0], true);
    queue.push(this.vertexes[0]);
    //2. 根据队列不为空循环处理队列的内容
    while (queue.length != 0) {
      //3. 执行队列中的第一个顶点
      //4. 拿到顶点之后,弹出顶点
      let vertexe = queue.shift();
      //5. 对这个顶点执行相应的操作,实际可是传递一个回调函数来进行处理
      console.log(vertexe);
      //6. 循环探测该顶点的边连接的其他的所有顶点。
      let otherVertexes = this.edges.get(vertexe);
      for (let i = 0; i < otherVertexes.length; i++) {
        //7. 对探测的顶点进行判断
        //7.1 如果顶点没有加入,则把该顶点加入队列
        if (!vertexesMap.get(otherVertexes[i])) {
          vertexesMap.set(otherVertexes[i],true);
          queue.push(otherVertexes[i]);
        }
        //7.2 如果顶点已经被加入过队列,则不再加入.
      }

    }
  }
  //深度优先搜索 DeepFirstSearch 
  dfs(){
    //深度搜索原理是通过递归,先把一个分支上的所有内容都遍历完成,然后再去遍历其他的分支
    //1.获取所有状态
    let vertexesMap = this.isExpload();
    this.dfsNode(this.vertexes[0],vertexesMap);
  }
  //遍历处理每个顶点
  dfsNode(vertexe,vertexesMap){
    //1. 需要标识符来判断是否已经处理过。
    
    //1.1 处理传入的顶点,并把顶点切换为已经处理
    console.log(vertexe);
    vertexesMap.set(vertexe,true);
    //2.获取传入顶点的边所对应的顶点;
    let vertexes = this.edges.get(vertexe);
    //3.根据循环遍历获得的顶点
    for(let i=0;i<vertexes.length;i++){
      //4.判断顶点是否已经处理过
      //4.1 如果没有处理过,继续调用该函数,进行处理遍历
      if(  !vertexesMap.get(vertexes[i])  ){
        this.dfsNode(vertexes[i],vertexesMap);
      }
      //4.2 如果处理过则不用管了,
    }

  }
}
let graph = new Graph();
graph.insertVertexes('a');
graph.insertVertexes('b');
graph.insertVertexes('c');
graph.insertVertexes('d');
graph.insertEdge("a",'b');
graph.insertEdge("a",'c');
graph.insertEdge("a",'d');
graph.insertEdge("b",'c');
graph.insertEdge("b",'d');
// graph.bfs();
graph.dfs();

我的个人博客地址:点次进入我的博客网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 邻接表和邻接矩阵都可以用来实现的深度和广度优先搜索算法以及dijkstra算法。 深度优先搜索算法(DFS)是一种递归的算法,它从的某个顶点开始遍历,尽可能深地搜索,直到找到目标节点或者到达的最深处。邻接表和邻接矩阵都可以用来实现DFS算法。 广度优先搜索算法(BFS)是一种非递归的算法,它从的某个顶点开始遍历,先访问该顶点的所有邻居节点,然后再访问邻居节点的邻居节点,以此类推,直到找到目标节点或者遍历完整个邻接表和邻接矩阵都可以用来实现BFS算法。 Dijkstra算法是一种用于求解最短路径的算法,它可以用邻接矩阵或者邻接表实现。该算法从起点开始,逐步扩展到其他节点,每次选择当前距离起点最近的节点,并更新与该节点相邻的节点的距离。最终得到起点到其他节点的最短路径。 ### 回答2: 是离散数学中一个非常重要的数据结构,其广泛应用于计算机科学、网络科学、金融、生物医学等各个领域。对于的遍历和最短路径查找是论中非常基础和重要的算法。其中,深度优先遍历(DFS)、广度优先遍历(BFS)和迪杰斯特拉算法(Dijkstra)是三种经典的算法,下面对使用邻接表或邻接矩阵实现这三种算法进行详细说明。 1. 邻接表的DFS和BFS算法: 邻接表是一种基于链表表示方法,将每个顶点与其相邻的顶点列表连成一个链表,即每个顶点对应着一个链表,在链表中存储与该顶点相连的所有边。邻接表的DFS和BFS算法可以简单理解为对所有顶点进行遍历,遍历过程中使用栈或队列来记录遍历路径。 具体而言,DFS算法通过递归方式遍历每个节点,从起始节点开始,沿着一条路径走到底,当走到某个节点时,若该节点的相邻节点有未访问的节点,则递归访问该节点的一个未访问的相邻节点,直到所有的节点都被访问为止。BFS算法则通过队列将之前已经访问过的节点从队列中移除,并将该节点的未访问的相邻节点添加到队列末尾,直到队列为空为止。 2. 邻接矩阵的DFS和BFS算法: 邻接矩阵是一种基于二维数组的表示方法,将行和列分别表示中的顶点和边。邻接矩阵的DFS和BFS算法可以看做对邻接矩阵进行深度或广度优先遍历的过程。 具体而言,邻接矩阵的DFS和BFS算法的实现过程与邻接表类似,只不过用邻接矩阵来存储的信息。DFS算法的实现过程中,需要使用栈来记录遍历路径,BFS算法的实现过程中,需要使用队列来记录遍历路径。 3. 邻接表的Dijkstra算法: 邻接表的Dijkstra算法是一种基于贪心策略的最短路径算法。其实现过程主要分为以下几个步骤: (1)通过邻接表来表示带权有向邻接表中每个节点存储该节点的邻接点列表和每个邻接点到该节点的边权值。 (2)设置源点s到每个节点的最短距离数组dis[],初值为无穷大,源点s到 s 的距离为0。 (3)设置源点s到每个节点的前驱路径数组path[],初值为NULL。 (4)将源点s加入集合s{ },并更新dis数组和path数组。 (5)对于其它节点,重复执行以下步骤: a) 在集合V-s{ }中找到距离源点s最近的节点u,并将其加入到s{ }中。 b) 以节点u为中转点,更新节点u的邻接点v到源点s的最短距离dis[v]和前驱路径path[v]。 c) 如果集合V-s{ }为空,算法结束。 4. 邻接矩阵的Dijkstra算法: 邻接矩阵的Dijkstra算法也是一种基于贪心策略的最短路径算法。其实现过程与邻接表类似,只是用邻接矩阵来存储的信息。邻接矩阵的Dijkstra算法的实现可以采用优先队列来提高算法效率。 总而言之,邻接表和邻接矩阵都是常用的表示方法,在实现DFS、BFS和Dijkstra算法时,可以根据具体问题需要选择合适的方法。DFS和BFS算法是遍历的基础,可以通过邻接表和邻接矩阵实现;Dijkstra算法是求解最短路径问题的经典算法,其实现需要采用邻接表或邻接矩阵,通过优先队列可以进一步提高算法效率。 ### 回答3: 邻接表和邻接矩阵是的两种常见的数据结构表示方法。在实现深度和广度优先搜索算法时,可以根据实际情况选择适合的数据结构。如果中有大量的稀疏节点或边,则邻接表更加适合;如果中边和节点数量相对较多,则使用邻接矩阵较为合适。 深度优先搜索算法是一种递归算法,从起始节点开始,不断向下搜索,直到没有相邻未被访问的节点。在实现深度优先搜索算法时,需要建立一个visited数组保存节点是否被访问过的信息,在遍历每个节点时将其visited数组标记为已访问,递归搜索其所有相邻未访问节点,直到所有节点都已被访问。 广度优先搜索算法是一种迭代算法,从起始节点开始,依次遍历每一层节点,直到找到目标节点为止。在实现广度优先搜索算法时,需要建立一个队列来保存已访问的节点,每次取出队列头部节点,遍历其所有相邻未访问节点,并将其加入队列尾部继续搜索。在遍历时,需要保存每个节点的父节点以便最后还原路径。 Dijkstra算法是一种最短路径算法,可以用于有向或无向。在实现Dijkstra算法时,需要建立一个距离数组保存起点到每个节点的距离,另一个visited数组保存节点是否已被访问过。每次从未访问过的节点中选择距离起点最近的节点作为当前节点,遍历其相邻节点,并更新其距离数组。重复这个过程,直到所有节点都被访问过。 以上算法都可以使用邻接表或邻接矩阵进行实现邻接表可以通过数组和链表结合的方式进行实现,每个节点对应一个链表保存其相邻节点。邻接矩阵则可以通过二维数组来实现,其中矩阵中的元素表示两个节点之间是否有边。在具体使用时,需要根据具体情况选择不同的数据结构,以便更好地优化运行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值