首页 > 其他分享 >高阶数据结构-->图(中)

高阶数据结构-->图(中)

时间:2024-08-29 21:53:48浏览次数:5  
标签:q1 ufs -- 高阶 元素 int rootY 数据结构 root

前言:本文介绍了并查集的优化方案和图的2种基本的遍历方式。

并查集的优化:

普通的并查集可以看看我的这篇文章:高阶数据结构-->图(上)-CSDN博客

先来谈谈为什么要优化?

原先的并查集在面对一些极端情况时,查找根的效率会降低不少,举个例子:

示例:

此时当我们要查找5的根的时候,会不断往上更新,直到找到1为止,类比到海量数据时,速度降低的会愈发明显,所以我们可以通过路径压缩的方式来优化。

如何进行路径压缩?其实很简单,我们只需要在查找某个元素的双亲节点时,同时直接将该元素路径上的所有非root的元素的root修改为root即可!是不是有点绕?没关系,直接上代码解释:

int findRoot(int x)
{
	int root = x;
	while (_ufs[root] >= 0)
	{
		root = _ufs[root];
	}
	/*路径压缩*/
	while (_ufs[x] >= 0)
	{
		int parent = _ufs[x];
		_ufs[x] = root;
		x = parent;
	}
	return root;
}

路径压缩时,当查找的元素的值不是root的下标时,直接更新为root,再继续向上更新,直到将该路径上所有的元素的值都更新为root的下标。这样的话结果就会变成:

很明显,此时我们再查找元素5的时候,就只需要查找一次即可,极大的加快了查找root的速度。

另一个小优化:union元素时,用数据量小的一方去合并数据量大的一方,直接上代码:

void Union(int x, int y)
{
	int rootX = findRoot(x);
	int rootY = findRoot(y);
	/*当x和y在同一个集合中的时候,就不用合并直接返回即可*/
	if (rootX == rootY)
	{
		return;
	}
	//小优化-->数据量小的去合并。
	if (abs(_ufs[rootX]) < abs( _ufs[rootY]))
	{
		swap(rootX, rootY);
	}
	_ufs[rootX] += _ufs[rootY];
	_ufs[rootY] = rootX;
}

原理和路径压缩类似,在这里就不过多赘述。

图的遍历

1.广度优先遍历(BFS)

需要的辅助数据结构:queue(队列),一般还需要一个vis数组来记录顶点.

原理图示:

基础代码模板:

/*以int为例*/
queue<int> q1;
/*先插入起点*/
q1.push(root);
while (q1.size())
{
	int sz = q1.size();
	for (int i = 0; i < sz; i++)
	{
		int front = q1.front();
		q1.pop();
		//判断是否在vis记录过
		if (vis[...] == false && /*合法的位置*/)
		{
			//将front连接的元素入队
			q1.push(...);
			/*记录该元素*/
			vis[...] = true;
		}
	}
}
/*当队列为空时,遍历结束*/

2.深度优先搜索(DFS)

原理:将一个元素为起点遍历完它的所有可能路径,再去遍历其他元素。

基础代码模板:

一般采用递归的方式写,没有太具体的模板,只能时多练习,画出决策树。

标签:q1,ufs,--,高阶,元素,int,rootY,数据结构,root
From: https://blog.csdn.net/2302_80207345/article/details/141650570

相关文章

  • 逆向工程、Spring框架IOC、AOP学习
    系列文章目录第一章基础知识、数据类型学习第二章万年历项目第三章代码逻辑训练习题第四章方法、数组学习第五章图书管理系统项目第六章面向对象编程:封装、继承、多态学习第七章封装继承多态习题第八章常用类、包装类、异常处理机制学习第九章集合学习第......
  • MySQL WAL机制详解
    目录:是什么undologRedoLog 与BinlogRedolog三种状态redolog 的持久化Binlog三种格式三种状态binlog 的持久化两者的联系状态Crash-Safe 能力三步提交的参数配置组提交优化" 三步提交"三步提交过程总结三个日志的比较(undo、redo、bin) ......
  • The Power of Scale for Parameter-Efficient Prompt Tuning
    系列论文研读目录文章目录系列论文研读目录论文题目含义Abstract1Introduction2PromptTuning2.1DesignDecisions2.2UnlearningSpanCorruption3Results3.1ClosingtheGap3.2AblationStudy4ComparisontoSimilarApproaches5ResiliencetoDomainShif......
  • appsettins.json 复制到输出文件夹 CopyToOutpuDirectory 配置文件 csproj
    复制配置文件到输出文件夹<ItemGroup><NoneUpdate="appsettings.json"><CopyToOutputDirectory>Always</CopyToOutputDirectory></None><NoneUpdate="nlog.config"CopyToOutputDirectory="Always&qu......
  • P9041 [PA2021] Fiolki 2
    简要题意可以去看其他题解。前置知识:LGV引理。看到这道题我们先考虑该怎么判定\(f(l,r)\)是否等于\(x\)。看完题面后很难不让人想到LGV引理(不相交路径,起点集\(S\)和终点集\(T\))。但是LGV引理是用于计数的,放在这里似乎并不好用。但是我们可以注意到,只要没有合法情况,......
  • HarmonyOS开发实战5.0【地址交换动画案例】
    介绍本示例介绍使用显式动画 animateTo 实现左右地址交换动画。该场景多用于机票、火车票购买等出行类订票软件中。效果预览图使用说明加载完成后显示地址交换动画页面,点击中间的图标,左右两边地址交换。实现思路创建左右两边Text组件显示地址。设置初始偏移量以及文......
  • (160)时序收敛--->(10)时序收敛十
    1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛十(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足......
  • 华为/荣耀指纹键盘CD32/AD32驱动安装教程
    华为CD32键盘以其金属质感和静音敲击体验而受到薄膜玩家青睐。它的打字手感舒适,质感上乘,并且配备了NFC和指纹识别功能,堪称百元价位中的性价比之王,五分之一的价格可以达到MxKeys九成体验,极具购买价值。值得一提的是,华为的兄弟品牌荣耀推出的AD32键盘,除了背后的LOGO不同外,与CD32......
  • (159)时序收敛--->(09)时序收敛九
    1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛九(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足......
  • (158)时序收敛--->(08)时序收敛八
    1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛八(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足......