当前位置: 首页 > news >正文

并查集算法篇上期:并查集原理及实现

在这里插入图片描述

引入

那么我们在介绍我们并查集的原理之前,我们先来看一下并查集所应用的一个场景:那么现在我们有一个长度为n的数组,他们分别属于不同的集合,那么现在我们要查询数组当中某个元素和其他元素是否处于同一集合当中,或者我们想把它们合并到同一个集合当中,以及查询该集合的数量,那么这些都可以交给我们的并查集来进行实现。

那么我们数组中处于相同的集合的元素的位置是离散的,那么很多人看到并查集所应用的场景,那么常规思路实现我们的并查集一般会想到就是采取我们的哈希表这个数据结构,对于每一个集合我们建立一张哈希表,如果我们查询这两个元素是否在同一个集合当中,那么我们就是确定他们是否在同一张表当中,那么就会遍历我们这张哈希表,如果要合并两个不同的集合,那么我们就该另一张哈希表中的元素全部添加进该哈希表当中,我们哈希表实现我们的并查集是肯定没有问题的,但是我们有更为简单并且高效的实现方式,那么就是通过我们的数组来实现


并查集原理

那么我们首先我们知道我们判断两个元素所处的集合是否是一个集合,那么我们的集合肯定得有一个标识符来进行区分,那么这里我们区分不同的集合的话,我们就是选取该集合当中的一个代表元素的索引或者编号来作为该集合的一个标识符。

那么我们会首先准备一个father数组和一个size数组(其中size数组可有可不有),那么我们的father数组的每一个位置就对应我们原始数组当中的每一个位置,那么其中father数组的作用就是确定数组每一个位置在集合当中的直接后继的节点编号是谁,那么想你可能看不懂我刚才的那句话,但是没关系,我在下文会进行讲解。
那么我们首先初始化我们的并查集的时候,我们将我们该数组中的每个元素自己作为一个集合,那么该集合的代表元素就是他们本身

那么我们如何理解我们这个集合呢,那么我们对于每一个集合来说,那么处于该集合当中的元素就是以一个树的形式来进行组织的,那么我们该树的根节点就是该集合的代表元素,这个树不是说我们的并查集的集合的实现就是按照真的数据结构当中的树那样用指针进行构造,而是说我们的处于同一集合当中的元素可以形象理解为他们是以一个树的形式来组织,就像我们理解DFS的递归过程就形象的理解为类似于一棵多叉树的遍历。

那么最开始我们初始化并查集的时候,假设我们现在有一个长度为n的数组,那么我们先让该数组当中的每一个元素自己作为一个集合,那么我们就可以理解为每个集合当中所对应对应的树的节点就只有一个就是当前数组每个元素它本身,那么它的下一个直接后继节点就是它自己。

那么我们该数组中任意两个位置所处的集合要进行合并的话,那么我们就首先判断他们是否处于同一个集合,如果处于同一个集合,就没有必要进行合并,如果不处于同一个集合的话,那么我们就可以合并,那么刚开始我们每一个集合都只有当前数组每一个位置本身的一个元素,那么我们合并的话,我们就将我们这个其中一个集合所对应的树的根结点原本就是自己本身,并且它的指向后继节点的指针是指向自己,那么我们就该根结点的指针给指向另一个元素所处集合所对应树的根结点,那么我们实现这个过程的话,我们知道我们father数组记录的是数组当中每一个位置它的父节点的索引编号,那么最开始由于我们每一个元素自己作为一个集合,那么father数组当中的每一个位置的记录的父节点的编号就是他们本身
例:father[0]=0,father[1]=1,father[2]=2…

那么如果此时我们假设数组下标为0的元素与数组下标为1的元素合并了,那么我们就在father数组当中下标为0的位置处原本记录的编号就是0,那么我们将其修改为1,那么此时这步操作我们就可以理解为我们一个集合对应的树的根节点的指针原本的指向是自己,而现在我们在该集合所对应的树插入到另一个集合所对应的树当中作为一个子树了,而我们该集合的根节点原本的指向是自己,现在我们将其修改指向为另一个要合并集合对应的树的根节点,所以此时该树的根节点不再是原先集合的根节点了,而是另一个我们插入的集合原本的根节点,所以现在两个集合的根节点相同,那么两个集合就是同一个集合了,从而实现合并。

