高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构
高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构
在解决复杂问题时,选择合适的数据结构往往是成功的关键。本文将深入探讨四种强大而实用的高级数据结构:并查集、跳表、布隆过滤器和高效缓存结构(LRU和LFU),包括它们的原理、实现、复杂度分析和实际应用场景。
1. 并查集(Disjoint Set / Union-Find)
1.1 基本原理
并查集是一种树形数据结构,用于处理一些不相交集合的合并及查询问题。主要支持两种操作:
- 查找(Find):确定元素属于哪一个子集
- 合并(Union):将两个子集合并成一个集合
并查集的核心思想是使用"代表元素"(或称"根节点")来表示一个集合,并通过父指针将同一集合中的元素链接起来。
1.2 C++实现
下面是一个带路径压缩和按秩合并优化的并查集实现:
#include <iostream>
#include <vector>class DisjointSet {
private:std::vector<int> parent; // 父节点std::vector<int> rank; // 秩(树的高度上界)int count; // 集合数量public:// 构造函数,初始化n个单元素集合DisjointSet(int n) {count = n;parent.resize(n);rank.resize(n, 0);// 初始时,每个元素的父节点是自己for (int i = 0; i < n; i++) {parent[i] = i;}}// 查找操作:返回元素x所属集合的代表元素// 使用路径压缩优化int find(int x) {// 路径压缩:将x到根节点路径上的所有节点直接连接到根节点if (parent[x] != x) {parent[x] = find(parent[x]);}return parent[x];}// 合并操作:合并元素x和y所属的集合// 使用按秩合并优化void unionSets(int x, int y) {int rootX = find(x);int rootY = find(y);// 如果已经在同一集合中,则不需要合并if (rootX == rootY) {return;}// 按秩合并:将较矮的树连接到较高的树下if (rank[rootX] < rank[rootY]) {parent[rootX] = rootY;} else if (rank[rootX] > rank[rootY]) {parent[rootY] = rootX;} else {// 如果秩相同,则任意选择一个作为根,并增加秩parent[rootY] = rootX;rank[rootX]++;}// 集合数量减1count--;}// 判断元素x和y是否在同一集合中bool isConnected(int x, int y) {return find(x) == find(y);}// 返回集合数量int getCount() const {return count;}
};
1.3 优化技术
-
路径压缩(Path Compression):在Find操作中,将查找路径上的所有节点都直接连接到根节点,减少后续查询的深度。
-
按秩合并(Union by Rank):在Union操作中,总是将较小的树(秩较小)连接到较大的树(秩较大)下,避免树过深。
-
按大小合并(Union by Size):类似按秩合并,但使用集合元素数量而不是树高作为决策依据。
1.4 复杂度分析
设n为元素数量,m为操作次数:
操作 | 时间复杂度(最坏) | 时间复杂度(平均/摊销) |
---|---|---|
构造 | O(n) | O(n) |
Find | O(log n) | O(α(n))* |
Union | O(log n) | O(α(n))* |
*α(n)是阿克曼函数的反函数,增长极其缓慢,在实际应用中可视为常数(≤4)。
空间复杂度:O(n),用于存储父节点和秩信息。
1.5 应用场景
-
连通性问题:判断网络中节点之间是否连通,例如社交网络中的朋友关系。
-
最小生成树算法:Kruskal算法中用于检测边是否会形成环。
-
等价类划分:将具有等价关系的元素归类。
-
集合合并:处理集合的动态合并操作。
1.6 实际应用示例
连通块问题
// 计算图中的连通分量数量
int countComponents(int n, std::vector<std::vector<int>>& edges) {DisjointSet ds(n);// 连接所有的边for (const auto& edge : edges) {ds.unionSets(edge[0], edge[1]);}return ds.getCount();
}
Kruskal算法实现最小生成树
#include <algorithm>struct Edge {int src, dest, weight;// 用于按权重排序bool operator<(const Edge& other) const {return weight < other.weight;}
};std::vector<Edge> kruskalMST(int n, std::vector<Edge>& edges) {std::vector<Edge> result;DisjointSet ds(n);// 按边的权重从小到大排序std::sort(edges.begin(), edges.end());// 按权重从小到大尝试加入边,如果不构成环则加入MSTfor (const auto& edge : edges) {int src = edge.src;int dest = edge.dest;// 如果src和dest不在同一连通分量中if (!ds.isConnected(src, dest)) {// 加入此边到MSTresult.push_back(edge);// 合并连通分量ds.unionSets(src, dest);}}return result;
}
2. 跳表(Skip List)
2.1 基本原理
跳表是一种随机化的数据结构,基于链表,但允许快速查找、插入和删除。其核心思想是通过维护多层链表,来实现"快速跳跃"查找,从而获得对数级别的操作复杂度。
跳表的特点:
- 每个节点包含一个值和多个前向指针
- 底层是一个普通的有序链表
- 上层链表是下层链表的"快速通道",可以跳过多个元素
- 节点层数采用随机化策略确定,保证了平均性能
2.2 C++实现
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <climits>class SkipList {
private:// 跳表节点结构struct Node {int value; // 节点值std::vector<Node*> forward; // 前向指针数组Node(int val, int level) : value(val), forward(level, nullptr) {}};Node* head; // 头节点int maxLevel; // 最大层数int currentLevel; // 当前层数float probability; // 层数增加的概率(通常0.5)// 随机生成节点的层数int randomLevel() {int level = 1;// 生成[0,1)的随机数,如果小于probability且未超过最大层数,则层数加1while ((static_cast<float>(rand()) / RAND_MAX) < probability && level < maxLevel) {level++;}return level;}public:// 构造函数SkipList(int maxLevel = 16, float p = 0.5) : maxLevel(maxLevel), currentLevel(1), probability(p) {// 初始化随机数生成器srand(static_cast<unsigned int>(time(nullptr)));// 创建头节点,层数为最大层数head = new Node(INT_MIN, maxLevel);}// 析构函数~SkipList() {Node* current = head;Node* next;while (current) {next = current->forward[0]; // 下一个节点delete current;current = next;}}// 搜索值为target的节点bool search(int target) {Node* current = head;// 从最高层开始查找for (int i = currentLevel - 1; i >= 0; i--) {// 在当前层向前移动,直到找到一个值大于或等于target的节点,或到达末尾while (current->forward[i] && current->forward[i]->value < target) {current = current->forward[i];}}// 到达最底层,检查下一个节点是否是要找的值current = current->forward[0];// 如果找到了目标值,返回truereturn current && current->value == target;}// 插入节点void insert(int value) {// 用于记录每一层的插入位置std::vector<Node*> update(maxLevel, nullptr);Node* current = head;// 从最高层开始查找插入位置for (int i = currentLevel - 1; i >= 0; i--) {while (current->forward[i] && current->forward[i]->value < value) {current = current->forward[i];}update[i] = current;}// 随机生成新节点的层数int newLevel = randomLevel();// 如果新层数大于当前层数,更新update数组if (newLevel > currentLevel) {for (int i = currentLevel; i < newLevel; i++) {update[i] = head;}currentLevel = newLevel;}// 创建新节点Node* newNode = new Node(value, newLevel);// 插入新节点到各层链表中for (int i = 0; i < newLevel; i++) {// 设置新节点的前向指针newNode->forward[i] = update[i]->forward[i];// 更新插入位置的前向指针指向新节点update[i]->forward[i] = newNode;}}// 删除节点bool remove(int value) {std::vector<Node*> update(maxLevel, nullptr);Node* current = head;// 从最高层开始查找要删除的节点for (int i = currentLevel - 1; i >= 0; i--) {while (current->forward[i] && current->forward[i]->value < value) {current = current->forward[i];}update[i] = current;}// 获取可能要删除的节点current = current->forward[0];// 如果节点存在且值匹配if (current && current->value == value) {// 从每一层中删除该节点for (int i = 0; i < currentLevel; i++) {if (update[i]->forward[i] != current) {break;}update[i]->forward[i] = current->forward[i];}// 删除节点delete current;// 更新当前最大层数while (currentLevel > 1 && head->forward[currentLevel - 1] == nullptr) {currentLevel--;}return true;}return false;}// 打印跳表内容(用于调试)void printSkipList() {for (int i = currentLevel - 1; i >= 0; i--) {Node* current = head->forward[i];std::cout << "Level " << i << ": ";while (current) {std::cout << current->value << " ";current = current->forward[i];}std::cout << std::endl;}}
};
2.3 复杂度分析
操作 | 时间复杂度(平均) | 时间复杂度(最坏) |
---|---|---|
搜索 | O(log n) | O(n) |
插入 | O(log n) | O(n) |
删除 | O(log n) | O(n) |
空间复杂度:O(n),因为跳表平均会有1/(1-p)个指针,当p=0.5时为O(2n),简化为O(n)。
跳表的随机性使得其时间复杂度分析相对复杂,但在平均情况下,跳表与平衡二叉树有类似的性能,且实现更简单。
2.4 优化技术
-
调整概率参数:概率p影响层数分布,通常取0.5,可根据应用特点调整。
-
内存优化:使用变长数组存储前向指针,仅分配必要的空间。
-
跳表变种:
- 后向指针:支持双向遍历
- 带间隔信息:支持快速排名查询
- 确定性跳表:使用确定性算法代替随机化
2.5 应用场景
-
有序集合实现:Redis中的Sorted Set使用跳表实现。
-
索引结构:作为数据库中的索引结构,支持范围查询。
-
替代平衡树:在需要平衡树功能但实现难度要求低的场景。
-
并发环境:相比平衡树,跳表的并发控制更简单。
2.6 实际应用示例
范围查询实现
// 扩展跳表,增加范围查询功能
std::vector<int> rangeQuery(SkipList& list, int startValue, int endValue) {std::vector<int> result;// 使用底层链表(0层)进行范围查询Node* current = list.findNodeBeforeValue(startValue)->forward[0];// 收集范围内的所有值while (current && current->value <= endValue) {result.push_back(current->value);current = current->forward[0];}return result;
}
实现有序计数器
// 扩展跳表节点,增加计数信息
struct CountNode {int value;int count; // 元素出现次数std::vector<CountNode*> forward;CountNode(int val, int level, int cnt = 1) : value(val), count(cnt), forward(level, nullptr) {}
};// 扩展跳表函数以处理计数
void incrementCount(int value) {// 寻找value对应的节点Node* current = findNodeBeforeValue(value)->forward[0];// 如果存在此值,增加计数if (current && current->value == value) {current->count++;} else {// 否则插入新节点insert(value);}
}
3. 布隆过滤器(Bloom Filter)
3.1 基本原理
布隆过滤器是一种空间效率很高的概率型数据结构,用于判断一个元素是否在集合中。它的特点是:
- 可能会出现假阳性(误判元素存在),但绝不会出现假阴性(误判元素不存在)
- 无法删除元素(标准布隆过滤器)
- 占用空间极小,远小于存储元素本身所需空间
布隆过滤器的核心是一个位数组和多个哈希函数。添加元素时,用多个哈希函数计算位置并将对应位置为1;查询时,检查所有哈希位置是否都为1。
3.2 C++实现
#include <iostream>
#include <vector>
#include <functional>
#include <string>
#include <cmath>class BloomFilter {
private:std::vector<bool> bitArray; // 位数组int size; // 位数组大小
相关文章:
高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构
高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构 在解决复杂问题时,选择合适的数据结构往往是成功的关键。本文将深入探讨四种强大而实用的高级数据结构:并查集、跳表、布隆过滤器和高效缓存结构(LRU和LFU),包括它们的原理、实现、复杂度分析和实际应用场景。 1.…...
CVPR2025 | 蚂蚁浙大提出MP-GUI算法:全方位增强MLLM的GUI理解能力
近日,计算机视觉和模式识别领域国际顶会CVPR 2025公布了论文录用结果,蚂蚁集团与浙江大学EAGLE实验室合作的论文 “MP-GUI: Modality Perception with MLLMs for GUI Understanding” 被成功录用。 IEEE国际计算机视觉与模式识别会议(CVPR&a…...
过河卒cpp动态规划
题目如下 思路 利用二维数组存储棋盘的各个点的位置,首先初始化所有位置为0,然后记马的位置为1,将m,n同时加2,避免马的位置溢出,然后对二维数组进行递推算出dp[n][m] 代码及解析如下 谢谢观看!…...
春天咋会像冬天一样
2025年3月20日,阴,天寒 遇见的事:21~24号去曲靖招生,打电话给我说换一下,换了后又没有车了,这么坑。 感受到的情绪:你知道么,换的前提是有车。开车不给报销,…...
DooTask在Linux的离线部署教程
DooTask在Linux的离线部署教程 下载安装包 从网盘中将安装包下载到本地,下载地址 通过网盘分享的文件:DooTask项目管理工具 链接: https://pan.baidu.com/s/1hGmLXonT4c8hLiDP1QBr8w?pwdgdp6 提取码: gdp6 通过网盘分享的文件:DooTask项目…...
分享下web3j 常见用法
转账 fun sendEthTransaction(privateKey: String,toAddress: String,amount: BigDecimal) {//chainIdval chainId:Long 1//url 可以从https://chainlist.org/里面获取可用节点//eth转账,bnb同理,但需发送到bnb对应节点val url "https://xxx"…...
跨域问题确认及处理
背景如下: 近期在做的项目中,有个奇怪的需求,需要在JSP项目中嵌套一个VUE项目,原因是:JSP项目是在运且不大方便重构的一个项目,新需求又想为了未来着想做一套单独的项目,无奈只能嵌套。 当项目开…...
PyCharm如何添加已有的conda环境
1、点击文件中的设置 2、在右侧选中项目下的Python解释器 3、在右侧解释器一栏找到添加解释器选项 4、选择本地解释器 5、填写信息 环境:选择现有 类型:conda conda路径:...\Anaconda\Scripts\conda.exe 环境(python路径&…...
揭开最大子段和问题的神秘面纱:从暴力法到极致优化的算法之旅
最大子段和问题:从暴力法到优化的算法解析 题目链接 题目描述 给出一个长度为 nn 的序列 aa,选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数,表示序列的长度 n。第二行有 n 个整数,第 i 个整数表示序列的…...
MySQL原理:逻辑架构
目的:了解 SQL执行流程 以及 MySQL 内部架构,每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层:连接层 3.1 数据库连接池(Conn…...
提升模型性能:数据增强与调优实战
一、为什么需要数据增强? 数据增强通过对训练图像进行随机变换,能够有效: 增加数据多样性,防止过拟合提升模型对不同视角、光照条件的鲁棒性在数据量不足时显著提升模型性能 二、MNIST手写数字识别实战 1. 加载数据…...
Emacs 折腾日记(十八)——改变Emacs的样貌
截止到上一篇文章为止,之前教程 的内容都看完了,虽然它的后记部分提供了一些后续进阶的内容需要我们自己读手册。但是我不太想继续在elisp上死磕了。看着自己学了那么久的elisp,但是自己的emacs仍然没有半点改变,这个时候各位读者…...
VNA操作使用学习-14 再测晶振特性
再测一下4Mhz晶振,看看特性曲线,熟悉一下vna使用。 s11模式,找遍了各种format都无法显示,只有这一种(s11,Resistance)稍微显示出一个谐振,但是只有一个点。 s21模式 这是201p&#…...
CentOS7 离线下载安装 GitLab CE
依赖下载 https://vault.centos.org/7.9.2009/os/x86_64/Packages/policycoreutils-python-2.5-34.el7.x86_64.rpm 依赖安装 rpm -ivh policycoreutils-python-2.5-34.el7.x86_64.rpm 查看是否安装依赖 rpm -qa | grep policycoreutils-pythongitlab下载 https://packag…...
LeetCode 热题 100_跳跃游戏 II(79_45_中等_C++)(贪心算法)
LeetCode 热题 100_跳跃游戏 II(79_45) 题目描述:输入输出样例:题解:解题思路:思路一(贪心选择): 代码实现代码实现(思路一(贪心算法)…...
《Linux系统编程篇》Linux Socket 网络编程01 API介绍(Linux 进程间通信(IPC))——基础篇
文章目录 引言1. **创建Socket**2. **绑定Socket**3. **监听Socket**4. **接受客户端连接**5. **连接服务器**6. **发送数据**7. **接收数据**8. **发送数据(UDP)**9. **接收数据(UDP)**10. **关闭Socket**11. **设置/获取Socket选…...
系统思考—啤酒游戏经营决策沙盘模拟
再次感谢文华学院的邀请,为经纬集团管理层带来 《啤酒游戏经营决策沙盘》! 很多朋友问:“最近是不是啤酒游戏上的少了?” 其实,真正的关键不是游戏本身,而是——如何让大家真正看见复杂系统中的隐性结构。 …...
利用设计模式构建事件处理系统
在现代软件开发中,设计模式提供了一种可重用的解决方案来解决常见的设计问题。在这篇博客中,我们将探讨如何利用模板方法模式、责任链模式、建造者模式以及线程安全设计来构建一个灵活且可扩展的事件处理系统。 设计模式及其应用 1. 模板方法模式 应用…...
ThreadLocal 的详细使用指南
一、ThreadLocal 核心原理 ThreadLocal 是 Java 提供的线程绑定机制,为每个线程维护变量的独立副本。其内部通过 ThreadLocalMap 实现,每个线程的 Thread 对象都有一个独立的 ThreadLocalMap,存储以 ThreadLocal 对象为键、线程局部变量为值…...
全员DeepSeek时代,前端能做些什么?
全员DeepSeek时代,前端能做些什么? 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc #mermaid-svg-VNyL95jkz9jEXgUq {font-family:&…...
阿里云 AI 搜索产品荣获 Elastic Innovation Award 2024
阿里云AI搜索产品荣获Elastic Innovation Award 2024,该奖项于近日在新加坡ElasticON 2025的Elastic合作伙伴峰会上颁发,旨在表彰基于Elastic平台开发企业级生成式人工智能(GenAI)应用的顶尖合作伙伴,这些应用有效帮助…...
html5制作2048游戏开发心得与技术分享
2048游戏开发心得与技术分享 这里写目录标题 2048游戏开发心得与技术分享项目概述技术架构1. 核心技术栈2. 项目结构 核心功能实现1. 数据结构设计2. 移动逻辑实现3. 触摸支持 性能优化1. DOM操作优化2. 事件处理优化 开发心得1. 代码组织2. 调试技巧3. 用户体验优化 项目亮点技…...
AI日报 - 2025年3月21日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | OpenAI成立安全委员会,加速AGI治理框架构建 ▎💼 商业动向 | 微软发布医疗大模型DAX Copilot 3.0,覆盖全球临床场景 ▎📜 政策追踪 | 中国发布…...
MyBatis-Plus:告别手写 SQL 的高效之道
目录 1. MyBatis-plus 简介 2. MyBatis-Plus 快速上手 2.1 项目准备 2.2 导入 MyBatis-Plus 依赖 2.3 配置数据库连接 2.4 配置 MyBatis-Plus 日志打印 3. 使用 MyBatis-Plus 3.1 创建 model 类 3.2 创建 mapper 接口 3.3 MyBatis-Plus 映射机制 3.3.1 TableName &a…...
【AI News | 20250320】每日AI进展
AI Repos 1、servers 该仓库提供详细入门指南,用户可通过简单步骤连接Claude客户端,快速使用所有服务器功能。此项目由Anthropic管理,展示MCP的多样性与扩展性,助力开发者为大语言模型提供安全、可控的工具与数据访问。 2、awe…...
让“树和二叉树”埋在记忆土壤中--性质和概念
Nice to meet your! 目录 树的介绍: 树的创建: 二叉树的概念和结构: 二叉树的存储结构: 树的介绍: 概念和结构: 不知你们是否在现实中看见过分为两个叉的枯树,大概长这样: 那…...
210、【图论】课程表(Python)
题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系,找到入度为0的点作为起始遍历点。之后每遍历到这个点之后,就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时,继续被加入其…...
【Linux篇】进程控制
📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 1. 进程创建 1.1 fork函数 在linux中fork函数是非常重要的函数,它从已存在进程中创建一个…...
freeswitch(在呼叫失败的情况下如何播放语⾳提⽰)
亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch⼀般我们在打电话时会听到『您拨的电话正在通话中,请稍后再 拨.』,或『电话⽆应答』之类的提⽰,我们在 FreeSWITCH ⾥也可以这样做。 …...
软考系统架构设计师之计算机组成与体系结构笔记
一、计算机硬件组成 1. 冯诺依曼结构与哈佛结构 冯诺依曼结构:以存储器为中心,指令和数据统一存储,通过总线连接运算器、控制器、输入输出设备。其核心思想是“存储程序控制”,但存在存储器访问瓶颈问题。哈佛结构:指…...
gonet开源游戏服务器环境配置
1.mysql搭建 搜索mysql-server apt安装包名 sudo apt search mysql-server 安装mysql-server sudo apt-get install mysql-server 安装完成后会,启动mysql服务及创建系统服务 查看服务状态 systemctl status mysql.service 使用超级权限登陆mysql sudo mysql 授…...
软件工程之软件验证计划Software Verification Plan
个人主页:云纳星辰怀自在 座右铭:“所谓坚持,就是觉得还有希望!” 本文为基于ISO26262软件验证计划模板,仅供参考。 软件验证计划,包括: 1. 软件需求验证计划 2. 软件架构设计验证计划 3. 软件单…...
大模型详细配置
Transformer结构 目前主力大模型都是基于Transformer的,以下是Transformer的具体架构 它由编码器(Encoder)以及解码器(Decoder)组成,前者主要负责对输入数据进行理解,将每个输入 词元都编码成一个上下文语义相关的表示向量;后者…...
Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取
Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取 一、FireCrawl 项目简介二、主要功能三、FireCrawl应用场景1. 大语言模型训练2. 检索增强生成(RAG):3. 数据驱动的开发项目4. SEO 与内容优化5. 在线服务与工具集成 四、安装…...
产业观察:ASML2025.3.21
一.发展历程 1.1 创业背景 在半导体行业的快速发展背景下,ASML的创业故事拉开了帷幕。1983年, 飞利浦S&I技术总监Georg de Kruyff 与 ASM创始人Arthur del Prado 重启合作讨论,为ASML的创立奠定了基础。双方迅速达成协议,计…...
go语言学习教程推荐,零基础到做项目
一、基础入门阶段 官方教程(免费) • A Tour of Go:交互式入门教程,边学边练 • Go by Example:通过300代码片段学习语法 入门书籍 • 📘《Go语言圣经》中文版(免费在线阅读)&#…...
设计模式 二、创建型设计模式
GoF是 “Gang of Four”(四人帮)的简称,它们是指4位著名的计算机科学家:Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。他们合作编写了一本非常著名的关于设计模式的书籍《Design Patterns: Elements of Reusable…...
51c大模型~合集73
我自己的原文哦~ https://blog.51cto.com/whaosoft/12318419 #Emu3 视频、图像、文本,只需基于下一个Token预测:智源Emu3发布,验证多模态模型新范式 OpenAI 前首席科学家、联合创始人 Ilya Sutskever 曾在多个场合表达观点࿱…...
【el-upload】el-upload组件 - list-type=“picture“ 时,文件预览展示优化
目录 问题图el-upload预览组件 PicturePreview效果展示 问题图 el-upload <el-uploadref"upload"multipledragaction"#":auto-upload"false":file-list"fileList"name"files":accept".png,.jpg,.jpeg,.JGP,.JPEG,.…...
STM32F103系列配置中断向量表偏移(Keil/STM32CubeIDE)
需要在flash中添加bootloader的话,需要对flash进行分区,即bootloader区和app区(程序运行区),主要记录在 Keil 平台和 STM32CubeIDE平台 上的中断向量表偏移配置,以偏移 0x2800 为例,即预留10k大小的空间给bootloader …...
Redis常用数据类型和使用常见以及基本操作举例(适合初学者,以医药连锁管理系统为背景)
Redis的常见数据类型,包括String、Hash、List、Set、Zset等,这些数据类型都有各自的特点和适用场景。接下来,将这些数据类型与医药连锁管理系统的业务场景进行匹配。 String类型,适合存储单个值。在医药连锁管理系统中࿰…...
ASL扩展坞方案|Type-c转换器方案|ASL原厂代理商
安格瑞科技代理的ASL主板组件系列包括CS5211、CS5311、CS5232、CS5263、CS621x、CS5523、CS5518等产品; CS5228ANDP to HDMI(4K60HZ)CS5262ANDP (4lanes) to HDMI2.0 4k60Hz VGACS5263ANDP(4lanes) to HDMI2.0 4k60HzCS5363ANDP (4lanes) to HDMI2.0 4k60Hz CS521…...
论文略读(2025.3.18-更新中)
关于可控视频生成 I2V3D: Controllable image-to-video generation with 3D guidance Image to Video工作,能够实现给一张图,输出一个视频,且可以控制相机。动态信息来自于用户手工设计(相机移动,人体骨骼驱动&#x…...
基于SpringBoot的“校园招聘网站”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“校园招聘网站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…...
【Linux进程七】程序地址空间
【Linux进程七】程序地址空间 1.进程的地址空间分布2.类型的本质是偏移量3.什么是进程地址空间4.页表的映射和访问权限字段5.地址空间的作用 1.进程的地址空间分布 堆是向上扩展的,栈是向下扩展的 因为字符常量区和代码区相邻,受到同样的保护,…...
Linux C/C++编程——线程
线程是允许应用程序并发执行多个任务的一种机制,线程参与系统调度。 系统调度的最小单元是线程、而并非进程。 线程包含在进程之中,是进程中的实际运行单位。一个线程指的是进程中一个单一顺序的控制流(或者说是执行路线、执行流)…...
【Spring Boot 中 `@Value` 注解的使用】
文章目录 一、前言二、Value 注解简介三、Value 注解的常见用法1. 读取 application.properties 或 application.yml 配置值(1)配置文件示例(2)Java 代码示例(3)测试输出 2. 使用 Value 设置默认值3. 读取系…...
【CAD二次开发】调试无法进入断点提示无可用源问题(非空心断点)
问题截图:显示无可用源,关闭后F5走完后,启动的调试就中断了 操作是:打开Cad,打开dwg后,执行命令,就出现以上截图问题。 问题来源:通常是由于 AutoCAD 的 纤程模式(Fiber&…...
Ubuntu下Docker部署Misskey:打造你的去中心化社交平台
引言 在信息爆炸的时代,人们对于社交平台的需求日益增长,同时也更加注重数据的隐私和自由。Misskey作为一个开源的去中心化社交平台,为用户提供了一个全新的选择。本文将详细介绍如何在Ubuntu Linux环境下,利用Docker快速部署Mis…...
【Vue3】01-vue3的基础 + ref reactive
首先确保已经有了ES6的基础 本文介绍 vue 的基础使用以及 两种响应数据的方式。 目录 1. 创建一个vue应用程序 2. Vue模块化开发 3. ref 和 reactive 的区别 1. 创建一个vue应用程序 所需的两个文件: https://unpkg.com/vue3/dist/vue.global.js https://un…...