不相交集类是解决等价关系问题的一种非常有效的手段!等价关系是一种关系R,他满足自反性,对称性与传递性。有人说散列是最艺术的数据结构,优先队列是最优雅的数据结构

而不相交集类就是最简洁的数据结构!这些说法我非常赞同,因为不相交集类的实现代码真的太简洁了。

处理等价关系最重要的问题就是要判断任意两个元素a,b是等价的,根据离散数学的知识,一个等价关系就决定了一个划分,所以我们要判断a,b是否属于同一个划分,而每个划分都会有一个代表元,所以我们只需要判断a,b,是否属于同一个代表元就行了!

而不相交集类就实现了这个功能,首先他提供了union操作,如union(a,b)表示a,b是等价的,一般可以让b记住a,不过更有效的办法是按高度求并,即如果a高的话就让b记住a,否则就让a记住b。这里的“记住”其实就是一个指向,这种几何结构与树的结构刚好反过来了。他是由子节点指向父节点。

还有就是find操作,其实就是找代表元,最容易想到的就是找到根节点就行了,不过我们不止这样,我们在找根节点的时候还对路径高度进行了压缩!从我的代码你就会发现仅仅一句代码就实现了这种听起来很麻烦的事,所以说这是一种特别简洁的数据结构!

下面就是我的代码:

//Disjsets.h

#ifndef DISJSETS_H
#define DISJSETS_H
#include<iostream>
#include<vector>
using namespace std;
class Disjsets
{
private:vector<int>s;
public:Disjsets(int num):s(num){for(int i=0;i<s.size();i++)s[i]=-1;}int find(int x)     //路径压缩查找{if(s[x]<0)return x;elsereturn s[x]=find(s[x]);}void(unionSets)(int root1,int root2)  //按高度求并{if(s[root1]<s[root2])s[root1]=root2;else{if(s[root1]==s[root2])s[root1]--;s[root2]=root1;}}
};
#endif // DISJSETS_H

真的是非常简洁的代码,而且这样实现的效率也非常高,进行一系列union与find操作的时间几乎是常数时间运行,这比起没有按大小求并和没有进行路径压缩的方法的O(n)效率来说是个了不起的飞跃!然而实现这种飞跃的代码竟然就这么简单。
   还有值得一提的是这种结构的实际应用也非常广泛,比如设计迷宫就能用上,不过我认为最能体现其价值的是在图论,在判断一个图是否连通时这种结构就能大展身手,不过这里就不展开讲了!

数据结构之不相交集类相关推荐

  1. 不相交集类以及应用迷宫生成

    简单介绍: 考虑一个迷宫的生成,一个简单算法就是从各处的墙壁开始(除入口和出口之外).此时,不断地随机选择一面墙,如果被该墙分割的单元彼此不联通,那么就把这面墙拆掉.重复这个过程直到开始单元和终止单元 ...

  2. 不相交集java_不相交集类

    简介: 不相交集类是将一些元素合并为不相交的各个集合.在同一个集合中的元素两两等价,不同集合中的元素不等价. 1.等价关系 等价关系必须满足下面三个性质: (1):自反性,对于集合S中的任意元素a,a ...

  3. 不相交集类及其应用生成迷宫

    // 任意合并两个不相交集合void unionSets( int root1, int root2 ){s[ root2 ] = root1;} // 寻找 x 所在集合int find( int ...

  4. c++矩阵类_数据结构-JavaScript矩阵类的设计与实现

    矩阵是线性代数课学习的重点内容之一,也是线性代数常见工具之一,在应用数学.统计分析.计算机科学.计算机图像处理级物理等多学科中均有应用.矩阵主要是指数据的行列排列的形式,由行row与列col所组成,在 ...

  5. Java数据结构及工具类的详解

    `1 数据结构 常见的数据结构 : 栈堆 , 队列, 数组, 链表和红黑树 栈 栈 : 它是运算受限的线性表, 其限制是仅允许在标的一端进行插入和删除操作, 不允许在其他任何位置进行添加, 查找, 删 ...

  6. Java数据结构及工具类

    `1 数据结构 常见的数据结构 : 栈堆 , 队列, 数组, 链表和红黑树 栈 栈 : 它是运算受限的线性表, 其限制是仅允许在标的一端进行插入和删除操作, 不允许在其他任何位置进行添加, 查找, 删 ...

  7. 数据结构-排序-分配类排序-知识点总结归纳3

    分配类排序:核心是分配和收集,利用关键字的优先级进行排序的思想 高位优先排序:比如桥牌,先比较花色在比较面值;比如学号,比较级,院,班,号; 低位优先排序: 链式基数排序 思想:基于"分配& ...

  8. 数据结构5-消除类游戏

    题目5:消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋 ...

  9. JAVA数据结构 之 BitSet 类的使用方法

    Java中BitSet的基本用法 JAVA中BitSet就是"位图"数据结构,根据"位图"的语义,数据的存在性可以使用bit位上的1或0来表示:一个bit具有2 ...

最新文章

  1. cygwin执行.py提示找不到模块,但已经安装模块的解决办法
  2. 使用Script元素发送JSONP请求
  3. 无头结点单链表的逆置_单链表的逆置(不带头结点)
  4. arguments.callee查询调用b函数的是哪个函数
  5. SAP ERP差异来源和差异处理
  6. linux——利用脚本实现虚拟机半自动安装及快照
  7. mysql 压力测试知乎_MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0
  8. 数据库视频(一)——整体认识
  9. 一个工作了两三年程序员的学习计划
  10. 活在贫困线之下的开源软件项目——开源的可持续性斗争
  11. kotlin官方文档中文翻译(二) 基础内容
  12. huggingface datasets load_metric connecterror cannot reach
  13. 2019年的第一篇随笔
  14. 路由器实现Vlan间通信
  15. 人生:越是低谷,越要努力
  16. Hadoop的原理是什么
  17. 为什么R.Stallman这次来华讲学可能跑题?
  18. POS/CPOS基础知识
  19. 面孔“暴露”在外 人脸识别风险谁来“买单”?
  20. RO反渗透膜规格尺寸该如何选择?

热门文章

  1. 2009 year English Inprovement for IT developments
  2. 2022年最新河北水利水电施工安全员模拟试题及答案
  3. heritrix3.x--SURT / 限定heritrix的爬行域
  4. Centos7.x实现Cobbler无人值守安装
  5. GBase 8c产品高级特性介绍
  6. 实现对手机联系人列表进行读写操作,并用RecyclerView收缩展开方式展现
  7. 用python计算邮费考虑是否加急,用python计算residuals
  8. matlab绘制三维立体图
  9. 如果世界上的男人们都在数据库中……
  10. 【全开源+免费更新】doodoo.js创建项目教程