那么接下来我们每次合并两个数组中任意两个数所处的集合,我们都要先查找两个数所处的集合的代表元素的编号,看他们是否相同,而现在假设这个数组中的每个集合已经经过多次的合并,那么意味着该元素所处的树上的节点可能不只有之前初始化时它自己一个了,那么我们就得往上找到该元素所处的树的根结点,那么我们知道father数组记录的是数组中每一个位置的元素在树当中的直接后继,也就是它的父节点,那么接下来我们就需要遍历我们的father数组,假设我们现在要找下标为0的元素所处集合的根结点也就是代表元素,那么我们就遍历father数组,那么我们先找到father数组下标为0的元素值,也就是下标为0的节点在树中的直接后继节点也就是父节点的编号,假设为1,那么接下来我们就到father数组下标为1位置处查看它所记录的编号为1的直接后继节点的编号是谁,然后再对应跳转到该father数组的编号位置处,而我们的根结点的直接后继我们在初始化设置的时候就是它自己,所以如果我们发现father数组下标为3的记录的直接后继编号就是3,那么3就是当前的下标为0的元素所处集合的代表元素。
在这里插入图片描述


那么我们知道了我们查询以及合并的一个原理之后,那么我们就可以写我们并查集最为关键的两个函数:find函数和union函数,那么在给处这两个板子之前,我们还能对并查集的进行两个优化

小挂大

那么我们除了我们的father数组,那么我们还可以有我们的size数组,那么size数组的每个位置和father数组一样对应原数数组当中的每一个位置,我们size数组的作用则是记录我们每一个集合的元素个数,那么我们要查找数组下标i位置所处的集合的元素个数,那么我们就需要调用find函数找到我们下标为i位置的代表元素的下标q,那么我们查询size[q],就可以查到i所处集合中的元素了,那么所谓的小挂大,就是我们知道我们合并两个不同的集合,我们是将其中的一个集合所对应的树给插入到另一个集合对应的树中作为子树,让该集合的树的根节点的指向修改指向另一个树的根节点来达到

但是我们对于并查集当中的操作,真正影响时间复杂度的其实是我们的find操作,因为我们每一次union操作前都要先find来确定完两个集合不相同后,那么我们只需要将该集合根节点所对应的father数组修改为另一个集合的father数组的值,而数组由于随机访问,那么这步修改代价的时间复杂度是o(1),而我们find从当前下标为i的元素在树中往上遍历访问到根节点的时间复杂度则是o(n),所以我们优化时间性能就是尽可能让元素少的集合去插入到元素大的集合中去,那么这样往上遍历的节点个数就相比于大挂小的节点个数要小,所以遍历代价就会减小,这就是我们的小挂大的优化
在这里插入图片描述

路径压缩

而路径压缩的方式是我们这两个优化中最高效的,那么我们掌握了路径压缩,我们甚至都不需要来小挂大来额外建立一个size数组,但是为了让我们对并查集的理解更全面,我还是介绍了小挂大的策略

那么我们的路径压缩就是我们当我们执行find操作的时候,去查询该位置所处集合当中的根节点的时候,我们会沿途往上遍历直到达到根节点,那么我们这里在沿途往上遍历的过程中,我们将我们沿途的每一个节点直接修改连接到根节点,那么这样我们每一次find的时候,我们该节点往上遍历就直接是根节点从而直接得到代表元素,那么每次查询的时间复杂度就可以优化到O(1)!但是我们路径压缩的过程会有一个o(N)的代价,但是一旦压缩之后,之后的find都是常数时间复杂度了,那么这个路径压缩优化下并查集的具体时间复杂度是专门有数学学家花了几十年时间来证明,那么感兴趣的话,可以下去自己去了解,那么这里我就不在赘述了
在这里插入图片描述

