带你读《图解算法小抄》七、图(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


相关文章
|
3月前
|
算法 搜索推荐 图计算
图计算中的社区发现算法是什么?请解释其作用和常用算法。
图计算中的社区发现算法是什么?请解释其作用和常用算法。
29 0
|
4月前
|
存储 算法 测试技术
☆打卡算法☆LeetCode 133. 克隆图 算法解析
☆打卡算法☆LeetCode 133. 克隆图 算法解析
|
4天前
|
算法 数据可视化 大数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
33 13
|
3月前
|
算法 搜索推荐 数据挖掘
图计算中的图算法有哪些常见的类型?请举例说明每种类型的算法。
图计算中的图算法有哪些常见的类型?请举例说明每种类型的算法。
36 0
|
3月前
|
算法 搜索推荐 Java
图计算中的PageRank算法是什么?请解释其作用和计算原理。
图计算中的PageRank算法是什么?请解释其作用和计算原理。
21 0
|
3月前
|
算法 搜索推荐 Java
图计算中的图剪枝算法是什么?请解释其作用和常用方法。
图计算中的图剪枝算法是什么?请解释其作用和常用方法。
14 0
|
5月前
|
人工智能 算法 架构师
再现神作!字节算法小抄官方整版,已助1000+应届生拿到25w+年薪
2023年经济下行趋势明显,程序员出路在哪儿? 今年,毕业人数将达到1158万,导致很多公司招聘非常谨慎、要求也变得非常更高。
再现神作!字节算法小抄官方整版,已助1000+应届生拿到25w+年薪
|
5月前
|
算法 数据挖掘 知识图谱
LINE算法复现 图表示学习 基于line 算法的节点分类 聚类显示 完整代码+数据
LINE算法复现 图表示学习 基于line 算法的节点分类 聚类显示 完整代码+数据
20 0
|
5月前
|
SQL 算法 架构师
字节算法中了80%!靠着这份GitHub上的算法小抄,成功斩获Offer
前言 最近,GitHub上的算法小抄又火了!已经有不少人靠它手撕算法题,拿下了字节、腾讯等大厂offer
|
6月前
|
存储 算法 图计算
TuGraph Analytics图计算快速上手之弱联通分量算法
TuGraph Analytics是蚂蚁集团近期开源的分布式流式图计算,目前广泛应用在蚂蚁集团的金融、社交、风控等诸多领域。