竞赛常考的知识点大总结(四)高级数据结构

并查集

并查集(Disjoint Set Union,DSU)是一种数据结构,用于管理一系列不相交的集合,并支持两种操作:合并(Union)和查找(Find)。并查集可以高效地处理动态连通性问题,即判断两个元素是否属于同一个集合,以及合并两个集合。

特点:

1.动态连通性:并查集可以高效地处理动态连通性问题,即判断两个元素是否属于同一个集合。

2.合并操作:并查集支持合并操作,可以将两个集合合并为一个集合。

3.查找操作:并查集支持查找操作,可以快速判断两个元素是否属于同一个集合。

4.路径压缩:为了提高查找操作的效率,通常会使用路径压缩技术,将查找过程中访问过的所有节点直接连接到根节点。

常见用法:

1.网络连接检测:在计算机网络中,用于检测两个节点是否在同一个网络分段中。

2.社交网络分析:用于分析社交网络中的朋友关系,如判断两个人是否是朋友的朋友。

3.图的连通分量:用于找出图中的所有连通分量。

4.最小生成树:在Kruskal算法中,用于快速判断两个顶点是否已经连通。

经典C语言例题:

题目: 使用并查集解决动态连通性问题。

示例代码:

#include <stdio.h>
#include<malloc.h>
// 并查集结构体
typedef struct {int* parent;int* rank;int count;
} DisjointSet;// 创建并查集
DisjointSet* createDisjointSet(int n) {DisjointSet* ds = (DisjointSet*)malloc(sizeof(DisjointSet));ds->parent = (int*)malloc(n * sizeof(int));ds->rank = (int*)calloc(n, sizeof(int));ds->count = n;for (int i = 0; i < n; i++) {ds->parent[i] = i;}return ds;
}// 查找操作
int find(DisjointSet* ds, int x) {if (ds->parent[x] != x) {ds->parent[x] = find(ds, ds->parent[x]); // 路径压缩}return ds->parent[x];
}// 合并操作
void unionSets(DisjointSet* ds, int x, int y) {int xroot = find(ds, x);int yroot = find(ds, y);if (xroot != yroot) {if (ds->rank[xroot] < ds->rank[yroot]) {ds->parent[xroot] = yroot;} else if (ds->rank[xroot] > ds->rank[yroot]) {ds->parent[yroot] = xroot;} else {ds->parent[yroot] = xroot;ds->rank[xroot]++;}ds->count--;}
}// 主函数
int main() {DisjointSet* ds = createDisjointSet(10);unionSets(ds, 4, 3);unionSets(ds, 3, 8);unionSets(ds, 6, 5);unionSets(ds, 9, 4);unionSets(ds, 2, 1);unionSets(ds, 8, 9);unionSets(ds, 5, 0);unionSets(ds, 7, 2);unionSets(ds, 6, 1);unionSets(ds, 7, 3);printf("Number of disjoint sets: %d\n", ds->count);return 0;
}

例题分析:

1.创建并查集createDisjointSet函数创建一个并查集结构体,包括父数组、秩数组和集合数量。

2.查找操作find函数用于查找元素的根节点,同时使用路径压缩技术,将查找过程中访问过的所有节点直接连接到根节点。

3.合并操作unionSets函数用于合并两个集合,如果两个元素的根节点不同,则将它们合并为一个集合,并更新秩数组。

4.主函数:在main函数中,创建了一个并查集,并执行了一系列合并操作。最后,打印出并查集中集合的数量。

这个例题展示了如何在C语言中使用并查集解决动态连通性问题。通过这个例子,可以更好地理解并查集在动态连通性问题中的应用,以及如何使用并查集来高效地处理集合的合并和查找操作。并查集通过路径压缩和秩优化,使得查找和合并操作的时间复杂度接近于常数时间,是一种非常高效的动态连通性数据结构。

线段树

线段树(Segment Tree)是一种二叉树结构,用于高效地解决区间查询和区间更新问题。线段树将一个区间分成若干个线段,并将这些线段存储在树中,使得可以快速地查询和更新区间的信息。

特点:

1.区间查询:线段树可以快速查询任意区间的信息,如区间和、区间最大值、区间最小值等。

2.区间更新:线段树可以快速更新区间的信息,如将区间内的值全部增加某个数。

3.动态数据结构:线段树是一个动态数据结构,可以动态地插入和删除元素。

4.空间复杂度:线段树的空间复杂度为O(n),其中n是区间内元素的数量。

常见用法:

1.区间求和:在线段树中存储区间内元素的和,可以快速求出任意区间的和。

2.区间最大值/最小值:在线段树中存储区间内元素的最大值或最小值,可以快速求出任意区间的最大值或最小值。

3.区间更新:在线段树中存储区间内元素的其他信息,可以快速更新区间的信息。

4.动态数据处理:在线段树中动态地插入和删除元素,可以处理动态数据。

经典C语言例题:

题目: 使用线段树解决区间求和问题。

示例代码:

#include <stdio.h>
#include <stdlib.h>// 定义线段树节点结构体
typedef struct Node {int start, end;int sum;struct Node* left;struct Node* right;
} Node;// 创建线段树节点
Node* createNode(int start, int end) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->start = start;newNode->end = end;newNode->sum = 0;newNode->left = NULL;newNode->right = NULL;return newNode;
}// 构建线段树
Node* buildTree(int arr[], int start, int end) {Node* node = createNode(start, end);if (start == end) {node->sum = arr[start];return node;}int mid = (start + end) / 2;node->left = buildTree(arr, start, mid);node->right = buildTree(arr, mid + 1, end);node->sum = node->left->sum + node->right->sum;return node;
}// 查询区间和
int query(Node* node, int start, int end) {if (node->start == start && node->end == end) {return node->sum;}int mid = (node->start + node->end) / 2;if (end <= mid) {return query(node->left, start, end);} else if (start > mid) {return query(node->right, start, end);} else {return query(node->left, start, mid) + query(node->right, mid + 1, end);}
}// 更新区间和
void update(Node* node, int start, int end, int value) {if (node->start == start && node->end == end) {node->sum = value;return;}int mid = (node->start + node->end) / 2;if (end <= mid) {update(node->left, start, end, value);} else if (start > mid) {update(node->right, start, end, value);} else {update(node->left, start, mid, value);update(node->right, mid + 1, end, value);}node->sum = node->left->sum + node->right->sum;
}// 主函数
int main() {int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};int n = sizeof(arr) / sizeof(arr[0]);Node* root = buildTree(arr, 0, n - 1);printf("Sum of elements from index 1 to 3 is: %d\n", query(root, 1, 3));update(root, 1, 3, 10);printf("Sum of elements from index 1 to 3 after update is: %d\n", query(root, 1, 3));return 0;
}
 
}

