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

深入理解位图(Bit - set):概念、实现与应用

目录

引言 

一、位图概念 

(一)基本原理 

(二)适用场景 

二、位图的实现(C++ 代码示例) 

 三、位图应用

1. 快速查找某个数据是否在一个集合中

2. 排序 + 去重 

3. 求两个集合的交集、并集等 

4. 操作系统中磁盘块标记 

四、总结 


引言
 

在处理海量数据时,如何高效地存储和查询数据是一个关键问题。位图(Bit - set)作为一种非常巧妙的数据结构,在很多场景下能够极大地提升数据处理的效率。今天,我们就来深入探讨一下位图的相关知识。
 

一、位图概念
 

(一)基本原理
 


位图,简单来说,就是用每一位来存放某种状态。它特别适用于海量数据且数据无重复的场景,通常用于判断某个数据是否存在。比如,给定40亿个不重复的无符号整数,要快速判断一个无符号整数是否在这40亿个数中。数据是否存在刚好是两种状态(存在或不存在),此时就可以使用一个二进制比特位来代表数据是否存在的信息。如果二进制比特位为1,代表存在;为0,则代表不存在。
 
假设我们有一个整数数组  int array[] = {1,3,7,4,12,16,19,13,22,18};  ,我们可以按照一定规则将这些数映射到位图中。例如,将整数的范围划分为若干段,像0 - 7、8 - 15、16 - 23等,每个整数对应位图中的一个比特位。
 

(二)适用场景
 

1. 快速查找:在海量数据集中快速判断某个数据是否存在,相比传统的遍历查找(时间复杂度O(N) )或者排序后二分查找(时间复杂度O(logN) ),位图在某些情况下可以实现更高效的查找。
2. 数据去重与统计:在统计一些不重复元素的相关信息时,位图可以帮助我们快速标记已经出现过的元素,方便进行去重和统计数量等操作。
 

二、位图的实现(C++ 代码示例)
 


下面是一个简单的位图类  bitset  的C++ 实现代码:

