首页 > 编程语言 >【数据结构与算法】TypeScript 实现图结构

【数据结构与算法】TypeScript 实现图结构

时间:2023-08-29 11:55:43浏览次数:42  
标签:TypeScript const graph visited 算法 verteces 顶点 数据结构 addEdge

class Grapg<T> {
  // 用于存储所有的顶点
  verteces: T[] = [];
  // 用于存储所有的边 采用邻接表的形式
  adjList: Map<T, T[]> = new Map();

  // 添加顶点
  addVertex(v: T) {
    this.verteces.push(v);
    // 初始化顶点的邻接表
    this.adjList.set(v, []);
  }

  // 添加边
  addEdge(v: T, w: T) {
    // 有向图 只需要添加单向的边
    this.adjList.get(v)?.push(w);
    // 无向图 需要添加反向的边
    this.adjList.get(w)?.push(v);
  }

  // 打印图
  printEdges() {
    // 遍历所有的顶点
    this.verteces.forEach((vertex) => {
      // 打印顶点和它的邻接表
      console.log(`${vertex} -> ${this.adjList.get(vertex)?.join(' ')}`);
    });
  }

  // 广度优先遍历
  BFS() {
    if (this.verteces.length === 0) return;
    const visited = new Set<T>(); // 用于存储已经访问过的顶点
    visited.add(this.verteces[0]); // 从第一个顶点开始遍历
    const queue = [this.verteces[0]]; // 用于存储待访问的顶点

    // 队列不为空时
    while (queue.length) {
      const v = queue.shift()!; // 取出队列的第一个顶点
      console.log(v); // 打印顶点

      const vEdges = this.adjList.get(v); // 获取该顶点的邻接表
      // 如果没有邻接表 则跳过
      if (!vEdges) continue;
      // 从前往后遍历
      for (const e of vEdges) {
        // 如果没有访问过 就入队列
        if (!visited.has(e)) {
          visited.add(e);
          queue.push(e);
        }
      }
    }
  }

  // 深度优先遍历
  DFS() {
    if (this.verteces.length === 0) return;
    const visited = new Set<T>(); // 用于存储已经访问过的顶点
    visited.add(this.verteces[0]); // 从第一个顶点开始遍历
    const stack = [this.verteces[0]]; // 用于存储待访问的顶点

    // 栈不为空时
    while (stack.length) {
      const v = stack.pop()!; // 取出栈顶的顶点
      console.log(v); // 打印顶点

      const vEdges = this.adjList.get(v); // 获取该顶点的邻接表
      if (!vEdges) return; // 如果没有邻接表 则跳过
      // 从后往前遍历
      for (let i = vEdges.length - 1; i >= 0; i--) {
        const e = vEdges[i]; // 获取顶点
        // 如果没有访问过 就入栈
        if (!visited.has(e)) {
          stack.push(e);
          visited.add(e);
        }
      }
    }
  }
}

const graph = new Grapg<string>();
// 添加A-I的顶点
for (let i = 0; i < 9; i++) {
  graph.addVertex(String.fromCharCode(65 + i));
}
// 添加边
graph.addEdge('A', 'B');
graph.addEdge('A', 'C');
graph.addEdge('A', 'D');
graph.addEdge('C', 'D');
graph.addEdge('C', 'G');
graph.addEdge('D', 'G');
graph.addEdge('D', 'H');
graph.addEdge('B', 'E');
graph.addEdge('B', 'F');
graph.addEdge('E', 'I');
graph.printEdges();
console.log('BFS');
graph.BFS();
console.log('DFS');
graph.DFS();

在这里插入图片描述

标签:TypeScript,const,graph,visited,算法,verteces,顶点,数据结构,addEdge
From: https://www.cnblogs.com/wx980416/p/17664384.html

相关文章

  • C++算法
    运行前进行卡夫曼滤波(减小机器检测波动的影响)延迟上机算法速率法原理1、判断最新数据点和前面几个点的差值是否大于设定值2、判断两点间的斜率k是否大于设定值3、判断拟合曲线的符合度是否在规定范围内技术实现///\brief直线拟合-一元回归,拟......
  • 探索图结构:从基础到算法应用
    文章目录理解图的基本概念学习图的遍历算法学习最短路径算法案例分析:使用Dijkstra算法找出最短路径结论......
  • 栈和队列在数据结构中的应用
    文章目录理解栈和队列的概念及其特点栈的应用和操作队列的应用和操作结论......
  • 机器学习算法的选择和优化技巧
    文章目录机器学习算法的选择1.问题类型:2.数据规模:3.特征空间:4.数据质量:机器学习算法的优化技巧1.特征工程:2.超参数调优:3.集成方法:4.模型调优:代码示例:超参数调优拓展:深度学习中的优化技巧结论......
  • 数据结构与算法:计算机科学的基石
    文章目录数据结构:构建数据的框架算法:问题的解决方案编程语言:实现数据结构的工具结论......
  • 大话数据结构笔记
    1.ADT:AbstractDataType抽象数据类型。2.算法的五个基本特性:输入,输出,有穷性,确定性和可行性。3.大O阶:a.用常数1取代运行时间中的所有加法常数。 b.在修改后的运行次数函数中,只保留最高阶项。c.如果最高阶存在且不是1,则去除与这个项......
  • 雪花算法
    在项目中,需要给请求一个唯一标识,用来标识一个请求和响应的关联关系,要求请求的id必须唯一,且不能占用过大的空间,可用的方案如下:1、自增id,单机的自增id不能解决不重复的问题,微服务情况下我们需要一个稳定的发号服务才能保证,但是这样做性能偏低。2、uuid,将uuid作为唯一标识占用空间太大......
  • 数据结构笔记
    2-3树&红黑树  哈希表哈希函数的设计例如26个字符new一个int[26]。可以用来做哈希整型值小范围正整数,直接使用正整数。大整数通常做法取模 比如取后四位mod1000模一个素数分布效果更好如果对日期这种取模,只能在01-31,会造成分布不均匀。要具体分析。浮点型3......
  • [React Typescript] Strongly type Render prop
    1.React.ReactNodeimport{useState}from"react";import{createPortal}from"react-dom";import{Equal,Expect}from"../helpers/type-utils";interfaceModalChildProps{isOpen:boolean;openModal:()=>void;......
  • 数据结构与算法之美读书笔记
    读书笔记链接 时间复杂度分析只关注执行次数最多的一段代码加法法则:总复杂度等于量级最大的那段代码的复杂度乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积 最好、最坏、平均时间复杂度 数组内存中一块连续的存储空间,有效使用CPU的缓存机制,可以很方便......