而具体我们怎么将我们的沿途的各个节点直接连接根节点,那么我们就通过栈或者递归来实现,其中递归的实现原理就是我们的从当前该节点先递归找到根节点,然后回溯到我们当前节点时,会依次返回我们根节点的节点编号然后从而修改沿途节点的father数组的值。

find函数递归版本代码板子:

int find(vector<int>& father,int x)
{if(x!=father[x]){father[x]=find(father[x]);}return father[x];
}

union函数代码板子:

void _union(vector<int>& father,int x,int y)
{int fx=find(father,x);int fy=find(father,y);if(fx!=fy){father[fx]=fy;}return;
}

初始化father数组:

vector<int> father(nums.size()); // 创建一个与nums数组大小相同的father数组
for (int i = 0; i < father.size(); i++) {father[i] = i; // 将father数组的每个元素初始化为它自己的索引
}

结语

那么这就是本篇并查集的全部内容,本篇文章就介绍了并查集的原理以及实现,那么相比于之前我的算法文章,我还会引入几个与该算法相关的题目来应用,但是由于博主最近有点忙,所以就打算将我们的并查集算法篇分为两期,一期讲原理另一期讲题,所以这篇文章相比于我们之前的文章来说字数就较少,那么我下一期我将会讲并查集的相关题目,我会持续更新,希望你多多关注,那么如果本篇文章有帮助到你的话,还请多多三连关注支持一下博主哦,你的支持就是我最大的动力!
在这里插入图片描述

相关文章:

并查集算法篇上期:并查集原理及实现

引入 那么我们在介绍我们并查集的原理之前&#xff0c;我们先来看一下并查集所应用的一个场景&#xff1a;那么现在我们有一个长度为n的数组&#xff0c;他们分别属于不同的集合&#xff0c;那么现在我们要查询数组当中某个元素和其他元素是否处于同一集合当中&#xff0c;或者…...

树莓派4基于Debian GNU/Linux 12 (Bookworm)添加多个静态ipv4网络

假设之前已经配置了 在eth0接口配置了192.168.0.100&#xff0c;现在要在同一接口&#xff08;例如 eth0&#xff09;上添加 192.168.1.100&#xff1a; 直接编辑 /etc/NetworkManager/system-connections/ 中相应的连接文件&#xff08;该文件的文件名通常与连接名称相同&…...

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件

PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件&#xff0c;以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性&#xff0c;如颜色、字体大小、样式和粗细。…...

Python连接MySQL数据库图文教程,Python连接数据库MySQL入门教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 环境准备1.1安装 Python1.2选择开发环境1.3安装 MySQL 数据库1.4 安装 pymysql 库 2. 连接数据库3. 数据库基本操作3.1 创建数据库3.2 创建表3.3 插入数据3.…...

Websocket——心跳检测

1. 前言&#xff1a;为什么需要心跳机制&#xff1f; 在现代的实时网络应用中&#xff0c;保持客户端和服务端的连接稳定性是非常重要的。尤其是在长时间的网络连接中&#xff0c;存在一些异常情况&#xff0c;导致服务端无法及时感知到客户端的断开&#xff0c;可能造成不必要…...

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言&#xff1a;金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时&#xff0c;其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中&#xff0c;量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…...

文心智能体平台已全面接入DeepSeek模型,全部免费!

文心智能体平台已全面接入DeepSeek模型&#xff01;即日起&#xff0c;您可以在创建智能体时&#xff0c;自由选择所需要的模型&#xff0c;欢迎大家体验。 ✅ ‌零成本体验‌&#xff1a;当前阶段所有用户可免费使用‌DeepSeek模型。‌ ✅ ‌‌智能适配&#xff1a;4款DeepSe…...

DuodooBMS源码解读之 odoo_phoenix_alarm模块

Odoo18 扩展模块声光报警器用户使用手册 一、模块概述 本扩展模块是基于 Odoo18 原生系统进行开发的&#xff0c;主要用于实现与上位声光报警设备的通讯功能。通过该模块&#xff0c;用户可以方便地向设备发送指令&#xff0c;控制设备的声音、灯光等操作。本手册将详细介绍该…...