#pragma once
#include<vector>namespace ldg
{template<size_t N>class bitset{public:bitset(){_a.resize(N / 32 + 1);}// x映射的那个标记成1void set(size_t x){size_t i = x / 32;size_t j = x % 32;_a[i] |= (1 << j);}// x映射的那个标记成0void reset(size_t x){size_t i = x / 32;size_t j = x % 32;_a[i] &= (~(1 << j));}bool test(size_t x){size_t i = x / 32;size_t j = x % 32;return _a[i] & (1 << j);}private:vector<int> _a;};template<size_t N>class twobitset{public:void set(size_t x){// 00 -> 01if (!_bs1.test(x) && !_bs2.test(x)){_bs2.set(x);} // 01 -> 10else if (!_bs1.test(x) && _bs2.test(x)){_bs1.set(x);_bs2.reset(x);}// 本身10代表出现2次及以上,就不变了}bool is_once(size_t x){return !_bs1.test(x) && _bs2.test(x);}private:bitset<N> _bs1;bitset<N> _bs2;};
}
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<unordered_set>
#include<unordered_map>
#include<set>
using namespace std;#include"BitSet.h"//int main()
//{
//	bit::bitset<1000> bs;
//	bs.set(1);
//	bs.set(10);
//	bs.set(100);
//
//	cout << bs.test(1) << endl;
//	cout << bs.test(10) << endl;
//	cout << bs.test(100) << endl;
//	cout << bs.test(999) << endl<<endl;
//
//	bs.set(999);
//	bs.reset(10);
//
//	cout << bs.test(1) << endl;
//	cout << bs.test(10) << endl;
//	cout << bs.test(100) << endl;
//	cout << bs.test(999) << endl << endl;
//
//	getchar();
//
//	bit::bitset<-1> bs1;
//	//bit::bitset<0xffffffff> bs2;
//
//	getchar();
//
//	return 0;
//}//int main()
//{
//	int a[] = { 1,2,3,3,4,4,4,4,4,2,3,6,3,1,5,5,8,9};
//	bit::twobitset<10> tbs;
//	for (auto e : a)
//	{
//		tbs.set(e);
//	}
//
//	for (auto e : a)
//	{
//		if (tbs.is_once(e))
//		{
//			cout << e << " ";
//		}
//	}
//	cout << endl;
//}int main()
{int a1[] = { 1,2,3,3,4,4,4,4,4,2,3,6,3,1,5,5,8,9 };int a2[] = { 8,4,8,4,1,1,1,1 };ldg::bitset<10> bs1;ldg::bitset<10> bs2;// 去重for (auto e : a1){bs1.set(e);}// 去重for (auto e : a2){bs2.set(e);}for (int i = 0; i < 10; i++){if (bs1.test(i) && bs2.test(i)){cout << i << " ";}}cout << endl;
}

代码解释
 
1. 构造函数: bitset(size_t bitCount)  根据传入的比特位总数  bitCount  来初始化位图。通过  (bitCount >> 5) + 1  计算出需要的  int  类型数组的大小,因为一个  int  有32位,右移5位(相当于除以32),并加1是为了保证能容纳所有比特位。
2.  set  函数:将指定的比特位  which  置为1。先判断  which  是否越界,然后通过位运算计算出该比特位在  _bit  数组中的索引  index  和在该  int  中的位置  pos  ,最后使用  |=  操作将对应位置置1。
3.  reset  函数:将指定的比特位  which  置为0。同样先判断越界,计算索引和位置后,使用  &=  和按位取反操作将对应位置清零。
4.  test  函数:检测指定比特位  which  是否为1。判断越界后,计算索引和位置,通过与运算判断对应位置是否为1。
5.  size  函数:返回位图中比特位的总个数。
6.  Count  函数:统计位图中为1的比特位的个数。通过一个预先定义好的  bitCnttable  数组来快速统计每个字节中1的个数,遍历  _bit  数组进行累加。
 

 三、位图应用

1. 快速查找某个数据是否在一个集合中

看对应bit位是1是0

#include <vector>
#include <iostream>class bitset {
public:bitset(size_t bitCount) : _bit((bitCount >> 5) + 1), _bitCount(bitCount) {}void set(size_t which) {if (which > _bitCount) return;size_t index = (which >> 5);size_t pos = which % 32;_bit[index] |= (1 << pos);}bool test(size_t which) const {if (which > _bitCount) return false;size_t index = (which >> 5);size_t pos = which % 32;return _bit[index] & (1 << pos);}private:std::vector<int> _bit;size_t _bitCount;
};int main() {// 假设集合元素的范围最大到100bitset setBits(100);// 向集合中添加元素int elements[] = {10, 20, 30, 40};for (int element : elements) {setBits.set(element);}// 查找元素int target = 30;if (setBits.test(target)) {std::cout << target << " is in the set." << std::endl;} else {std::cout << target << " is not in the set." << std::endl;}return 0;
}


 
解释:先创建一个  bitset  对象,指定其大小涵盖集合元素可能的范围。通过  set  函数将集合中的元素对应比特位置1 ,之后使用  test  函数传入要查找的元素,根据返回值判断元素是否在集合中。
 

2. 排序 + 去重
 

#include <vector>
#include <iostream>
#include <algorithm>class bitset {
public:bitset(size_t bitCount) : _bit((bitCount >> 5) + 1), _bitCount(bitCount) {}void set(size_t which) {if (which > _bitCount) return;size_t index = (which >> 5);size_t pos = which % 32;_bit[index] |= (1 << pos);}bool test(size_t which) const {if (which > _bitCount) return false;size_t index = (which >> 5);size_t pos = which % 32;return _bit[index] & (1 << pos);}private:std::vector<int> _bit;size_t _bitCount;
};int main() {// 假设集合元素的范围最大到100bitset setBits(100);// 原始数组,包含重复元素int arr[] = {10, 20, 10, 30, 20, 40};for (int element : arr) {setBits.set(element);}std::vector<int> sortedUnique;for (size_t i = 0; i < setBits.size(); ++i) {if (setBits.test(i)) {sortedUnique.push_back(i);}}std::sort(sortedUnique.begin(), sortedUnique.end());for (int num : sortedUnique) {std::cout << num << " ";}std::cout << std::endl;return 0;
}


 
解释:利用  bitset  ,将数组元素对应比特位置1 ,实现去重。之后遍历  bitset  ,将为1的比特位对应的整数添加到新的  vector  中,最后对这个  vector  进行排序,得到去重且有序的序列。
 

