首页 > 其他分享 >数据结构(一)

数据结构(一)

时间:2023-08-01 14:35:43浏览次数:24  
标签:int 合并 rank find fa 数据结构 节点

并查集

  • 原始版

第一步先初始化

int f[N];
inline void init(int n)
{
    for(int i=1;i<=n;i++)
        fa[i]=i;
}

假如有编号1,2,3,...,n,n个元素,我们用一个数组fa[]来储存每个元素的父节点(因为每个元素有且只有一个父节点,所以这是可行的),一开始都将父节点设为自己

第二步查询

int find(int x)
{
    if(fa[x]==x)
        return x;
    else 
        return find(fa[x]);
}

使用递归的写法实现对代表元素的查询:一层一层的访问父节点,直至根节点(根节点的标志就是父节点是本身)。要判断两个元素是否属于同一个集合,只需要看他们的根节点是否相同即可

第三步合并

inline void merge(int i,int j)
{
    fa[find(i)]=find(j);
}

先找到两个集合的代表元素,然后将前者的父节点设为后者即可,当然也可以将后者的父节点设为前者

  • 进阶版,路径压缩
    在每次查询时,把沿途的每个节点的父节点都设为根节点即可。在下次查询时就可以省事
    !!!注意:只有在每次查找时才进行路径压缩,因此初始化和合并的部分代码都相同
//标准版
int find (int x)
{
    if(x==fa[x])
        return x;
    else {
        fa[x]=find (fa[x]);
        return fa[x];
    }
}
//精简版
int find (int x)
{
    return x==f[a]?x:(fa[x]=find(fa[x]));
}
  • 进阶版 按秩合并
    按秩合并的原理就是应该把结构简单的树往结构复杂的树上合并,而不是相反,因为这样合并后到根节点距离变长的节点个数比较少
    开一个rank[]数组记录每个根节点对应的树的深度(如果不是根节点,其 rank相当于它作为根节点的子树的深度)。一开始,把所有元素的rank(秩)设为1。合并时比较两个根节点,把rank较小者往rank较大者合并。
    (注意:路径压缩和按秩合并如果一起使用,时间复杂度接近O(n),但可能会破坏rank的准确性)

初始化(按秩合并)

inline void init(int n)
{
    for(int i=1;i<=n;i++)
    {
        fa[i]=i;
        rank[i]=1;
    }
}

合并

inline void merge(int i,int j)
{
    int x=find(i),y=find(j);
    if(rank[x]<=rank[y])
        fa[x]=y;
    else 
        fa[y]=x;
    if(rank[x]==rank[y]&&x!=y)
        rank[y]++;
}

标签:int,合并,rank,find,fa,数据结构,节点
From: https://www.cnblogs.com/OhLonesomeMe/p/17596363.html

相关文章

  • 【数据结构】vector用法
    1.初始化:vector<类型>标识符vector<类型>标识符(最大容量)vector<类型>标识符(最大容量,初始所有值)inti[5]={1,2,3,4,5}vector<类型>vi(i,i+2);//得到i索引值为3以后的值vector<vector<int>>v;二维向量//这里最外的<>要有空格。否则在比较旧的编译器下无法通过2.常......
  • Java面试题 P28:数据库篇:MySql篇-MySql优化-索引-什么是索引?索引的底层数据结构是什么?
    什么是索引:索引(index)是帮助MySql高效获取数据的数据结构(有序)。在数据之外,数据库还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 ......
  • 数据结构与算法(三):单向链表
    链表定义链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑是通过链表种的指针链接次序实现的。链表由一系列节点组成,每个节点包括两部分:一个是存储数据元素的数据域,一个是存储下一个节点地址的指针域。单向链表从头节点(也可以没有头节点)开始,指针指向下一个节点的......
  • 线性数据结构和 STL
    vector容器(container)定义及头文件引入定义:一个可变长数组头文件:#include<vector>常用变量定义及函数解析end():尾后迭代器。push_back(x):在末端插入元素x(自动扩容)。构造函数一个参数:建立长度为n的数组:vector<int>a(n);两个参数:建立长度为n,每个元素的值均为......
  • 基础树形数据结构
    基础树形数据结构0.前言某个MXY问我为什么要讲树形数据结构。原因就是因为它复杂码量大可以装逼,还可以出一点毒瘤题,最重要的是我第一个学的难的知识就是这个能对于修改和查询的优化。下面是四个典型数据结构时间复杂度的比较↓数组前缀和线段树傻子社长树状数组......
  • Map和Object:JS如何根据需求选择正确的键值对数据结构
    Map和Object都是JavaScript中常用的数据结构,它们都可以用来存储键值对(key-valuepairs)。但是,它们之间也有一些重要的区别,了解这些区别可以帮助我们选择更合适的数据结构来满足我们的需求。公众号:Code程序人生,个人网站:https://creatorblog.cnObject的特点Object是JavaScript中最基本......
  • 【个人模板封装】树套树、高维数据结构
    前言这是我个人使用的一些模板封装,限于个人能力,可能存在诸多不足与漏洞,在未加测试直接使用前请务必小心谨慎。更新可能会滞后于我本地的文档,如有疑问或者催更之类的可以在评论区留言。全文模板测试均基于以下版本信息,请留意版本兼容问题。Windows,64bitG++(ISOC++20)stack......
  • 考研数据结构——每日一题[表达式求值]
    3302.表达式求值给定一个表达式,其中运算符仅包含+,-,*,/(加减乘整除),可能包含括号,请你求出表达式的最终值。注意:数据保证给定的表达式合法。题目保证符号-只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2)之类表达式均不会出现。题目保证表达式中所有数字均为......
  • 数据结构基础
    逻辑结构和物理结构记录一下最近开始学习的数据结构与算法逻辑结构是指数据对象中数据元素之间的相互关系。集合结构集合结构中数据元素,除了都属于一个集合外,无其它关系线性结构数据元素之间是一对一的关系树形结构数据元素之间存在一对多的关系圆形结构数据元素存在多对多的关系物......
  • 37 pinctrl(三)数据结构
    1.pinctrl在devicetree中的定义和使用2.pinctrldriverinit3.常用数据结构pinctrl驱动的注册主要实现函数structpinctrl_dev*pinctrl_register(structpinctrl_desc*pctldesc, structdevice*dev,void*driver_data)从设备树中获取pinctrl_desc,然后将......