docker从容器中cp到本地、cp本地到容器

在 Docker 中&#xff0c;你可以使用 docker cp 命令从容器中复制文件到本地主机。以下是具体步骤&#xff1a; 1. 查找容器 ID 或名称 首先&#xff0c;你需要知道容器的 ID 或名称。你可以使用以下命令列出所有正在运行的容器&#xff1a; docker ps 这将显示所有正在运行…...

网络工程师 (49)UDP协议

前言 UDP协议&#xff0c;即用户数据报协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;是一种无连接的、不可靠的、面向报文的传输层通信协议。 一、基本特点 无连接性&#xff1a;UDP在发送数据之前不需要与目标设备建立连接&#xff0c;也无需在数据发送结束…...

1.20作业

1 mfw(git泄露) ./git&#xff0c;原本以为点了链接下了index文件&#xff0c;就可以打开看源码&#xff0c;结果解析不了 老老实实用了githacker githacker --url --output 1 assert() 断言(assert)的用法 | 菜鸟教程 命令注入: /?page).system(cat ./templates/fl…...

HTML/CSS中交集选择器

1.作用:选中同时符合多个条件的元素 交集就是或的意思 2.语法:选择器1选择器2选择器3......选择器n{} 3.举例: /* 选中:类名为beauty的p元素,此种写法用的非常的多 */p.beauty{color: red;}/* 选中:类名包含rich和beauty的元素 */.rich.beauty{color: blue;} 4.注意: 1.有标签…...

迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-修改HCS配置

对于不同的平台&#xff0c;需要在对应的平台目录修改对应的 hcs 文件&#xff0c;接下来示例为在 rk3568下新增 uart4 uart9 uart7 的修改方法。 修改 vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs 文件&#xff0c;device_info.hcs 中添加以下内容&…...

实时股票行情接口与WebSocket行情接口的应用

实时股票行情接口与WebSocket行情接口的应用 实时股票行情接口是量化交易和投资决策的核心工具之一&#xff0c;行情接口的种类和功能也在不断扩展。介绍几种常见的行情接口&#xff0c;包括实时股票行情接口、Level2行情接口、WebSocket行情接口以及量化行情接口&#xff0c;…...

k8s故障处理经典案例(Classic Case of k8s Fault Handling)

k8s故障处理经典案例 问题描述 kubernetes版本&#xff1a;v1.22.5 部分Pod在新版本发布后一直处于ContainerCreating状态&#xff0c;经过kubectl delete命令删除后一直Terminating状态。 排查过程 遇到问题先查日志 首先进入宿主机&#xff0c;查看三个日志&#xff0c…...

关于uniApp的面试题及其答案解析

我的血液里流淌着战意&#xff01;力量与智慧指引着我&#xff01; 文章目录 1. 什么是uniApp&#xff1f;2. uniApp与原生小程序开发有什么区别&#xff1f;3. 如何使用uniApp实现条件编译&#xff1f;4. uniApp支持哪些平台&#xff0c;各有什么特点&#xff1f;5. 在uniApp中…...

给老系统做个安全检查——Burp SqlMap扫描注入漏洞

背景 在AI技术突飞猛进的今天&#xff0c;类似Cursor之类的工具已经能写出堪比大部分程序员水平的代码了。然而&#xff0c;在我们的代码世界里&#xff0c;仍然有不少"老骥伏枥"的系统在兢兢业业地发光发热。这些祖传系统的代码可能早已过时&#xff0c;架构可能岌…...

langchain系列 - FewShotPromptTemplate 少量示例

导读 环境&#xff1a;OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3 背景&#xff1a;前期忙碌的开发阶段结束&#xff0c;需要沉淀自己的应用知识&#xff0c;过一遍LangChain 时间&#xff1a;20250220 说明&#xff1a;技术梳理&#xff0c;针对FewShotP…...

【C语言】fgetpos函数用法介绍

