Rust——并查集

Vscode远程免密连接Linux虚拟机,并配置C/C++运行环境 目前想要深入学习在Linux,也为了方便编写C/C++程序。Linux的环境里一般自带有c++的编译环境,如果没有安装gcc和g++等编译器也比较便利。但是在虚拟机里用vim编写C++程序又不得劲,因此打算使用vscode远程连接Linux虚拟机进行学习。为了防止自己以后还要再配置,重复踩坑,因此写下这篇博客用做记录。环境:windows11、VMware17、rocky linux9.1 ( 开源的CentOS9 ) 阅读详情

Rust——并查集

实现

#![allow(unused)]
//! 并查集:解决节点连接/关联问题

/// 并查集 trait
trait UF {
    fn is_connected(&mut self, p: usize, q: usize) -> bool;
    fn union_elements(&mut self, p: usize, q: usize);
    fn get_size(&self) -> usize;
}

/// 并查集结构
pub struct UnionFind {
    // 存储父节点
    parent: Vec<usize>,
    // 高度
    rank: Vec<usize>,
}

impl UnionFind {
    /// 构造
    pub fn new_with_size(size: usize) -> Self {
        let mut res = Self {
            parent: vec![0_usize; size],
            rank: vec![1_usize; size],
        };
        // 为每个元素分组
        for i in 0..res.parent.len() {
            res.parent[i] = i;
        }
        return res;
    }

    /// 查询p的根
    fn find(&mut self, p: usize) -> Result<usize, &'static str> {
        if p >= self.parent.len() {
            return Err("参数错误");
        }
        let mut c = p;
        // 寻找根
        while c != self.parent[c] {
            // 压缩高度
            self.parent[c] = self.parent[self.parent[c]];
            c = self.parent[c];
        }
        return Ok(c);
    }
}

impl UF for UnionFind {
    /// 查看两元素是不是同一个根
    fn is_connected(&mut self, p: usize, q: usize) -> bool {
        let p_root = self.find(p).unwrap();
        let q_root = self.find(q).unwrap();
        return p_root == q_root;
    }

    /// 合并两个元素为一个根
    fn union_elements(&mut self, p: usize, q: usize) {
        let p_root = self.find(p).unwrap();
        let q_root = self.find(q).unwrap();
        if p_root != q_root {
            if self.rank[p_root] < self.rank[q_root] {
                self.parent[p_root] = self.parent[q_root];
            } else if self.rank[q_root] < self.rank[p_root] {
                self.parent[q_root] = self.parent[p_root];
            } else {
                self.parent[q_root] = self.parent[p_root];
                self.rank[p_root] += 1;
            }
        }
    }

    fn get_size(&self) -> usize {
        return self.parent.len();
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let mut union_find = UnionFind::new_with_size(10);
        union_find.union_elements(3, 5);
        union_find.union_elements(2, 1);
        union_find.union_elements(5, 1);
        union_find.union_elements(5, 4);
        assert_eq!(union_find.is_connected(4, 1), true);
    }
}
SATA硬件电路设计实战:从接口规范到高速布线技巧 本文深入探讨了SATA硬件电路设计的核心要点与实战技巧。从接口物理电气规范、AC耦合电容与阻抗控制等基础,到FPGA/SoC高速收发器选型配置,再到应对6Gbps高速信号的PCB布局布线艺术,系统性地解析了SATA电路设计中的关键挑战与解决方案,助力工程师规避常见陷阱,实现稳定可靠的存储接口设计。 阅读详情

相关推荐

别再问“这游戏啥引擎做的”了,手把手教你用SteamDB一键查询(附实战案例)

本文详细介绍了如何使用SteamDB一键查询游戏引擎信息,包括Unity 3D、Unreal Engine等热门引擎的识别方法。通过实战案例和高级查询技巧,帮助玩家快速获取游戏技术底细,优化游戏体验和兼容性分析。

weixin_31412781的博客 825

Rust——智能指针

Rust智能指针

JAN6055的博客 2321

STM32L476低功耗实战:LPTIM精准定时唤醒STOP2模式与系统级功耗优化

本文深入探讨了STM32L476低功耗实战技巧,重点解析了LPTIM精准定时唤醒STOP2模式的配置与优化。通过详细的步骤指南和实战经验分享,帮助开发者实现系统级功耗优化,特别适合电池供电设备开发。文章涵盖LPTIM1定时器配置、STOP2模式进入流程及常见问题排查,助力将整机功耗降至8.2uA级别。

weixin_33686714的博客 435

rust 代码片

允许无效代码和无效导入 #![allow(dead_code)] #![allow(unused_imports)] 随机数 [dependencies] rand = &amp;amp;amp;quot;0.4&amp;amp;amp;quot; extern crate rand; use rand::Rng; let mut rng = rand::thread_rng(); let x = rng.gen::&amp;am

周航的专栏 1746

Dofbot机械臂从零部署笔记(1)——ROS之创建URDF模型、配置Moveit和MotionPlanning

