返回

TypeScript绘就图的精彩画卷,纵览广度优先搜索与深度优先搜索

前端

遍历图的世界,广度优先搜索与深度优先搜索携手共进

在图论的浩瀚宇宙中,遍历是了解图结构及其性质的至关重要的概念。遍历图意味着访问图中的每一个顶点,就像探索一个错综复杂的迷宫,寻找隐藏的宝藏。而广度优先搜索与深度优先搜索,则犹如两位经验丰富的探险家,带领我们穿越图的每一处角落,揭示其内在的奥秘。

广度优先搜索:层层推进,稳扎稳打

广度优先搜索,正如其名,是一种从图的根节点出发,逐层探索相邻顶点的遍历方法。它就像一位细致的园丁,从花园的一角开始,逐一修剪每一株花草,不放过任何一个角落。

  1. 从图的根节点开始,访问该节点。
  2. 将根节点的所有相邻节点加入队列。
  3. 从队列中取出一个节点,访问该节点。
  4. 将该节点的所有相邻节点加入队列。
  5. 重复步骤3和步骤4,直到队列为空。

深度优先搜索:纵深探索,一往无前

深度优先搜索,则与广度优先搜索截然不同。它从图的根节点出发,沿着一条路径一直向下探索,直到遇到死胡同,再回溯到上一个未探索过的节点,继续探索。它就像一位勇敢的登山者,不畏艰险,勇攀高峰,直到征服每一座山峰。

  1. 从图的根节点开始,访问该节点。
  2. 将根节点的所有相邻节点加入栈。
  3. 从栈中弹出一个节点,访问该节点。
  4. 将该节点的所有相邻节点加入栈。
  5. 重复步骤3和步骤4,直到栈为空。

TypeScript绘就图的画卷,演绎遍历的精彩

为了让图遍历的概念更加鲜活,我们借助TypeScript,将广度优先搜索与深度优先搜索的算法变为现实,让您亲身体验算法之美。

class Graph {
  constructor(vertices: number) {
    this.vertices = vertices;
    this.edges = new Array(vertices).fill(0).map(() => new Array(vertices).fill(false));
  }

  addEdge(u: number, v: number) {
    this.edges[u][v] = true;
    this.edges[v][u] = true;
  }

  breadthFirstSearch(start: number) {
    const visited = new Array(this.vertices).fill(false);
    const queue = [];
    visited[start] = true;
    queue.push(start);
    while (queue.length) {
      const current = queue.shift();
      console.log(current);
      for (let i = 0; i < this.vertices; i++) {
        if (this.edges[current][i] && !visited[i]) {
          visited[i] = true;
          queue.push(i);
        }
      }
    }
  }

  depthFirstSearch(start: number) {
    const visited = new Array(this.vertices).fill(false);
    const stack = [];
    visited[start] = true;
    stack.push(start);
    while (stack.length) {
      const current = stack.pop();
      console.log(current);
      for (let i = 0; i < this.vertices; i++) {
        if (this.edges[current][i] && !visited[i]) {
          visited[i] = true;
          stack.push(i);
        }
      }
    }
  }
}

const graph = new Graph(6);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
graph.addEdge(2, 5);
graph.addEdge(3, 4);
graph.addEdge(4, 5);

console.log("广度优先搜索:");
graph.breadthFirstSearch(0);
console.log("深度优先搜索:");
graph.depthFirstSearch(0);

结语:纵览图遍历的奇妙世界

通过本文的探索,我们领略了图遍历的奇妙世界,并通过TypeScript的实现,亲身体验了广度优先搜索与深度优先搜索的魅力。算法与数据结构,就像两块瑰丽的拼图,共同构建出计算机科学的壮丽画卷。它们不仅为计算机带来了智慧,也为我们带来了改变世界的可能。