目录 一、函数概述 二、核心参数与数据类型 三、典型应用场景 四、与 ftell() 的对比 五、错误处理与调试 六、进阶示例&#xff1a;多位置标记与恢复 七、注意事项 八、总结 fgetpos() 是C标准库中用于文件操作的关键函数之一&#xff0c;其核心功能是获取文件流的当前…...

《算法基础入门:最常用的算法详解与应用(持续更新实战与面试题)》

1. 排序算法 排序算法是将一组数据按特定的顺序排列起来的算法&#xff0c;常见的有&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;选择排序&#xff08;Selection Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;归并排序&#xff08;Merge So…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-split_dota.py

split_dota.py ultralytics\data\split_dota.py 目录 split_dota.py 1.所需的库和模块 2.def bbox_iof(polygon1, bbox2, eps1e-6): 3.def load_yolo_dota(data_root, split"train"): 4.def get_windows(im_size, crop_sizes(1024,), gaps(200,), im_rate_t…...

如何使用Python快速开发一个带管理系统界面的网站-解析方案

如果你想用 Python 开发一个 管理系统界面 的网站&#xff0c;并且希望界面美观&#xff0c;可以考虑以下几个框架和库&#xff1a; 1. Streamlit&#xff08;快速、简洁&#xff09; 适合&#xff1a;数据分析、仪表盘、内部管理系统特点&#xff1a; 写法简单&#xff0c;类…...

25年HVV关于0day的面试题

以下是对0day漏洞如何防&#xff0c;基本上是每次HVV中大家都会提到的&#xff0c;今天总结了100day防护手段。 《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkw…...

【C# 数据结构】队列 FIFO

目录 队列的概念FIFO (First-In, First-Out)Queue<T> 的工作原理&#xff1a;示例&#xff1a;解释&#xff1a; 小结&#xff1a; 环形队列1. **FIFO&#xff1f;**2. **环形缓冲队列如何实现FIFO&#xff1f;**关键概念&#xff1a; 3. **环形缓冲队列的工作过程**假设…...

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…...

【机器学习】多元线性回归算法和正规方程解求解

多元线性方差和正规方差解 一、摘要二、多元线性回归介绍三、正规方程解的求解及代码实现 一、摘要 本文围绕多元线性回归的正规方程解展开&#xff0c;为初学者系统介绍了相关基本概念、求解方法、实际应用以及算法封装要点。 首先&#xff0c;深入阐释了正规方程解这一多元…...

在Linux上创建一个Docker容器并在其中执行Python脚本

在Linux上创建一个Docker容器并在其中执行Python脚本的过程&#xff0c;涉及多个方面的内容&#xff0c;包括安装Docker、编写Dockerfile、构建镜像、运行容器等。 1. 安装Docker 在Linux上使用Docker之前&#xff0c;你需要确保系统已安装Docker。Docker支持的Linux发行版有…...

Linux C 静态库如何生成并使用

1. 编写源文件 首先创建一个简单的示例项目&#xff0c;包含一个头文件和一个源文件。 头文件 my_lib.h // my_lib.h #ifndef MY_LIB_H #define MY_LIB_H// 函数声明 int add(int a, int b);#endif 源文件 my_lib.c #include <stdio.h>void print_hello() {printf(&q…...

清华大学deepseek教程第四版 DeepSeek+DeepResearch 让科研像聊天一样简单(附下载)

deepseek使用教程系列 DeepSeekDeepResearch 让科研像聊天一样简单(附下载) https://pan.baidu.com/s/1VMgRmCSEzNvhLZQc8mu6iQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/f3d4511b790a...

请解释 Vue 中的生命周期钩子,不同阶段触发的钩子函数及其用途是什么?

vue生命周期钩子详解&#xff08;Vue 3版本&#xff09; 一、生命周期阶段划分 Vue组件的生命周期可分为四大阶段&#xff0c;每个阶段对应特定钩子函数&#xff1a; 创建阶段&#xff1a;初始化实例并准备数据挂载阶段&#xff1a;将虚拟DOM渲染为真实DOM更新阶段&#xff…...

输入搜索、分组展示选项、下拉选取,el-select 实现:即输入关键字检索,返回分组选项,选取跳转到相应内容页 —— VUE 项目-全局模糊检索

后端数据代码写于下一篇&#xff1a;输入搜索、分组展示选项、下拉选取&#xff0c;全局跳转页&#xff0c;el-select 实现 —— 后端数据处理代码&#xff0c;抛砖引玉展思路 【效果图】&#xff1a;分组展示选项 【去界面操作感受一下】—> 便捷简洁的企业官网 【录制效…...

Transformer为什么需要多头注意力(Multi-Head Attention)?如果没有多头会怎么样?

直接回答 关键点&#xff1a; Transformer 中的多头注意力&#xff08;Multi-Head Attention&#xff09;允许模型同时关注输入数据的不同方面&#xff0c;提升性能。 如果没有多头&#xff0c;模型可能无法捕捉复杂关系&#xff0c;表现会下降。 什么是多头注意力&#xff…...

VUE中的组件加载方式

加载方式有哪些&#xff0c;及如何进行选择 常规的静态引入是在组件初始化时就加载所有依赖的组件&#xff0c;而懒加载则是等到组件需要被渲染的时候才加载。 对于大型应用&#xff0c;可能会有很多组件&#xff0c;如果一开始都加载&#xff0c;可能会影响首屏加载时间。如…...

Linux自启动fastapi服务

步骤一 在/etc/systemd/system/文件夹下创建pyod.service&#xff08;其中/path/to/conda/bin/activate要改为activate实际存放位置&#xff0c;例如miniconda的实际存放位置为/root/miniconda3/bin/activate&#xff09; [Unit] DescriptionPyOD Uvicorn Service Afternetwo…...

C++与Python:两种编程语言的区别

C和Python都是当今编程领域广泛使用的语言&#xff0c;它们各有特色&#xff0c;适用于不同的开发场景。本文将从语言特性、性能、学习难度、应用领域等多个方面探讨C与Python之间的区别。 一、语言特性 类型系统&#xff1a; C&#xff1a;是一种静态类型语言&#xf…...

进程线程的创建、退出、回收

1. 进程相关知识点 1.1 进程创建 fork()&#xff1a; 功能&#xff1a;创建一个子进程。 返回值&#xff1a; 父进程中返回子进程的 PID。 子进程中返回 0。 失败返回 -1。 特点&#xff1a;子进程是父进程的副本&#xff0c;拥有独立的内存空间。 vfork()&#xff1a;…...

深度学习-6.用于计算机视觉的深度学习

Deep Learning - Lecture 6 Deep Learning for Computer Vision 简介深度学习在计算机视觉领域的发展时间线 语义分割语义分割系统的类型上采样层语义分割的 SegNet 架构软件中的SegNet 架构数据标注 目标检测与识别目标检测与识别问题两阶段和一阶段目标检测与识别两阶段检测器…...

低概率发生调用`pthread_cond_wait`的线程没有被唤醒

低概率发生调用pthread_cond_wait的线程没有被唤醒 背景&#xff1a; 你是否也踩过坑&#xff0c;在A线程调用pthread_cond_wait等待&#xff0c;在B线程调用pthread_cond_signal唤醒A线程进行工作处理&#xff0c;然后在某一次用户产品反馈中发现了低概率问题。A线程像是卡住…...

MATLAB学习之旅:数据插值与曲线拟合

在MATLAB的奇妙世界里,我们已经走过了一段又一段的学习旅程。从基础的语法和数据处理,到如今,我们即将踏入数据插值与曲线拟合这片充满魅力的领域。这个领域就像是魔法中的艺术创作,能够让我们根据现有的数据点,构建出更加丰富的曲线和曲面,从而更好地理解和描述数据背后…...

Python复习

第一章 Python概述 python特点 优点&#xff1a; 简单易学&#xff1b;开发效率高&#xff1b;典型的工具语言&#xff1b;强大丰富的模块库&#xff1b;优秀的跨平台&#xff1b; 缺点&#xff1a; 执行效率不高&#xff1b;代码不能加密&#xff1b;用缩进区分语句关系&…...

通信系统中物理层与网络层联系与区别

在通信系统中&#xff0c;物理层和网络层是OSI&#xff08;开放系统互连&#xff09;模型中的两个重要层次&#xff0c;分别位于协议栈的最底层和第三层。它们在功能、职责和实现方式上有显著的区别&#xff0c;但同时也在某些方面存在联系。以下是物理层与网络层的联系与区别的…...

go 错误处理 error

普通错误处理 // 包路径 package mainimport ("errors""fmt" )func sqrt(f1, f2 float64) (float64, error) {if f2 < 0 {return 0, errors.New("error: f2 < 0")}return f1 / f2, nil }func sqrt1(f1, f2 float64) {if re, err : sqrt(f…...

Redis 缓存穿透、击穿、雪崩:问题与解决方案

在使用 Redis 作为缓存中间件时&#xff0c;系统可能会面临一些常见的问题&#xff0c;如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决&#xff0c;可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因&#xff0c;并提供有效的解决…...

Spring容器初始化扩展点:ApplicationContextInitializer

目录 一、什么是ApplicationContextInitializer&#xff1f; 1、核心作用2、适用场景 二、ApplicationContextInitializer的使用方式 1、实现ApplicationContextInitializer接口2、注册初始化器 三、ApplicationContextInitializer的执行时机四、实际应用案例 1、动态设置环境…...

冯·诺依曼体系结构、理解操作系统管理

在谈操作系统概念之前&#xff0c;先简单讲解一下冯诺伊曼体系结构&#xff0c;理解了在硬件层面上数据流的走向&#xff0c;这对后续的理解有很大的帮助。 文章目录 一.冯诺依曼结构冯诺依曼体系结构内存存在的意义 二.理解操作系统管理操作系统的作用管理的本质系统调用 一.…...

Linux初体验:从零开始掌握操作系统的发展与多样性

Linux初体验&#xff1a;从零开始掌握操作系统的发展与多样性 前言一、什么是Linux&#xff1f;1. Linux的定义2. Linux的组成 二、Linux的发展历史1. Unix的诞生2. Linux的诞生3. Linux的普及 三、Linux的发行版1. **Ubuntu**2. **CentOS**3. **Debian**4. **Fedora**5. **Arc…...

文心一言大模型的“三级跳”:从收费到免费再到开源,一场AI生态的重构实验

2025年2月&#xff0c;百度文心大模型接连抛出两枚“重磅炸弹”&#xff1a;4月1日起全面免费&#xff0c;6月30日正式开源文心大模型4.5系列。这一系列动作不仅颠覆了李彦宏此前坚持的“闭源优势论”13&#xff0c;更标志着中国AI大模型竞争进入了一个全新的阶段——从技术壁垒…...

技术教程 | 如何实现1v1音视频通话(含源码)

今天&#xff0c;给大家讲一下怎么实现1v1音视频通话&#xff0c;以下是教程内容&#xff1a; 开发环境 开发环境要求如下&#xff1a; 环境要求说明JDK 版本1.8.0 及以上版本Android API 版本API 21、Android Studio 5.0 及以上版本CPU架构ARM 64、ARMV7IDEAndroid Studio其…...

mysql实时同步到es

测试了多个方案同步&#xff0c;最终选择oceanu产品&#xff0c;底层基于Flink cdc 1、实时性能够保证&#xff0c;binlog量很大时也不产生延迟 2、配置SQL即可完成&#xff0c;操作上简单 下面示例mysql的100张分表实时同步到es&#xff0c;优化备注等文本字段的like查询 创…...

Linux-ubuntu系统移植之Uboot启动流程

Linux-ubuntu系统移植之Uboot启动流程 一&#xff0c;Uboot启动流程1.Uboot的两阶段1.1.第一阶段1.11.硬件初始化1.12.复制 U-Boot 到 RAM1.13.跳转到第二阶段 1.2.第二阶段1.21.C 语言环境初始化1.22. 硬件设备初始化1.23. 加载环境变量1.24. 显示启动信息1.25. 等待用户输入&…...