3. 求两个集合的交集、并集等
 

#include <vector>
#include <iostream>class bitset {
public:bitset(size_t bitCount) : _bit((bitCount >> 5) + 1), _bitCount(bitCount) {}void set(size_t which) {if (which > _bitCount) return;size_t index = (which >> 5);size_t pos = which % 32;_bit[index] |= (1 << pos);}bool test(size_t which) const {if (which > _bitCount) return false;size_t index = (which >> 5);size_t pos = which % 32;return _bit[index] & (1 << pos);}bitset intersection(const bitset& other) const {if (_bitCount!= other._bitCount) {std::cerr << "Bitsets must have the same size for intersection." << std::endl;return bitset(0);}bitset result(_bitCount);for (size_t i = 0; i < _bit.size(); ++i) {result._bit[i] = _bit[i] & other._bit[i];}return result;}bitset unionSet(const bitset& other) const {if (_bitCount!= other._bitCount) {std::cerr << "Bitsets must have the same size for union." << std::endl;return bitset(0);}bitset result(_bitCount);for (size_t i = 0; i < _bit.size(); ++i) {result._bit[i] = _bit[i] | other._bit[i];}return result;}private:std::vector<int> _bit;size_t _bitCount;
};int main() {// 假设集合元素的范围最大到100bitset setBits1(100);bitset setBits2(100);int elements1[] = {10, 20, 30};int elements2[] = {20, 30, 40};for (int element : elements1) {setBits1.set(element);}for (int element : elements2) {setBits2.set(element);}bitset intersectionResult = setBits1.intersection(setBits2);bitset unionResult = setBits1.unionSet(setBits2);std::cout << "Intersection: ";for (size_t i = 0; i < intersectionResult.size(); ++i) {if (intersectionResult.test(i)) {std::cout << i << " ";}}std::cout << std::endl;std::cout << "Union: ";for (size_t i = 0; i < unionResult.size(); ++i) {if (unionResult.test(i)) {std::cout << i << " ";}}std::cout << std::endl;return 0;
}


 
解释:先分别创建表示两个集合的  bitset  对象,将集合元素对应比特位置1 。通过  intersection  函数实现按位与操作得到交集位图,通过  unionSet  函数实现按位或操作得到并集位图,最后遍历位图输出交集和并集中的元素。
 

4. 操作系统中磁盘块标记
 

#include <vector>
#include <iostream>class DiskBlockBitset {
public:DiskBlockBitset(size_t blockCount) : _bit((blockCount >> 5) + 1), _blockCount(blockCount) {}void markUsed(size_t blockIndex) {if (blockIndex > _blockCount) return;size_t index = (blockIndex >> 5);size_t pos = blockIndex % 32;_bit[index] |= (1 << pos);}void markFree(size_t blockIndex) {if (blockIndex > _blockCount) return;size_t index = (blockIndex >> 5);size_t pos = blockIndex % 32;_bit[index] &= ~(1 << pos);}bool isBlockUsed(size_t blockIndex) const {if (blockIndex > _blockCount) return false;size_t index = (blockIndex >> 5);size_t pos = blockIndex % 32;return _bit[index] & (1 << pos);}private:std::vector<int> _bit;size_t _blockCount;
};int main() {// 假设磁盘块总数为100DiskBlockBitset diskBlocks(100);// 标记一些磁盘块为已使用int usedBlocks[] = {10, 20, 30};for (int block : usedBlocks) {diskBlocks.markUsed(block);}// 检查某个磁盘块状态int checkBlock = 20;if (diskBlocks.isBlockUsed(checkBlock)) {std::cout << "Disk block " << checkBlock << " is used." << std::endl;} else {std::cout << "Disk block " << checkBlock << " is free." << std::endl;}// 释放一个磁盘块diskBlocks.markFree(20);if (diskBlocks.isBlockUsed(checkBlock)) {std::cout << "Disk block " << checkBlock << " is still used." << std::endl;} else {std::cout << "Disk block " << checkBlock << " is now free." << std::endl;}return 0;
}


 
 
