带你读《图解算法小抄》十、不相交集(1)

简介: 带你读《图解算法小抄》十、不相交集(1)

十、不相交集

访问 www.coding-time.cn 阅读原文动画效果,体验更佳。

 

不相交集数据结构(也称为并查集或者合并-查找集)是一种跟踪一组元素划分为许多不相交(非重叠)子集的数据结构。它提供近乎常数时间的操作(受到阿克曼函数的限制)来添加新集合,合并现有集合,以及确定元素是否在同一集合中。除了许多其他用途(见应用部分),不相交集在 Kruskal's 算法中起着关键作用,该算法用于查找图的最小生成树。

 

image.png

 

MakeSet 创建了 8 个单元素集合。

 

image.png

 

在进行了一些 Union 操作之后,一些集合被组合在一起。

1. 完整代码

DisjointSetItem

export default class DisjointSetItem {
  /**
   * @param {*} value
   * @param {function(value: *)} [keyCallback]
   */
  constructor(value, keyCallback) {
    // 存储元素值
    this.value = value;
    // 键回调函数用于生成键
    this.keyCallback = keyCallback;
    // 父元素,默认为 null
    this.parent = null;
    // 子元素,初始为空对象
    this.children = {};
  }
  /**
   * @return {*}
   */
  getKey() {
    // 允许用户定义自定义键生成器。
    if (this.keyCallback) {
      return this.keyCallback(this.value);
    }
    // 否则,默认使用 value 作为键。
    return this.value;
  }
  /**
   * @return {DisjointSetItem}
   */
  getRoot() {
    // 如果当前元素是根元素,返回自身,否则返回父元素的根。
    return this.isRoot() ? this : this.parent.getRoot();
  }
  /**
   * @return {boolean}
   */
  isRoot() {
    // 如果 parent 为 null,则当前元素为根元素
    return this.parent === null;
  }
  /**
   * Rank基本上意味着所有祖先的数量。
   *
   * @return {number}
   */
  getRank() {
    // 如果没有子元素,rank 为 0
    if (this.getChildren().length === 0) {
      return 0;
    }
    let rank = 0;
    /** @var {DisjointSetItem} child */
    this.getChildren().forEach((child) => {
      // 计算子节点本身。
      rank += 1;
      // 也添加当前子节点的所有子节点。
      rank += child.getRank();
    });
    return rank;
  }
  /**
   * @return {DisjointSetItem[]}
   */
  getChildren() {
    // 返回所有子元素
    return Object.values(this.children);
  }
  /**
   * @param {DisjointSetItem} parentItem
   * @param {boolean} forceSettingParentChild
   * @return {DisjointSetItem}
   */
  setParent(parentItem, forceSettingParentChild = true) {
    // 设置父元素
    this.parent = parentItem;
    // 如果 forceSettingParentChild 为 true,则把当前元素添加到父元素的子元素中
    if (forceSettingParentChild) {
      parentItem.addChild(this);
    }
    return this;
  }
  /**
   * @param {DisjointSetItem} childItem
   * @return {DisjointSetItem}
   */
  addChild(childItem) {
    // 将元素添加到子元素
    this.children[childItem.getKey()] = childItem;
    // 将当前元素设置为添加的元素的父元素
    childItem.setParent(this, false);
    return this;
  }}

带你读《图解算法小抄》十、不相交集(2)https://developer.aliyun.com/article/1348196?groupCode=tech_library

相关文章
|
7月前
|
存储 算法
算法编程(二十六):判断路径是否相交
算法编程(二十六):判断路径是否相交
62 0
|
7月前
|
存储 算法
算法编程(十):相交链表
算法编程(十):相交链表
52 0
|
2月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
18 1
|
4月前
|
算法 C++ Windows
空间射线与三角形相交算法的两种实现
空间射线与三角形相交算法的两种实现
42 0
|
6月前
|
存储 JavaScript 前端开发
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
30 1
|
6月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
6月前
|
算法 Java
Java数据结构与算法:用于处理不相交集合的合并和查找问题
Java数据结构与算法:用于处理不相交集合的合并和查找问题
|
6月前
|
算法 C语言
【数据结构与算法 经典例题】相交链表求交点
【数据结构与算法 经典例题】相交链表求交点
|
7月前
|
算法
【面试算法——动态规划 20】最长公共子序列&& 不相交的线
【面试算法——动态规划 20】最长公共子序列&& 不相交的线
|
人工智能 算法 架构师
再现神作!字节算法小抄官方整版,已助1000+应届生拿到25w+年薪
2023年经济下行趋势明显,程序员出路在哪儿? 今年,毕业人数将达到1158万,导致很多公司招聘非常谨慎、要求也变得非常更高。
再现神作!字节算法小抄官方整版,已助1000+应届生拿到25w+年薪