Dofbot机械臂从零部署笔记(1)——ROS之创建URDF模型、配置Moveit和MotionPlanning

takedachia的博客 8698

高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解

特征值与特征向量是线性代数中的概念,它们与线性变换有关。在线性变换中,如果存在非零向量 v ,使得当该向量通过变换后,其方向不变,只是长度发生了变化,那么这个向量 v 就是特征向量。而这个长度变化的比例因子,即变换前后向量长度的比值,称为特征值。数学公式表示:通俗易懂的解释:想象一下,你有一个可以伸缩的橡皮筋,这个橡皮筋可以代表一个向量。现在,你有一个特殊的机器,它可以改变橡皮筋的形状,但不会改变它延伸的方向。当你把橡皮筋放入机器中,机器会拉伸或压缩橡皮筋,但橡皮筋的方向保持不变。

m0_64198455的博客 2293

Rust参考手册学习(3)

crate 和 条件编译学习

weixin_38892398的博客 527

[基于STM32底盘控制与ROS上层导航小车制作] 第一节 stm32电机驱动与编码器读取反馈

系列文章目录 第一节stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息 第六节 ROS计算和发布里程计 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 系列文章目录 前言 1.pwm与电机正反转 2.编码器初始化 二、pwm控制与编码器使用 1.pwm使电机 .

LanLanLan1927的博客 1万+

Rust——最大堆

Rust——最大堆实现排序测试 实现 #![allow(unused)] pub struct MaxHeap<E: PartialOrd + Copy> { data: Vec<E> } impl<E: PartialOrd + Copy> MaxHeap<E> { pub fn new_max_heap() -> MaxHeap<E> { Self { data: Vec::ne

柳暗花明 369

WSL2不能上网,Failed to connect to github.com port 443问题解决方案

WSL2不能上网: 问题:ping外网无效 例如:ping www.baidu.com失败 解决方案: 在wsl: $sudo vi /etc/wsl.conf wsl.conf: [network] generateResolvConf = false 在PowerShell: $sudo vi /etc/etc/resolv.conf resolv.conf: # This file was automatically generated by WSL. To stop automatic gen

Jason_Chen__的博客 9527

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

Rust——关于Option详解

Option是组成Rust程序的基石,熟练使用Rust的Option可以帮助我们进行程序的开发。但是Option这里的知识和细节比较绕,说白了就是各种套娃,本篇文章意在梳理Option的一些细节。

JAN6055的博客 8703

2026 年 3 月青少年软编等考 C/C++ 三级测试题解析

摘要 本文包含三部分内容: 单选题(10题):考察C++基础语法和数据结构知识,涉及vector、栈、队列的操作和特性。 判断题(10题):测试对动态数组、栈、队列、字符串操作的理解,包括内存管理、访问方式和函数返回值等。 编程题(1题):模拟火车站售票窗口排队场景,要求根据输入输出各窗口的排队情况,重点考查队列的实际应用和边界条件处理。 答案解析详细,涵盖常见编程考点,适合检验基础知识的掌握程度。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 251

Rust语言的并查集

Rust是一种系统编程语言,强调安全、并发和性能。Rust的内存管理通过所有权(Ownership)和借用(Borrowing)系统来保证,避免了数据竞争和空指针异常等常见错误。同时,Rust提供了模式匹配和类型推断等特性,使得写出清晰且高效的代码变得更加简单。并查集是一个简单而高效的数据结构,能够在许多实际应用中发挥重要作用。我们在Rust中实现的并查集不仅充分使用了Rust的特性,还通过合理的设计使之具备高效的性能。

2501_91439235的博客 1022

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[Rust刷题模板] 并查集

【代码】[Rust刷题模板] 并查集。

liuliangcan的博客 254

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Rust进阶数据结构实战:数组模拟堆、并查集、Trie与线段树

数据结构与算法是编程能力的基石,而在Rust中实现堆、并查集、Trie、树状数组、线段树等进阶结构时,所有权与借用规则往往带来额外挑战。通过数组模拟替代指针引用,可以有效规避借用冲突并提升缓存友好性。本文从Rust核心的数组下标思想切入,讲解二叉堆的懒删除写法、并查集的路径压缩与按秩合并、Trie树的动态扩容实现、树状数组的lowbit运算细节,以及线段树懒标记的常见错误,并给出图论存图中链式前向星与邻接表的取舍思路。这些模板均经过OJ实测,可直接用于竞赛、考研刷题及工程实践中的高效数据处理场景。

weixin_32612263的博客 302

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

用Rust刷PTA天梯赛:从输入输出模板到并查集的实战经验

在算法竞赛中,语言选择往往决定编码效率与调试成本。Rust凭借内存安全与高性能特性,正逐渐成为竞赛编程的新选择。然而,其所有权模型和借用检查机制给习惯了C++的选手带来独特挑战。本文从竞赛编程的输入输出、数据结构实现与评测环境差异等基础问题出发,结合PTA天梯赛真题,解析了Rust在并查集、链表模拟等高频考点上的写法,并总结debug与release模式差异、递归深度限制等实战教训。无论你是想尝试Rust参赛,还是希望优化现有刷题流程,这些经验都能帮助你减少“本地能过、提交报错”的困扰,更高效地拿分。