解释:定义  DiskBlockBitset  类模拟操作系统中磁盘块标记。通过  markUsed  函数将指定磁盘块对应比特位置1表示已使用, markFree  函数将对应比特位置0表示空闲, isBlockUsed  函数用于检测磁盘块是否被使用。


 

四、总结
 

位图作为一种高效的数据结构,在处理海量数据的存在性判断、数据统计等方面有着广泛的应用。通过合理利用位图的特性,我们可以在很多场景下优化程序的性能,减少时间和空间复杂度。希望通过这篇博客,大家能对位图有更深入的理解,并在实际编程中灵活运用。

相关文章:

深入理解位图(Bit - set):概念、实现与应用

目录 引言 一、位图概念 &#xff08;一&#xff09;基本原理 &#xff08;二&#xff09;适用场景 二、位图的实现&#xff08;C 代码示例&#xff09; 三、位图应用 1. 快速查找某个数据是否在一个集合中 2. 排序 去重 3. 求两个集合的交集、并集等 4. 操作系…...

React Flow 边事件处理实战:鼠标事件、键盘操作及连接规则设置(附完整代码)

本文为《React Agent&#xff1a;从零开始构建 AI 智能体》专栏系列文章。 专栏地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。项目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代码示​例与实战源&#xff09;。完整介绍…...

【计算机网络】第一章:计算机网络体系结构

本篇笔记课程来源&#xff1a;王道计算机考研 计算机网络 【计算机网络】第一章&#xff1a;计算机网络体系结构 一、计算机网络的概念1. 理论2. 计算机网络、互连网、互联网的区别 二、计算机网络的组成、功能1. 组成2. 功能 三、交换技术1. 电路交换2. 报文交换3. 分组交换4.…...

实战设计模式之状态模式

概述 作为一种行为设计模式&#xff0c;状态模式允许对象在其内部状态改变时&#xff0c;改变其行为。这种模式通过将状态逻辑从对象中分离出来&#xff0c;并封装到独立的状态类中来实现。每个状态类代表一种特定的状态&#xff0c;拥有自己的一套行为方法。当对象的状态发生变…...

[C++入门]类和对象中(2)日期计算器的实现

目录 一、运算符重载 1、格式 2、简单举例 2、前置&#xff0c;后置 3、日期生成器的实现 1、声明与定义 1、友元函数 2、print函数 3、运算符重载 4、GetMonthDay 5、&#xff0c;-&#xff0c;&#xff0c;-的实现 6、重载流操作符 2、实现 3、定义源码 一、运算…...

数据质量问题的形成与解决

在数字化时代&#xff0c;数据已成为企业和组织发展的核心资产&#xff0c;数据质量的高低直接影响着决策的准确性、业务的高效性以及系统的稳定性。然而&#xff0c;数据质量问题频发&#xff0c;严重阻碍了数据价值的充分发挥。 一、数据质量问题的成因分析 1.信息因素 元数…...

论文阅读(四):Agglomerative Transformer for Human-Object Interaction Detection

论文来源&#xff1a;ICCV&#xff08;2023&#xff09; 项目地址&#xff1a;https://github.com/six6607/AGER.git 1.研究背景 人机交互&#xff08;HOI&#xff09;检测需要同时定位人与物体对并识别其交互关系&#xff0c;核心挑战在于区分相似交互的细微视觉差异&#…...

【机器学习】工具入门:飞牛启动Dify Ollama Deepseek

很久没有更新文章了,最近正好需要研究一些机器学习的东西&#xff0c;打算研究一下 difyOllama 以下是基于FN 的dify本地化部署&#xff0c;当然这也可能是全网唯一的飞牛部署dify手册 部署 官方手册&#xff1a;https://docs.dify.ai/en/getting-started/install-self-hos…...

