用html做女装网站/搜索关键词排行榜

用html做女装网站,搜索关键词排行榜,外贸网站海外推广3个必去网站,wordpress站添加根部单页打不开并查集 TA Can Do What & why learningwhatwhy 原理和结构路径压缩例题讲解题解solution 1(50分)solution 2(100分) 按秩(树高)合并按大小合并 TA Can Do What & why learning what 并查集主要是解决连通块的问题&#x…

并查集

  • TA Can Do What & why learning
    • what
    • why
  • 原理和结构
  • 路径压缩
  • 例题讲解
    • 题解
      • solution 1(50分)
      • solution 2(100分)
  • 按秩(树高)合并
  • 按大小合并

TA Can Do What & why learning

what

在这里插入图片描述

并查集主要是解决连通块的问题,例如对于上面的这个由5个村子若干条路构成的简易地图,如果问你1----->5是否是连通的,显然是的,那如果问你3——>5是否连通,显然是false,因为没有任何一条路能从3指向5,这不是很简单吗

why

那我们需要并查集干嘛?

好问题 如果这个图如果需要你自己构造而不是直接给你(动态构造集合关系),你很难或者说没法直接通过给的数据去画出每一个图的时候,并查集就能帮助我们迅速判断是否连通,而往往算法竞赛中的题目都是动态构造的(后面会附上例题),所以学习并查集是很有必要的,不然的话很大概率会超时
传统方式:
假设你有 100 万个村庄,每次新增一条路(动态添加边),如果每次都用 DFS/BFS 重新遍历整个图来判断两个村庄是否连通,时间复杂度会高达 O (N),效率极低。而并查集的find和union操作经过路径压缩和按秩合并优化后,时间复杂度几乎是O(1)

原理和结构

我们需要知道两个概念父节点和祖先,有一点像二叉树章节里的但又不太一样,尤其是对于祖先这个概念,
祖先代表的是:某一个节点不断去寻找他的父节点(递归),直到某一个节点的父节点是他本身(出口)

题外话:我在学习的时候感觉有点像 二叉树章节里面的 求最大深度问题,其实后来我想了一下是很正常的
毕竟树从某种意义上来说是特殊的图

言归正传:我们用一个pre数组来保存每个节点的父亲,我们的数组如下图所示,这里特意需要说的就是 1的父亲是他本身,所以1对应pre数组里头存储的父节点就是1

这句话怎么来理解呢:
其实可以把1看做是上面这个集合(1,2,4,5)的代表元素,也就是根节点,打个比方来说,这个1就是这个集合(家族)里面最年长的,就像家族的 “掌门人” 一样,没有比他更年长的父亲了,所以他的父亲就是他自己。
成员 1 作为这个家族的代表元素(根节点),就像是整个家族的源头,其他成员都是从他这里 “衍生” 出来的,就像一棵大树,成员 1 是树干最顶端的那个起始点,其他成员是从树干上长出来的树枝和树叶。

在这里插入图片描述

通过上面的例子大家应该会有一个比较基础的了解,但是在一开始每一个节点都是跟自己是一个连通关系(即指向自身)
在这里插入图片描述
就比如在添加1-2这条边的时候,我们就会让2的祖先指向1,在添加2-4这条边的时候,我们就需要注意,打个比方来说
由于2的“钱”已经交给1了,4想要找2要钱是找不到的,只能去找1了,体现在图中就是让4的祖先指向1,
总结来说就是:对于任何非根节点的相连都必须转换成它们各自的根节点相连

那现在我们已经可以用个构建的这个表来判断节点之间是否连通了,就比如1一直找,找到他的祖先是4,这个时间复杂度是O(N)的,但是这只是一次查询的情况如果有n次查询,那么时间复杂度就是O(n方),
那么有没有办法去优化它呢?
其实是有的——路径压缩(没学之前听着恐怖 其实是纸老虎)
在这里插入图片描述

路径压缩

我对于路径压缩的理解(可能不完全准确哈):
就是好比你是一个失忆的人,现在知道四个地方,A B C D,你通过不断探索知道了A是经过B C 能走到D的,也就是说你现在知道A到D是连通的,但是每过一段时间 如果一个人问你,你都需要重新走一遍,路径压缩好比就是,你用笔记本记下来了,A到D是通的并且D是终点,(这就引出了路径压缩的核心思想:通过直接记录最终结果(根节点),避免重复计算路径)
同理B,C到D也是通的,我们这里并不关心,A怎么到D,只关心从A能不能到D

压缩完成就是这个情况:
在这里插入图片描述

本质:
牺牲空间(存储父指针)换取时间(快速查询)
将树的高度 “压扁”,使得后续的find操作时间复杂度接近 O (1)

这里压扁的是啥?不就是我们寻找的路径path吗

例题讲解

在这里插入图片描述

题解

题目说的很直白就是让你用并查集的思路,其中有一个flag Z当它变化的时候,分别对应两种操作:1.合并(merge)2.判断(isCon)

solution 1(50分)