weixin_33417488的博客 258

Rust实现竞赛数据结构:跳表、并查集与线段树优化

数据结构是算法竞赛的核心基础,其实现方式直接影响程序性能。跳表通过多层链表实现O(log n)的查询效率,特别适合需要频繁插入删除的有序数据场景;并查集运用路径压缩和按秩合并技术,将集合操作优化至近O(1)复杂度;线段树采用延迟传播机制,高效处理区间更新查询。这些数据结构在Rust语言中实现时,需特别注意内存安全与性能平衡,例如使用Rc+RefCell管理共享所有权,预分配内存减少动态扩容开销。在在线判题系统(OJ)等竞赛环境中,合理选择数据结构并配合Rust的零成本抽象特性,能显著提升算法执行效率,应对大

weixin_30846347的博客 276

DeepSeek LeetCode 3108. 带权图里旅途的最小代价 Rust实现

LeetCode 3108 的 Rust 实现核心思路与 Go 版本一致:利用按位与的单调递减性,找到每个连通分量的所有边权的按位与结果作为该分量内任意两点间的最小代价。2. 分量代价:维护每个连通分量的 AND 值,合并时用新边权值和两个子分量的 AND 值进行更新(即 new_and = old_and & edge_weight)。// 合并后,新根 rv 的 AND 值需要包含两个子集的 AND。· 空间复杂度:O(n),用于存储并查集的父节点和 AND 值。· 连通:返回该分量的 AND 值。

m0_37843156的博客 170

千问 LeetCode 3887. 增量偶权环查询 Rust实现

合并时的权重设置:合并 ru 和 rv 时,设置 dis[ru] = dis[u] ^ dis[v] ^ w,保证合并后 u 和 v 之间的异或距离恰好等于 w。- 路径压缩时的异或更新:dis[x] ^= dis[fa[x]] 是因为 x 到根的异或距离 = x 到旧父节点的异或 ⊕ 旧父节点到根的异或。3. 边 (0,2,1):0 和 2 已在同一集合,环异或和 = dis[0]^dis[2]^1 = 1^1^1 = 1(奇数),跳过。// 环的异或和 = dis[u] ^ dis[v] ^ w。

m0_37843156的博客 144

rust OJ实战一:计算、算法

。。。

nameofcsdn的博客 1332

并查集详解

并查集是一种树型的数据结构。它的特点是由子结点找到父亲结点,用于处理一些不相交集合的合并及查询问题。由此可知,并查集主要有以下三个操作: 定义代表(make_set):建立一个新的集合,并用一个代表来标识每个集合。 查询(find_set):确定元素属于哪一个集合。 合并(union):将两个集合合并成同一个集合。 并查集常常使用有根树来表示,树的每个节点包含一个成员,每棵数代表一个集合。相比于用链表表示,可以通过引入两种启发式策略(按秩合并和路径压缩),得到一个渐进最优的不相交集合数据结构。

hulala1a的博客 873

Rust高级数据结构实现与OJ应用指南

数据结构是算法竞赛和编程面试中的核心基础,从基础的栈、队列到高级的并查集、线段树,每种数据结构都有其特定的应用场景和性能特点。在Rust语言中实现这些数据结构时,需要特别注意所有权系统和借用检查机制带来的独特挑战。Rust的内存安全特性虽然增加了实现复杂度,但也避免了传统语言中常见的内存错误。在线评测系统(OJ)中,合理选择数据结构能显著提升解题效率,如哈希表适合快速查找,堆适用于优先级处理,而线段树则擅长区间查询。掌握这些数据结构的Rust实现方式,对于准备编程竞赛和提升算法能力都大有裨益。

weixin_30074763的博客 157

【LeetCode】928、尽量减少恶意软件的传播 II

【代码】【LeetCode】928、尽量减少恶意软件的传播 II。

呆呆的猫的博客 972

Kimi LeetCode 3695. 交换元素后的最大交替和 Rust实现

3. 贪心分配:对每个连通块内的所有元素降序排序,把最大的 `sz - odd` 个元素分配到偶数下标(贡献 `+`),剩下的 `odd` 个最小的分配到奇数下标(贡献 `-`)。返回 `i64` `nums[i]` 最大为 `10^9`,`n` 最大为 `10^5`,总和可能溢出 `i32`,必须用 `i64`降序排序后分段 前 `even` 个元素贡献 `+`,后 `odd` 个元素贡献 `-`,这是使交替和最大的最优策略。// 降序排序:大的放偶数下标(+),小的放奇数下标(-)

m0_37843156的博客 159

【LeetCode】547、省份数量

初始时共n个集合, 若相邻则合并, 最终返回并查集的集合总数。

呆呆的猫的博客 774
上一篇: Rust——leetcode 677. 键值映射
下一篇: 2-3树与红黑树
95码农老张
博客等级 码龄11年 24粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值