课外活动:再次理解页面实例化PO对象的魔法方法__getattr__

课外活动&#xff1a;再次理解页面实例化PO对象的魔法方法__getattr__ 一、动态属性访问机制解析 1.1 核心实现原理 class Page:def __getattr__(self, loc):"""魔法方法拦截未定义属性访问"""if loc not in self.locators.keys():raise Exce…...

面试题总结二

1.mybatis三个范式 第一范式&#xff1a;表中字段不能再分&#xff0c;每行数据都是唯一的第二范式&#xff1a;满足第一范式&#xff0c;非主键字段只依赖于主键第三范式&#xff1a;满足第二范式&#xff0c;非主键字段没有传递依赖 2.MySQL数据库引擎有哪些 InnoDB&#…...

代码随想录算法训练营第六十六天| 图论11—卡码网97. 小明逛公园,127. 骑士的攻击

继续补&#xff0c;又是两个新算法&#xff0c;继续进行勉强理解&#xff0c;也是训练营最后一天了&#xff0c;六十多天的刷题告一段落了&#xff01; 97. 小明逛公园 97. 小明逛公园 感觉还是有点难理解原理 Floyd 算法对边的权值正负没有要求&#xff0c;都可以处理。核心…...

编程技能:字符串函数07,strncat

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数06&#xff0c;strcat 回到目录…...

[Java实战]Spring Boot整合RabbitMQ:实现异步通信与消息确认机制(二十七)

[Java实战]Spring Boot整合RabbitMQ&#xff1a;实现异步通信与消息确认机制&#xff08;二十七&#xff09; 摘要&#xff1a;本文通过完整案例演示Spring Boot与RabbitMQ的整合过程&#xff0c;深入讲解异步通信原理与消息可靠性保证机制。包含交换机类型选择、消息持久化配…...

数据库中关于查询选课问题的解法

前言 今天上午起来复习了老师上课讲的选课问题。我总结了三个解法以及一点注意事项。 选课问题介绍 简单来说就是查询某某同学没有选或者选了什么课。然后查询出该同学的姓名&#xff0c;学号&#xff0c;课程号&#xff0c;课程名之类的。 sql文件我上传了。大家可以尝试练…...

用 UniApp 开发 TilePuzzle:一个由 CodeBuddy 主动驱动的拼图小游戏

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念&#xff1a;从一个小游戏想法开始 最近在使用 UniApp 做练手项目的时候&#xff0c;我萌生了一个小小…...

golang 安装gin包、创建路由基本总结

文章目录 一、安装gin包和热加载包二、路由简单场景总结 一、安装gin包和热加载包 首先终端新建一个main.go然后go mod init ‘项目名称’执行以下命令 安装gin包 go get -u github.com/gin-gonic/gin终端安装热加载包 go get github.com/pilu/fresh终端输入fresh 运行 &…...

组态王|组态王中如何添加西门子1200设备

哈喽,你好啊,我是雷工! 最近使用组态王采集设备数据,设备的控制器为西门子的1214CPU, 这里边实施边记录,以下为在组态王中添加西门子1200PLC的笔记。 1、新建 在组态王工程浏览器中选择【设备】→点击【新建】。 2、选择设备 和设备建立通讯要通过对应的设备驱动。 在…...

碎片笔记|PromptStealer复现要点(附Docker简单实用教程)

前言&#xff1a;本篇博客记录PromptStealer复现历程&#xff0c;主要分享环境配置过程中的一些经验。 论文信息&#xff1a;Prompt Stealing Attacks Against Text-to-Image Generation Models. USENIX, 2024. 开源代码&#xff1a;https://github.com/verazuo/prompt-stealin…...

Docker配置SRS服务器 ,ffmpeg使用rtmp协议推流+vlc拉流