还有50%的测试点,数据非常大,即便关闭同步流,还是超时了吗,还是做不到吗,哈基霜你这家伙…
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 9;
int pre[maxn];//存储父节点int root(int x)
{return pre[x] == x ? x : pre[x] = root(pre[x]);
}
//一切操作都在根上
void Merge(int x, int y)
{pre[root(x)] = root(y);
}bool isCon(int x, int y)
{return root(x) == root(y);
}void init(int N)
{for (int i = 1; i <= N; ++i) pre[i] = i;
}signed main()
{ios::sync_with_stdio(0);int N, M;cin >> N >> M;init(N);while (M--){int Z, X, Y;cin >> Z >> X >> Y;if (Z == 1)Merge(X, Y);else if (Z == 2)printf("%c\n", isCon(X, Y) ? 'Y' : 'N');}return 0;
}

solution 2(100分)

之前代码仅实现路径压缩,未结合按树高或者大小合并,在数据量大 时,树可能因合并顺序不当变得高度很高,导致find操作时间复杂度退化为接近O(n),最终超时。而当前代码通过两种优化,将单次操作的时间复杂度优化至几乎常数级

#include <bits/stdc++.h>
using namespace std;const int maxn = 1e5 + 9;
int pre[maxn];// 存储父节点
int siz[maxn];// 存储集合大小(模拟秩)// 初始化并查集
void init(int N) {for (int i = 1; i <= N; ++i) {pre[i] = i;siz[i] = 1; // 初始时每个集合大小为 1}
}// 查找根节点并路径压缩
int root(int x) {return pre[x] == x ? x : pre[x] = root(pre[x]);
}// 合并两个集合,按集合大小(秩)优化
void Merge(int x, int y) {int rx = root(x);int ry = root(y);if (rx == ry) return; // 已在同一集合,无需合并// 保证将较小集合合并到较大集合if (siz[rx] > siz[ry]) swap(rx, ry); pre[rx] = ry;if (siz[rx] == siz[ry]) siz[ry]++; // 若大小相等,合并后新集合秩+1
}// 判断两个元素是否连通
bool isCon(int x, int y) {return root(x) == root(y);
}signed main() {ios::sync_with_stdio(0);int N, M;cin >> N >> M;init(N);while (M--) {int Z, X, Y;cin >> Z >> X >> Y;if (Z == 1) {Merge(X, Y);} else if (Z == 2) {printf("%c\n", isCon(X, Y) ? 'Y' : 'N');}}return 0;
}

这就引出了下面的优化方法按秩合并和启发式合并

按秩(树高)合并

在这里插入图片描述
在这之前啊,我们是不是通过解决 斜树查找退化成链表的问题 学习过平衡二叉树的概念,
这个其实跟这里的按秩合并非常像,解决的问题也很像

比如说上面这张图,如果新增的边是4->3,
那拿3这个节点举例,那他走到根只需要两步,那如果是3->4,那就需要走3步,根节点向右倾斜了

对于一棵树 我们更希望它变成 矮墩墩 而不是长竹竿,所以就需要我们添加边的时候就需要进行比较 矮的指向高的
在这里插入图片描述

按大小合并

跟上面跟类似用小的集合指向大的集合 也就是比较少的点会多走一步

void Merge(int x, int y) {int rx = root(x);int ry = root(y);if (rx == ry) return; // 已在同一集合,无需合并// 保证将较小集合合并到较大集合if (siz[rx] > siz[ry]) swap(rx, ry); pre[rx] = ry;if (siz[rx] == siz[ry]) siz[ry]++; // 若大小相等,合并后新集合秩+1
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单实用!百度AI + Raphael AI = 免费生图

简单实用&#xff01;百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步&#xff1a;下载或截取一些好看的图片当参考图片 第二步&#xff1a;用百度AI描述你想要的图片&…

React中组件通讯与插槽

一、为DOM组件设置Props 1.用JSX语法对标签的类名进行设置属性名是className&#xff1b; 2.用JSX语法对标签的样式进行设置要使用键值对进行设置&#xff0c;带“-”时用小驼峰方法来书写&#xff1b; 3.当一个标签的属性过多时&#xff0c;可以通过JSX语法进行展开设置&am…

自定义reset50模型转换到昇腾om

目录 原始转换脚本 脚本运行报错 基于reset50 模型的自定义网络 基本网络结构 卷积模块定义示例 Bottleneck定义示例 网络定义示例 改进的转换脚本 脚本运行报错channels不匹配 脚本运行报错维度不匹配 模型输入数据的类型 tensor size NCHW和NHWC 自定义网络的通…

vue3:十一、主页面布局(进入指定菜单页面,默认锁定到左侧菜单)

一、效果 直接进入home页面&#xff0c;直接展开对应的菜单项 二、具体实现 1、菜单容器增加默认选中变量 在菜单容器中将默认展开菜单default-openeds修改为默认选中菜单default-active 2、引入useRoute方法 引入该方法为了获取当前页面的路径 import { useRoute } from …

六十天前端强化训练之第二十七天之Pinia 状态管理全解与购物车实战案例

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、Pinia 深度解析 1. Pinia 核心设计 2. 核心概念图解 3. Store 类型对比 Option Store&#xff08;选项式&#xff09; Setup Store&#xff08;组合式&#xff09; …

Java多线程与高并发专题——Future 是什么?

引入 在上一篇Callable 和 Runnable 的不同&#xff1f;的最后&#xff0c;我们有提到和 Callable 配合的有一个 Future 类&#xff0c;通过 Future 可以了解任务执行情况&#xff0c;或者取消任务的执行&#xff0c;还可获取任务执行的结果&#xff0c;这些功能都是 Runnable…

用ArcGIS做一张符合环评要求的植被类型图

植被类型图是环境影响评价&#xff08;环评&#xff09;中的重要图件&#xff0c;需满足数据准确性、制图规范性和信息完整性等要求。本教程将基于ArcMap平台&#xff0c;从数据准备到成果输出&#xff0c;详细讲解如何制作符合环评技术规范的植被类型图。 ArcGIS遥感解译土地…

Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)

前言 近期在抠lerobot源码时&#xff0c;看到其封装了ALOHA ACT、diffusion policy、π0时&#xff0c;我就在想&#xff0c;lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事&#xff0c;对他们也是很好的历练然当25年3.18日…

MySQL拒绝访问

1. 问题 使用图形界面工具连接MySQL数据库&#xff0c;拒绝访问&#xff01; 2. 解决方法 以管理员的身份打开cmd&#xff0c;输入命令&#xff0c;启动MySQL net start mysql版本号 3. 参考 暂无

多模态SVG生成新标杆:StarVector从图像文本生成高精度SVG的AI模型

一、引言&#xff1a;矢量图形的崛起与挑战 在现代数字世界中&#xff0c;图像扮演着至关重要的角色&#xff0c;而可伸缩矢量图形&#xff08;SVG&#xff09;正因其独特的优势&#xff0c;在网页设计、图形设计等领域占据着越来越重要的地位。与传统的基于像素的栅格图像不同…

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…

游戏引擎学习第175天

回顾和今天的计划 今天的主要任务是完成稀疏 Unicode 支持。之前我们已经完成了所有的思考和设计工作&#xff0c;但代码部分尚未完成&#xff0c;因为有许多内容需要调整和重构。因此&#xff0c;今天的目标就是把这些内容全部整理好并最终实现。 回顾当前测试资源构建器的状…

miniconda安装保姆级教程|win11|深度学习环境配置

一、官网安装miniconda miniconda官网&#xff1a;Miniconda - Anaconda 点击Download按钮 在红框位置输入邮箱并点击submit&#xff0c;下载链接将会发到邮箱中 邮箱中将会收到如图所示邮件&#xff0c;点击下载 选择windows对应的miniconda安装包 miniconda安装包安装完成如…

AI安全、大模型安全研究(DeepSeek)

DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…

Android Studio最后一个绑定JDK8的版本,但是官方下载是最新的,怎么下载Android Studio历史版本包,这篇文章帮你解决。

最近需要安装Android Studio 编辑器 发现官网最新的编辑器已经不支持 jdk8了 经过查阅资料&#xff1a; Android Studio最后一个绑定JDK8的版本:4.1.3 下载地址&#xff1a;https://developer.android.google.cn/studio/archive 如果你打开是这样的 下载页 这是因为你用的中…

「宇树科技」13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 2025年2月20日&#xf…

背包问题——多重背包(C语言)

代码如下&#xff1a; #include<stdio.h>int knapsack(int weight[], int value[], int count[], int n, int capacity) {int* dp (int*)malloc(sizeof(int) * (capacity 1));for (int i 0; i < capacity; i){dp[i] 0;}for (int i 0; i < n; i)//核心代码{fo…

<项目> 主从Reactor模型的高并发服务器

目录 Reactor 概念 分类 单Reactor单线程 单Reactor多线程 多Reactor多线程 项目介绍 项目规划 模块关系 实现 TimerWheel -- 时间轮定时器 定时器系统调用 时间轮设计 通用类型Any Buffer Socket Channel Poller EventLoop&#xff08;核心&#xff09; eventfd 设计思路 …

车载以太网网络测试-20【传输层-DOIP协议-3】

1 摘要 本文继续对ISO 13400-2定义的节点管理报文进行介绍&#xff0c;主要对路由激活请求/响应报文以及在线检查请求/响应报文的作用、帧结构以及示例进行介绍。 上文回顾&#xff1a; 车载以太网网络测试-19【传输层-DOIP协议-2】 在进行详细介绍之前&#xff0c;还是先回顾…

Jvm运行时数据区有哪些

Jvm运行时数据区有哪些 程序计数器&#xff08;Program Counter Register&#xff09; 作用&#xff1a; 可以看作是当前线程所执行的字节码的行号指示器。在多线程环境下&#xff0c;每个线程都有自己独立的程序计数器&#xff0c;线程私有的&#xff0c;用于记录该线程正在执…