例题分析:

1.创建线段树节点createNode函数创建一个线段树节点,并初始化区间和子节点指针。

2.构建线段树buildTree函数递归地构建线段树,将区间分为左右子区间,并计算区间和。

3.查询区间和query函数递归地查询线段树中指定区间的和。

4.更新区间和update函数递归地更新线段树中指定区间的和,并更新父节点的区间和。

5.主函数:在main函数中,定义了一个数组arr,构建了一个线段树,并查询和更新了指定区间的和。

这个例题展示了如何在C语言中使用线段树解决区间求和问题。通过这个例子,可以更好地理解线段树在区间查询和更新问题中的应用,以及如何使用线段树来高效地处理区间信息。线段树通过将区间分成若干个线段,并将这些线段存储在树中,使得可以快速地查询和更新区间的信息,是一种非常高效的区间数据结构。

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

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

相关文章

传统海外仓的管理模式有什么缺点?使用位像素海外仓系统的海外仓有什么优势?

传统的海外仓管理模式主要需要大量的人工操作和相对简单的信息化手段进行仓库的日常运营。因此&#xff0c;传统海外仓的运作比较依赖仓库员工的手工记录、核对和处理各种仓储和物流信息。 然而&#xff0c;传统海外仓管理模式通常存在一些缺点&#xff1a; 效率低下 因为需…