目录 演示视频 前期配置 Docker配置 ffmpeg配置 vlc配置 下载并运行 SRS 服务 推拉流流程实现 演示视频 2025-05-18 21-48-01 前期配置 Docker配置 运行 SRS 建议使用 Docker 配置 Docker 请移步&#xff1a; 一篇就够&#xff01;Windows上Docker Desktop安装 汉化完整指…...

c++学习之--- list

目录 ​编辑 一、list的定义: 二、list的模拟实现&#xff1a; 1、list的基本框架&#xff1a; 2、list的普通迭代器&#xff1a; 设计思想&#xff1a; 迭代器的一个特殊需求&#xff08;c 对于重载->的一颗语法糖&#xff09;&#xff1a; 代码实现&#xff1a; 3、cons…...

【C++】set、map 容器的使用

文章目录 1. set 和 multiset 的使用1.1 set类的介绍1.2 set的构造和迭代器1.3 set 的增删查1.4 insert和迭代器调用示例1.5 find和erase使用示例1.6 multiset和set的差异 2. map 和 multimap 的使用2.1 map 类的介绍2.2 pair 类型介绍2.3 map 的构造和迭代器2.4 map 的增删查2…...

实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)

实习记录小程序 目录 基于SSM的习记录小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码…...

Git从入门到精通

Git 是什么 Git 是一个分布式版本控制系统&#xff0c;主要用于跟踪和管理文件&#xff08;尤其是代码&#xff09;的变更。 Git的下载与安装 进入git官网下载界面,选择Windows系统。 点击选择Git for Windows/x64 Setup,进行安装。 注意: Git GUI 是Git提供的一个图形界面工…...

Binary Prediction with a Rainfall Dataset-(回归+特征工程+xgb)

Binary Prediction with a Rainfall Dataset 题意&#xff1a; 给你每天的天气信息&#xff0c;让你预测降雨量。 数据处理&#xff1a; 1.根据特征值构造天气降雨量的新特征值 2.根据时间构造月和季节特征 3.处理缺失值 建立模型&#xff1a; 1.建立lightgbm模型 2.建立…...

【C++】unordered_map与set的模拟实现

unordered系列map和set&#xff0c;与普通区别 用法几乎相同&#xff0c;键值唯一&#xff0c;区别unordered系列迭代器是单向的并且遍历出来不是有序的。unordered系列在数据规模大且无序的情况下性能更优 底层实现&#xff1a; map 和 set &#xff1a;基于平衡二叉树&…...

老旧设备升级利器:Modbus TCP转 Profinet让能效监控更智能

在工业自动化领域&#xff0c;ModbusTCP和Profinet是两种常见的通讯协议。Profinet是西门子公司推出的基于以太网的实时工业以太网标准&#xff0c;而Modbus则是由施耐德电气提出的全球首个真正开放的、应用于电子控制器上的现场总线协议。这两种协议各有各的优点&#xff0c;但…...

编译原理--期末复习

本文是我学习以下博主视频所作的笔记&#xff0c;写的不够清晰&#xff0c;建议大家直接去看这些博主的视频&#xff0c;他/她们讲得非常好&#xff1a; 基础知识概念&#xff1a; 1.【【编译原理】期末复习 零基础自学】&#xff0c;资料 2.【编译原理—混子速成期末保过】&…...

软件工程各种图总结

目录 1.数据流图 2.N-S盒图 3.程序流程图 4.UML图 UML用例图 UML状态图 UML时序图 5.E-R图 首先要先了解整个软件生命周期&#xff1a; 通常包含以下五个阶段&#xff1a;需求分析-》设计-》编码 -》测试-》运行和维护。 软件工程中应用到的图全部有&#xff1a;系统…...

Go 与 Gin 搭建简易 Postman:实现基础 HTTP 拨测的详细指南

Go 与 Gin 搭建简易 Postman&#xff1a;实现基础 HTTP 拨测的详细指南 文章目录 Go 与 Gin 搭建简易 Postman&#xff1a;实现基础 HTTP 拨测的详细指南项目简介代码结构各部分代码功能说明&#xff1a; 代码实现&#xff1a;main.go代码解释 handlers/probe.go代码解释 probe…...

