跳转到内容
返回

《学习JavaScript数据结构与算法》笔记---图论

本文源码 这里

什么是图

1.图是网络结构的抽象模型2.由一组边连接的顶点(或节点)组成

图

图和树的区别

1.树和链表也是图的一种2.但是和树不同,树的左右两个子树的节点不可以相连,图可以(如上图)

图可以干嘛

用来抽象实际生活中某些关系网的结构,比如

关于图的术语

顶点:图中的一个点;比如在地铁图中的某一站;人际关系网中某个人

:顶点之间的距离;比如地铁图中两站之间的距离

相邻顶点:一条边链接在一起的2个顶点称为相邻顶点

:一个顶点的度是相邻顶点的数量

出度:某个顶点指向别的顶点的数量

入度:别的顶点指向某个顶点的数量

路径:两顶点之间经过的所有顶点构成的一个顶点序列称为路径,可以有多个;

无向图:假设有AB两个顶点通过一条边连接在一起,可以从A-B也可以从B-A,这条边没有方向,就称为无向图;(如上图)

有向图:假设有AB两个顶点通过一条边连接在一起,只可以从A->B或B->A,称为有向图(下图)

有向图

无权图:图中的边没有携带权重,称为无权图(上面两个图都是)

带权图:边有一定的权重;这个权重可以表示各种想表示的数据,比如花费时间,顺序,等等

带权图

用代码表示图

使用邻接矩阵(表示顶点之间相邻关系的矩阵)

邻接矩阵

使用邻接表(本文也是用这种方式)

邻接表

关于图的遍历

1.需要注意的时,遍历时不能重复访问某个节点,且需要指定第一个要访问的节点,一般对图的遍历常用的有一下2种算法

2.广度优先算法(BFS)

3.深度优先算法(DFS)

4.上述的两种方式遍历结果的区别:如图

遍历

表示节点的状态

白色:表示顶点还没有被访问 灰色:表示该顶点被访问过,但未被探索过(就是和他连接的点还未被访问) 黑色:表示该顶点被访问过且被完全探索过(该点和该点相连的顶点都被访问过)

遍历算法

开始前先做一点说明

function Graph() {
  this.vertexes = [];
  this.eage = {};
}

BFS 实现思路:

// 参数:指定第一个访问节点  callback
Graph.prototype.BFS = function (initV, handler) {
  if (this.check(initV)) {
    // 1.初始化颜色
    let color = this.initColor();
    // 2.创建队列
    let que = new Queue();
    // 3.将第一个顶点插入队列
    que.enqueue(initV);
    // 4.循环队列取出元素
    while (!que.isEmpty()) {
      // 4.1取出顶点
      let v = que.dequeue();
      // 4.2获取顶点的相邻顶点
      let vList = this.eage[v];
      // 4.3将v颜色设置成灰色
      color[v] = "gray";
      // 4.4把相邻顶点插入队列
      for (let i = 0; i < vList.length; i++) {
        // 遍历相邻节点
        let e = vList[i];
        // 检查该点之前有没有被访问过
        if (color[e] == "white") {
          console.log(e);
          color[e] = "gray";
          que.enqueue(e);
        }
      }
      // 4.5.访问v节点
      handler(v);
      // 4.6访问完毕
      color[v] = "black";
    }
  } else {
    console.error("检查顶点是否存在");
  }
};

DFS 实现思路:

// 参数:指定第一个访问节点  callback
Graph.prototype.DFS = function (initV, handler) {
  if (this.check(initV)) {
    // 1.初始化颜色
    let color = this.initColor();
    this.recurrence(initV, color, handler);
  } else {
    console.error("检查顶点是否存在");
  }
};
// 递归访问顶点
Graph.prototype.recurrence = function (v, color, handler) {
  // 1标记正在访问
  color[v] = "gray";
  // 2处理顶点
  handler(v);
  // 3探索该点相邻顶点
  let vList = this.eage[v];
  for (let i in vList) {
    let e = vList[i];
    if (color[e] == "white") {
      color[e] = "gray";
      // 递归探索该点
      this.recurrence(e, color, handler);
    }
  }
  // 4标记探索完成
  color[v] = "black";
};


上一篇
vuejs基础复习2---组件/组件通信
下一篇
《学习JavaScript数据结构与算法》笔记---红黑树
×