Docker-23.0.0版本 一键安装

一 前言 在数字化飞速发展的今天&#xff0c;应用程序的部署和管理成为每个企业和个人开发者不可忽视的课题。而Docker&#xff0c;作为一款开源的容器化技术&#xff0c;正以其独特的沙箱环境和逻辑隔离特性&#xff0c;引领着应用程序部署的新潮流。想象一下&#xff0c;每个…

算法之美:缓存数据淘汰算法分析及分解实现

在设计一个系统的时候&#xff0c;由于数据库的读取速度远小于内存的读取速度&#xff0c;那么为加快读取速度&#xff0c;需先将一部分数据加入到内存中&#xff08;该动作称为缓存&#xff09;&#xff0c;但是内存容量又是有限的&#xff0c;当缓存的数据大于内存容量时&…

《乡土中国》中国基层传统社会里的一种体系,支配着社会生活的各方面 - 三余书屋 3ysw.net

乡土中国 大家好&#xff0c;今天我们要解读的是费孝通先生的经典著作《乡土中国》。这本书的中文版大约有10万字&#xff0c;我将用30分钟左右的时间为你解读书中的精髓。为什么说中国的根基在于乡土社会&#xff1f;我们应该从哪些方面来理解乡土社会的特征及其重要性&#…

穿越雷区(Java--BFS解法)

穿越雷区&#xff08;Java–BFS解法&#xff09; 题目链接&#xff1a;http://oj.ecustacm.cn/problem.php?id1266 解题代码&#xff08;内含注释思路&#xff09; import java.util.*;public class Main {static int[][] dir {{0,1},{0,-1},{1,0},{-1,0}};static String[]…

Oracle备份和还原的几种方式

1、使用数据泵方式 exp demo/demoorcl buffer1024 filed&#xff1a;\back.dmp fully demo&#xff1a;用户名、密码 buffer: 缓存大小 file: 具体的备份文件地址 full: 是否导出全部文件 ignore: 忽略错误&#xff0c;如果表已经存在&#xff0c;则也是覆盖 exp demo/de…

JAVA 100道题(26)

26.编写一个JAVA程序&#xff0c;将文本文件中的内容读取到内存中并打印出来 以下是一个简单的Java程序&#xff0c;用于读取文本文件的内容并将其打印到控制台上&#xff1a; java复制代码 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOExce…

MyBatis与Hibernate的优缺点对比

MyBatis和Hibernate都是Java中常用的持久化框架&#xff0c;它们各自有着优点和缺点。让我们来对比一下它们的优缺点。 MyBatis 优点&#xff1a; SQL控制: MyBatis允许开发人员直接编写SQL语句&#xff0c;提供了更直观的数据库访问控制。灵活性: 开发人员可以更精细地控制…

LeetCode 856. 括号的分数