层次原理图

层次原理图简介 层次原理图&#xff08;Hierarchical Schematic&#xff09;是一种常用于电子工程与系统设计的可视化工具&#xff0c;通过分层结构将复杂系统分解为多个可管理的子模块。它如同“设计蓝图”&#xff0c;以树状结构呈现整体与局部的关系&#xff1a;顶层展现系…...

嵌入式硬件篇---拓展板

文章目录 前言 前言 本文简单介绍了拓展板的原理以及使用。...

Redis的主从架构

主从模式 全量同步 首先主从同步过程第一步 会先比较replication id 判断是否是第一次同步假设为第一次同步 那么就会 启动bgsave异步生成RDB 同时fork子进程记录生成期间的新数据发送RDB给从节点 清空本地数据写入RDB 增量同步 对比ReplicationID不同因此选择增量同步在Rep…...

IIS入门指南:原理、部署与实战

引言&#xff1a;Web服务的基石 在Windows Server机房中&#xff0c;超过35%的企业级网站运行在IIS&#xff08;Internet Information Services&#xff09;之上。作为微软生态的核心Web服务器&#xff0c;IIS不仅支撑着ASP.NET应用的运行&#xff0c;更是Windows Server系统管…...

【上位机——WPF】布局控件

布局控件 常用布局控件Panel基类Grid(网格)UniformGrid(均匀分布)StackPanel(堆积面板)WrapPanel(换行面板)DockerPanel(停靠面板)Canvas(画布布局)Border(边框)GridSplitter(分割窗口)常用布局控件 Grid:网格,根据自定义行和列来设置控件的布局StackPanel:栈式面板,包含的…...

使用 C# 入门深度学习:线性代数详细讲解

在深度学习的领域中&#xff0c;线性代数是基础数学工具之一。无论是神经网络的训练过程&#xff0c;还是数据的预处理和特征提取&#xff0c;线性代数的知识都无处不在。掌握线性代数的核心概念&#xff0c;对于理解和实现深度学习算法至关重要。在本篇文章中&#xff0c;我们…...

操作系统之EXT文件系统

1.理解硬件 1.1磁盘、服务器、机柜、机房 机械磁盘是计算机中唯一的一个机械设备 磁盘--- 外设慢容量大&#xff0c;价格便宜 1.1.1光盘 1.1.2服务器 1.1.3机房 1.2磁盘的物理结构 1.3磁盘的存储结构 一个盘片又两个面 每个面都有一个磁头 磁头沿着盘面的半径移动 1.3.1…...

继MCP、A2A之上的“AG-UI”协议横空出世,人机交互迈入新纪元

第一章&#xff1a;AI交互的进化与挑战 1.1 从命令行到智能交互 人工智能的发展历程中&#xff0c;人机交互的方式经历了多次变革。早期的AI系统依赖命令行输入&#xff0c;用户需通过特定指令与机器沟通。随着自然语言处理技术的进步&#xff0c;语音助手和聊天机器人逐渐普…...

Java大厂面试:从Web框架到微服务技术的场景化提问与解析

Java大厂面试&#xff1a;从Web框架到微服务技术的场景化提问与解析 场景&#xff1a; 某知名互联网大厂的面试现场。面试官一脸严肃&#xff0c;对面坐着搞笑的程序员谢飞机。以下是他们的对话&#xff1a; 第一轮&#xff1a;Web框架基础与数据库操作 面试官&#xff1a;谢…...

最新缺陷检测模型:EPSC-YOLO(YOLOV9改进)

目录 引言:工业缺陷检测的挑战与突破 一、EPSC-YOLO整体架构解析 二、核心模块技术解析 1. EMA多尺度注意力模块:让模型"看得更全面" 2. PyConv金字塔卷积:多尺度特征提取利器 3. CISBA模块:通道-空间注意力再进化 4. Soft-NMS:更智能的重叠框处理 三、实…...

leetcode hot100刷题日记——2.字母异位词分组

