带你读《图解算法小抄》七、图(5)

简介: 带你读《图解算法小抄》七、图(5)

带你读《图解算法小抄》七、图(4)https://developer.aliyun.com/article/1348214?groupCode=tech_library

GraphVertex

export default class GraphVertex {
  /**
   * @param {*} value
   */
  // 构造函数,参数为顶点的值
  constructor(value) {
    if (value === undefined) {
      throw new Error('图顶点必须有一个值');
    }
    /**
     * @param {GraphEdge} edgeA
     * @param {GraphEdge} edgeB
     */
    // 边的比较函数
    const edgeComparator = (edgeA, edgeB) => {
      if (edgeA.getKey() === edgeB.getKey()) {
        return 0;
      }
      return edgeA.getKey() < edgeB.getKey() ? -1 : 1;
    };
    // 通常你会储存一个字符串作为顶点的名称,但实际上可以储存任何类型的对象
    this.value = value;
    this.edges = new LinkedList(edgeComparator);
  }
  /**
   * @param {GraphEdge} edge
   * @returns {GraphVertex}
   */
  // 添加边
  addEdge(edge) {
    this.edges.append(edge);
    return this;
  }
  /**
   * @param {GraphEdge} edge
   */
  // 删除边
  deleteEdge(edge) {
    this.edges.delete(edge);
  }
  /**
   * @returns {GraphVertex[]}
   */
  // 获取邻居顶点
  getNeighbors() {
    const edges = this.edges.toArray();
    /** @param {LinkedListNode} node */
    // 邻居转换器
    const neighborsConverter = (node) => {
      return node.value.startVertex === this ? node.value.endVertex : node.value.startVertex;
    };
    // 返回起始或者结束顶点
    // 对于无向图,当前顶点可能是结束顶点
    return edges.map(neighborsConverter);
  }
  /**
   * @return {GraphEdge[]}
   */
  // 获取边
  getEdges() {
    return this.edges.toArray().map((linkedListNode) => linkedListNode.value);
  }
  /**
   * @return {number}
   */
  // 获取顶点的度(相连的边的数量)
  getDegree() {
    return this.edges.toArray().length;
    }
  /**
   * @param {GraphEdge} requiredEdge
   * @returns {boolean}
   */
  // 检查顶点是否有指定的边
  hasEdge(requiredEdge) {
    const edgeNode = this.edges.find({
      callback: (edge) => edge === requiredEdge,
    });
    return !!edgeNode;
  }
  /**
   * @param {GraphVertex} vertex
   * @returns {boolean}
   */
  // 检查顶点是否有指定的邻居
  hasNeighbor(vertex) {
    const vertexNode = this.edges.find({
      callback: (edge) => edge.startVertex === vertex || edge.endVertex === vertex,
    });
    return !!vertexNode;
  }
  /**
   * @param {GraphVertex} vertex
   * @returns {(GraphEdge|null)}
   */
  // 查找与指定顶点相连的边
  findEdge(vertex) {
    const edgeFinder = (edge) => {
      return edge.startVertex === vertex || edge.endVertex === vertex;
    };
    const edge = this.edges.find({ callback: edgeFinder });
    return edge ? edge.value : null;
  }
  /**
   * @returns {string}
   */
  // 获取顶点的键(即顶点的值)
  getKey() {
    return this.value;
  }
  /**
   * @return {GraphVertex}
   */
  // 删除所有的边
  deleteAllEdges() {
    this.getEdges().forEach((edge) => this.deleteEdge(edge));
    return this;
  }
  /**
   * @param {function} [callback]
   * @returns {string}
   */
  // 将顶点转换为字符串
  toString(callback) {
    return callback ? callback(this.value) : `${this.value}`;
  }}

2. 参考

Wikipedia

Introduction to Graphs on YouTube

Graphs representation on YouTube


相关文章
|
7月前
|
存储 人工智能 算法
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
425 0
|
6月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
48 4
|
5月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
45 1
|
5月前
|
数据采集 存储 算法
「AIGC算法」图搜索算法详解
本文探讨了图搜索算法,包括遍历和最短路径搜索。DFS和BFS是遍历算法,前者使用栈深入搜索,后者用队列逐层遍历。Dijkstra、Bellman-Ford、A*、Floyd-Warshall和Johnson算法则解决最短路径问题。文中还给出了DFS的Python实现示例。这些算法在路径规划、网络分析等领域有重要应用。
103 0
|
7月前
|
存储 算法 C++
c++算法学习笔记 (8) 树与图部分
c++算法学习笔记 (8) 树与图部分
|
7月前
|
算法 数据可视化 大数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
|
6月前
|
算法 计算机视觉
图像处理之基于图的广度优先搜索组件标记算法
图像处理之基于图的广度优先搜索组件标记算法
33 0
|
6月前
|
存储 算法
数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)
数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)
62 0
|
7月前
|
算法 数据可视化
圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化
圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化
|
7月前
|
存储 算法
图的深度优先算法
图的深度优先算法
42 0