解题思路 栈模拟。 相关代码 class Solution {public int scoreOfParentheses(String s) {//stack中的值是左括号的的右边所有合法配对括号的值Stack<Integer> stack new Stack<>();stack.push(0);for(int i0;i<s.length();i)if(s.charAt(i) () stack.push…

nvm 安装多个版本的Node npm

先安装nvm 管理工具 git安装地址 找到安装包 下载然后安装 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11nvm常用命令 命令说明nvm version查看nvm版本nvm ls查看所有已经安装的Nodejs版本nvm list installed查看所有已经安装的Nodejs版本nvm ls availab…

第十一章 U-boot 顶层 Makefile 详解 (模块编译)

11.2.7 模块编译 在 uboot 中允许单独编译某个模块,使用命令" make Mdir"&#xff0c;旧语法"makeSUBDIRSdir"也是支持的。 200 # Use make Mdir to specify directory of external module to build 201 # Old syntax make ... SUBDIRS$PWD is still supp…

网站排名不升反降?揭秘SEO中常见的降权触发点!

在SEO(搜索引擎优化)中&#xff0c;网站的权重是影响其在搜索引擎中排名的重要因素。然而&#xff0c;有许多原因可能导致网站被降权&#xff0c;以下是一些常见的原因&#xff1a; 1. 网站内容过于雷同或不相关性&#xff1a;如果网站的内容大量复制自其他网站&#xff0c;或…

笔试:4.6美团笔试(硬件开发方向)

二十道选择两道算法题。 选择就不说了&#xff0c;硬件方面目前了解较少。 两道算法题都过了&#xff0c;第一题很简单没有什么好讲的。 第二题看着题目以为会很复杂&#xff0c;没想到一遍过。 小美有一个由 n 个互不相等的正整数构成的数组 a&#xff0c;但她一不小心把 a…

Three 之 three.js (webgl)GLSL-Card 中文手册相关知识

Three 之 three.js &#xff08;webgl&#xff09;GLSL-Card 中文手册相关知识 目录 Three 之 three.js &#xff08;webgl&#xff09;GLSL-Card 中文手册相关知识 一、简单介绍 二、GLSL 中文手册 1、基本类型 2、基本结构和数组 3、向量的分量访问 4、运算符 5、基础…

<c++基础(5)>整数溢出

整数溢出 在工程中遇到问题&#xff0c;两个int类型加减结果赋值给double类型时提示溢出风险&#xff1a; //sum和sumb都是int类型&#xff0c; double a double(sum - sumB);这里发生了整数溢出&#xff0c;整数溢出是指当计算结果超出了整数类型所能表示的范围时发生的情况…

南京观海微电子---Vitis HLS设计流程(实例演示)——Vitis HLS教程

1. 前言 课时2我们介绍了Vitis HLS的设计流程&#xff0c;如下图所示&#xff1a; 算法或软件的设计和仿真都基于C/C&#xff0c;通过HLS平台导出打包好的IP RTL代码&#xff0c;最后将该打包的IP加入到主工程使用。 本课时&#xff0c;我们通过一个具体的实例&#xff0c;演示…

Dapr(三) Dapr核心组件的使用一

结合前两期 Dapr(一) 基于云原生了解Dapr(Dapr(一) 基于云原生了解Dapr-CSDN博客) Dapr(二) 分布式应用运行时搭建及服务调用(Dapr(二) 分布式应用运行时搭建及服务调用-CSDN博客) 下篇推出dapr服务注册与发现&#xff0c;dapr组件绑定&#xff0c;dapr Actor功能。 目录 1.…

中颖51芯片学习2. IO端口操作

一、SH79F9476 I/O端口介绍 1. 特性 SH79F9476提供了30/26位可编程双向 I/O 端口&#xff1b;端口数据在寄存器Px中&#xff1b;端口控制寄存器PxCRy是控制端口作为输入还是输出&#xff1b;端口作为输入时&#xff0c;每个I/O端口均带有PxPCRy控制的内部上拉电阻。有些I/O引…

超详细!211页网络协议与管理,看完终于明白了(建议收藏)

与其说计算机改变了世界&#xff0c;不如说是计算机网络改变了世界。作为计算机网络通信实体之间的语言&#xff0c;网络通信协议对计算机正常通信起着极大的作用。 那么到底什么是网络协议与管理呢&#xff1f;今天给大家分享一份211页网络协议与管理文档&#xff0c;包含概念…

碧桂园服务净利降两成,关联交易收入仅占2.9%,发力增值服务充电桩日进超10万

自2018年分拆上市以来&#xff0c;碧桂园服务经历过非常高速的发展&#xff0c;曾是物管市场的“并购王”&#xff0c;但从2023年开始&#xff0c;希望从外延式的增长向内生式增长转型&#xff0c;将往期的经验与教训&#xff0c;通过投后管理沉淀下来&#xff0c;向高质量发展…