涉及知识点:vector、哈希表 解答我的解答的时间复杂度分析我的解答的空间复杂度分析复习&#xff1a;排序算法的时间复杂度 和第一题需要的知识点相同&#xff0c;所以知识点复习可见 link1《leetcode hot100刷题日记——1.两数之和》 解题思路&#xff1a;是字母异位词的字符…...

elementUI 单选框存在多个互斥的选项中选择的场景

使用 el-radio-group 来使用单选框组&#xff0c;代码如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">业务对象</el-radio><…...

基于区块链技术的智能汽车诊断与性能分析

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 钝感力的“钝”&#xff0c;不是木讷、迟钝&#xff0c;而是直面困境的韧劲和耐力&#xff0c;是面对外界…...

基于区块链技术的供应链溯源系统:重塑信任与透明度

在当今全球化的商业环境中&#xff0c;供应链的复杂性不断增加&#xff0c;产品从原材料采购到最终交付消费者手中的过程涉及多个环节和众多参与者。然而&#xff0c;传统供应链管理面临着诸多挑战&#xff0c;如信息不透明、数据易篡改、追溯困难等&#xff0c;这些挑战不仅影…...

基于OpenCV的实时文档扫描与矫正技术

文章目录 引言一、系统概述二、核心代码解析1. 导入必要库2. 辅助函数定义3. 坐标点排序函数4. 透视变换函数5. 主程序流程 三、完整代码四、结语 引言 在日常工作和学习中&#xff0c;我们经常需要将纸质文档数字化。手动拍摄文档照片常常会出现角度倾斜、透视变形等问题&…...

基于STM32F103与Marvell88W8686的WIFI无线监控视频传输系统研发(论文)

基于STM32F103与Marvell88W8686的WIFI无线监控视频传输系统研发 中文摘要 在当今社会信息化进程不断加速的时代背景下&#xff0c;众多领域对于监控系统的需求日益增长&#xff0c;像车内安全监控、电梯运行监控等场景都离不开监控系统的支持。过去&#xff0c;不少领域普遍采用…...

华为云Astro中各种变量与参数的区别与用法

目录 🧠 华为云 Astro 各类变量与参数详解 🧩 一、变量与参数的核心作用是什么? 🖼️ 二、整体分类与结构图 📘 三、逐一详细解析 + 类比说明 + 使用建议 🔹 1. 输入参数(Input Parameter) 🔹 2. 输出参数(Output Parameter) 🔹 3. 变量(本地变量)…...

数字人技术的核心:AI与动作捕捉的双引擎驱动(210)

**摘要&#xff1a;**数字人技术从静态建模迈向动态交互&#xff0c;AI与动作捕捉技术的深度融合推动其智能化发展。尽管面临表情僵硬、动作脱节、交互机械等技术瓶颈&#xff0c;但通过多模态融合技术、轻量化动捕方案等创新&#xff0c;数字人正逐步实现自然交互与情感表达。…...

华为云Astro轻应用创建业务对象(BO)的概念梳理

目录 一、业务对象(BO)是什么?——【详细概念解释】 二、形象理解业务对象(BO) 🍱 类比方式: 📦 举个具体例子:以做一个“智能烟雾报警系统”应用 三、为什么使用BO很重要? 四、小结: 一、业务对象(BO)是什么?——【详细概念解释】 在华为云Astro轻应用…...

MySQL开发规范

目录 一、建表规约 二、索引规约 三、SQL语句 四、 ORM映射 一、建表规约 强制&#xff1a; 1、表达是与否概念的字段&#xff0c;必须使用is_xxx的方式命名&#xff08;PoJo中不加is前缀&#xff09;&#xff0c;数据类型是unsigned tinyint&#xff08;1表示是&#xf…...

K8s入门教程(一)

Kubernetes(K8s)入门教程:从零开始掌握容器编排 目录 Kubernetes(K8s)入门教程:从零开始掌握容器编排 1. Kubernetes 简介 1.1 什么是 Kubernetes? 1.2 核心功能 2. 环境搭建与 Minikube 安装 2.1 安装 Minikube 安装步骤(以 macOS 为例): 安装 kubectl(Kub…...