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

C++寻位映射的奇幻密码:哈希

文章目录

  • 1.什么是哈希?
  • 2.哈希的常见实现方法
    • 2.1 直接定址法
    • 2.2 除留余数法
  • 3.哈希冲突
  • 4.哈希冲突的解决
    • 4.1 闭散列
      • 4.1.1 线性探测
        • 4.1.1.1 哈希表的基本数据结构
        • 4.1.1.2 哈希表的key转换
        • 4.1.1.3 哈希表的插入
        • 4.1.1.4 哈希表的查找
        • 4.1.1.5 哈希表的删除
      • 4.1.2 二次探测
      • 4.1.3 线性探测和二次探测对比
    • 4.2 开散列
      • 4.2.1 哈希桶
        • 4.2.1.1 哈希表的基本数据结构
        • 4.2.1.2 哈希表的插入
        • 4.2.1.3 哈希表的查找
        • 4.2.1.4 哈希表的删除
    • 4.3 开散列与闭散列比较
  • 希望读者们多多三连支持
  • 小编会继续更新
  • 你们的鼓励就是我前进的动力!

哈希,用于将任意大小的数据映射为固定长度的数值(哈希值),这个过程通过哈希函数实现,其核心目标是高效地存储、查找和验证数据

1.什么是哈希?

在这里插入图片描述

在学哈希之前,我们对于数据的查找通常是建立于顺序表,树形结构的基础上进行的查找,但是随着数据量越来越庞大,数据的随机性和容量越发严峻

理想的搜索方法: 可以不经过任何比较,一次直接从表中得到要搜索的元素
如果构造一种存储结构,通过某种函数( hashFunc )使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素

因此就在此基础上发展出了一种平均时间复杂度几乎为 O(1) 的数据查找方式,哈希,也称为散列

2.哈希的常见实现方法

2.1 直接定址法

在这里插入图片描述

对于一段相对集中的数据段,就可以使用直接定址法,这里最大的数是 30,最小的数是15,创建一个大小为 15 的数组,将所有值映射到数组上

优点: 简单、均匀
缺点: 需要事先知道关键字的分布情况
使用场景: 适合查找比较小且连续的情况,数据太分散就不适合了,开的数组会太大,造成空间浪费

2.2 除留余数法

在这里插入图片描述

除留余数法是一种通过固定的哈希函数计算方式将数据放入哈希表的常用方法,设散列表中允许的地址数为 m,取一个不大于 m,但最接近或者等于 m 的质数 p 作为除数,按照哈希函数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址

3.哈希冲突

简单来说,通过除留余数法,将每个进来的值除以哈希表的大小得到的余数,必定是在所开哈希表的容器大小范围内的,但是有可能不同的 key 会除出相同的余数,造成同一位置的冲突,该种现象称为哈希冲突哈希碰撞

4.哈希冲突的解决

4.1 闭散列

也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有
空位置,那么可以把 key 存放到冲突位置中的“下一个” 空位置中去。那如何寻找下一个空位置呢?

4.1.1 线性探测

下面将通过对借助哈希表的实现解析线性探测相关的知识:

4.1.1.1 哈希表的基本数据结构
enum STATE
{EXIST,EMPTY,DELETE
};template<class K, class V>
struct HashData
{pair<K, V> _kv;STATE _state = EMPTY;
};template<class K, class V, class HashFunc = DefaultHashFunc<K>>
class HashTable
{
publicHashTable(){_table.resize(10);}private:vector<HashData<K, V>> _table;size_t _n = 0; // 存储有效数据的个数
};

设置 _kv 存储实际的键值对数据,_state 跟踪该位置的状态

  • EXIST 表示位置已被占用(存在有效元素)
  • EMPTY 表示位置为空(从未被使用)
  • DELETE 表示位置已删除(曾被占用,现已删除)

为什么要用状态来表示呢?

因为用状态表示是最清晰直接的,有人说用零来表示已经删除的值不就好了,但是万一本身存储的值就是零呢?总而言之用状态表示是最方便的

4.1.1.2 哈希表的key转换
template<class K>
struct DefaultHashFunc
{size_t operator()(const K& key){return (size_t)key;}
};template<>
struct DefaultHashFunc<string>
{size_t operator()(const string& str){// BKDRsize_t hash = 0;for (auto ch : str){hash *= 131;hash += ch;}return hash;}
};

除留余数法一般是对整数进行操作,但是我们并不能保证 key 一定是整数,有人说直接强转不就好了,但是你能保证强转的数据一定是对的吗?可能是 double,也有可能是string,因此最好的方法是利用我们之前常用的仿函数进行统一操作

整数小数等就走默认的 DefaultHashFunc 类,当 keystring 类型的时候,就走特化的版本 DefaultHashFunc<string>,这里特化是为了统一性,不然你再造一个仿函数就太麻烦了

template<class K, class V, class HashFunc = DefaultHashFunc<K>>

将仿函数设为默认类型,这样子在创建例如 HashTable<string, string> dict 的哈希表的时候就不用显式写仿函数的类型

🔥值得注意的是: 这里的 string 特化版本的仿函数,进行了一些 BKDR 数学上的处理,假设有 "abc""bca" 两个字符串,这两个字符串其实是不一样的数据,如果没有进行 hash *= 131 的数据处理,那么这两个字符串的加和就是一样的,那么使用除留余数法的时候就会发生哈希冲突

具体分析可以看博客园里的大佬的分析:

传送门:字符串Hash函数对比

4.1.1.3 哈希表的插入
bool Insert(const pair<K, V>& kv)
{// 扩容//if ((double)_n / (double)_table.size() >= 0.7)if (_n * 10 / _table.size() >= 7){size_t newSize = _table.size() * 2;// 遍历旧表,重新映射到新表HashTable<K, V, HashFunc> newHT;newHT._table.resize(newSize);// 遍历旧表的数据插入到新表即可for (size_t i = 0; i < _table.size(); i++){if (_table[i]._state == EXIST){newHT.Insert(_table[i]._kv);}}_table.swap(newHT._table);}// 线性探测HashFunc hf;size_t hashi = hf(kv.first) % _table.size();while (_table[hashi]._state == EXIST){++hashi;hashi %= _table.size();}_table[hashi]._kv = kv;_table[hashi]._state = EXIST;++_n;return true;
}

这里的插入,解决哈希冲突的方式利用的是线性探测的方式:

先对哈希函数计算值所带入的 key 进行处理,转换为合理的计算值,如果计算得出的位置为 EXIST,就依次往后探测,直到找到空位置为止,然后插入即可

那么哈希表满了之后的扩容是怎么一回事呢?

在这里插入图片描述

我们要知道判断一个哈希表是否应该开始扩容的标准是负载因子,通过 size / capacity 判断哈希表的填充程度,我们这里设置为 0.7 即扩容

既然扩容了,之前的数据就必须重新计算位置放入哈希表,不然关系就全乱了,或许会有人想为什么不直接新创建一个数组来放?而是创建一个新对象 HashTable<K, V, HashFunc> newHT,再来创建新哈希表,这是因为在对象里操作可以使用插入等便捷操作,使得新哈希表的创建更方便

🔥值得注意的是:

  • 计算位置时除 size,而不是 capacity,因为 size 直接反映了数组的有效长度, capacity 只是为创建更大的数组做准备的,[0, table_size-1] 是索引的合法范围
  • hashi %= _table.size() 是为了避免超出数组有效索引范围,只要大于 size 就会被除余回到数组第一个位置
  • 有人担心扩容会影响搜索效率,其实影响并不是很大,每次扩容都为之前的两倍,会比之前大很多,也就碰上扩容那一次效率不太高,整体来讲影响是不大的
4.1.1.4 哈希表的查找
HashData<const K, V>* Find(const K& key)
{// 线性探测HashFunc hf;size_t hashi = hf(key) % _table.size();while (_table[hashi]._state != EMPTY){if (_table[hashi]._state == EXIST&& _table[hashi]._kv.first == key){return (HashData<const K, V>*) & _table[hashi];}++hashi;hashi %= _table.size();}return nullptr;
}

循环条件为 _table[hashi]._state != EMPTY 是因为在插入的时候为空就必定插入,那么查找的过程中在找到新的空之前必定能找到想要的值(如果正确插入的话),if条件还必须加入 _table[hashi]._state == EXIST 是因为避免查找到的是已删除的值

🔥值得注意的是: 返回的是 HashData<const K, V>*,而不是 HashData< K, V>*,防止 key 被错误修改

4.1.1.5 哈希表的删除
bool Erase(const K& key)
{HashData<const K, V>* ret = Find(key);if (ret){ret->_state = DELETE;--_n;return true;}return false;
}

删除可以说是我们学的那么多个结构里,比插入简单的了,直接删除修改状态即可

4.1.2 二次探测

二次探测的位置计算基于平方序列探测的,下面将给出详细的计算步骤:

  1. 核心计算公式

给定初始哈希位置 h₀ 和探测次数 i,下一个探测位置为:

h(i) = (h₀ +) % table_size
  • h₀:初始哈希值(例如 hash(key) % table_size
  • i:探测次数,从 1 开始递增
  • table_size:哈希表的大小(必须为素数,否则可能无法覆盖所有槽位)
  1. 计算步骤示例

假设哈希表大小 table_size = 7(素数),初始哈希位置 h₀ = 3,插入时发生冲突,则二次探测的位置序列为:

探测次数 i计算公式结果 h(i)
1(3 + 1²) % 74
2(3 + 2²) % 70
3(3 + 3²) % 75
4(3 + 4²) % 72
5(3 + 5²) % 76
6(3 + 6²) % 71

序列: 3405261,覆盖所有 7 个槽位

  1. 为什么表大小必须是素数?
    table_size 为合数,可能无法覆盖所有槽位。例如,当 table_size = 4(合数)时:
探测次数 i计算公式结果 h(i)
1(h₀ + 1²) % 4h₀ + 1
2(h₀ + 2²) % 4h₀
3(h₀ + 3²) % 4h₀ + 1

序列: h₀h₀+1h₀h₀+1,只能访问 2 个槽位,导致死循环

  1. 代码实现示例
bool Insert(const pair<K, V>& kv)
{// 扩容逻辑(略)HashFunc hf;size_t h0 = hf(kv.first) % _table.size();// 二次探测for (size_t i = 1; i < _table.size(); ++i) {size_t hashi = (h0 + i * i) % _table.size();if (_table[hashi]._state != EXIST) {_table[hashi]._kv = kv;_table[hashi]._state = EXIST;++_n;return true;}}return false; // 表满(实际不会触发,因提前扩容)
}

4.1.3 线性探测和二次探测对比

特性线性探测二次探测
探测序列h₀, h₀+1, h₀+2, ...h₀, h₀+1, h₀+4, h₀+9, ...
聚集问题严重(主聚集)较轻(二次聚集)
空间利用率低(易导致连续槽位被占用)高(更均匀分布)
表满检测遍历全量槽位即可检测需遍历约一半槽位

4.2 开散列

4.2.1 哈希桶

在这里插入图片描述

从上图可以看出,开散列中每个桶中放的都是发生哈希冲突的元素

闭散列最大的缺陷就是空间利用率比较低,这也是哈希的缺陷,那么有没有办法不把数据只局限在数组里,有的兄弟有的,可以使用拉链法,也叫哈希桶,将数据以单链表的形式挂起来

4.2.1.1 哈希表的基本数据结构
template<class K, class V>
struct HashNode
{pair<K, V> _kv;HashNode<K, V>* _next;HashNode(const pair<K, V>& _kv):_kv(kv), _next(nullptr){}
};template<class K, class V, class HashFunc = DefaultHashFunc<K>>
class HashTable
{typedef HashNode<K, V> Node;
public:HashTable(){_table.resize(10, nullptr);}~HashTable(){for (size_t i = 0; i < _table.size(); i++){Node* cur = _table[i];while (cur){Node* next = cur->_next;delete cur;cur = next;}_table[i] = nullptr;}}
private:vector<Node*> _table; // 指针数组size_t _n = 0; // 存储了多少个有效数据
};

vector<Node*> 或者 vector<list> 都是可以的,节点都是指针需要释放,析构函数需要自己实现

4.2.1.2 哈希表的插入
bool Insert(const pair<K, V>& kv)
{if (Find(kv.first)){return false;}HashFunc hf;// 负载因子到1就扩容if (_n == _table.size()){size_t newSize = _table.size() * 2;vector<Node*> newTable;newTable.resize(newSize, nullptr);// 遍历旧表,顺手牵羊,把节点牵下来挂到新表for (size_t i = 0; i < _table.size(); i++){Node* cur = _table[i];while (cur){Node* next = cur->_next;// 头插到新表size_t hashi = hf(cur->_kv.first) % newSize;cur->_next = newTable[hashi];newTable[hashi] = cur;cur = next;}_table[i] = nullptr;}_table.swap(newTable);}size_t hashi = hf(kv.first) % _table.size();// 头插Node* newnode = new Node(kv);newnode->_next = _table[hashi];_table[hashi] = newnode;++_n;return true;
}

由于每个哈希桶可以挂多个数据以节省空间,负载因子可以扩大到 1,平均下来一个桶一个数据

在这里插入图片描述

这里悬挂操作是以如图头插的方式进行的,在扩容时,把原先的桶挂到新表上的时候,由于是头插,原先的单链表会在新表上倒置,但是这不影响查找元素,每条桶的元素还是固定的,只是顺序不一样而已

4.2.1.3 哈希表的查找
Node* Find(const K& key)
{HashFunc hf;size_t hashi = hf(key) % _table.size();Node* cur = _table[hashi];while (cur){if (cur->_kv.first == key){return cur;}cur = cur->_next;}return nullptr;
}

当查找的节点为头节点时,prev为空,

4.2.1.4 哈希表的删除
bool Erase(const K& key)
{HashFunc hf;size_t hashi = hf(key) % _table.size();Node* prev = nullptr;Node* cur = _table[hashi];while (cur){if (cur->_kv.first == key){if (prev == nullptr){_table[hashi] = cur->_next;}else{prev->_next = cur->_next;}delete cur;return true;}prev = cur;cur = cur->_next;}return false;
}

当查找的节点为头节点时,prev 为空,直接让下一个节点成为头节点即可
当查找的节点为其他节点时,让前一个节点和下一个节点链接

记得释放删除的节点

4.3 开散列与闭散列比较

应用链地址法处理溢出,需要增设链接指针,似乎增加了存储开销

事实上: 由于开放地址法必须保持大量的空闲空间以确保搜索效率,如二次探查法要求装载因子 a <= 0.7,而表项所占空间又比指针大的多,所以使用链地址法反而比开地址法节省存储空间


希望读者们多多三连支持

小编会继续更新

你们的鼓励就是我前进的动力!

请添加图片描述

相关文章:

C++寻位映射的奇幻密码:哈希

文章目录 1.什么是哈希&#xff1f;2.哈希的常见实现方法2.1 直接定址法2.2 除留余数法 3.哈希冲突4.哈希冲突的解决4.1 闭散列4.1.1 线性探测4.1.1.1 哈希表的基本数据结构4.1.1.2 哈希表的key转换4.1.1.3 哈希表的插入4.1.1.4 哈希表的查找4.1.1.5 哈希表的删除 4.1.2 二次探…...

Spring Boot 集成 druid,实现 SQL 监控

文章目录 背景Druid 简介监控统计 StateFilter其它 Filter详细步骤第 1 步:添加依赖第 2 步:添加数据源配置【通用部分】第 3 步:添加监控配置【关键部分】第 3 步:访问 druid 页面参考背景 😂 在 Code Review 过程中发现,经常有开发会忘记给表加索引。这就导致,生产运…...

从零开始学习three.js(21):一文详解three.js中的矩阵Matrix和向量Vector

一、三维世界的数学基石 在Three.js的三维世界里&#xff0c;所有视觉效果的实现都建立在严密的数学基础之上。其中向量&#xff08;Vector&#xff09; 和矩阵&#xff08;Matrix&#xff09; 是最核心的数学工具&#xff0c;它们就像构建数字宇宙的原子与分子&#xff0c;支…...

无需笔墨之功,锦绣SQL自成桥——QuickAPI古法炼数据秘术

楔子&#xff1a;锦绣SQL&#xff0c;化身为桥 昔有匠人苦修代码之术&#xff0c;欲通数据库与前朝之界&#xff0c;然笔耕不辍&#xff0c;耗时弥久。今有秘器名曰QuickAPI&#xff0c;但凭三寸SQL文&#xff0c;顷刻间筑起数据虹桥。纵使不谙代码之道者&#xff0c;亦可挥毫…...

模块与包的导入

一、导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库 类别典型库解决的问题学习门槛基础工具os、sys、json操作系统交互、序列化数据&#xff08;如读写 JSON 文件&#xff09;低科学计算n…...

智能文档抽取技术可以应用于哪些场景?

近日&#xff0c;合合信息编撰并发布了《2025智能文档技术与应用白皮书》。该书中不仅深度解析技术原理与创新突破&#xff0c;更聚焦金融、法律、制造等行业的典型场景&#xff0c;结合典型案例揭示技术如何赋能合同智能审查、票据自动化处理、知识库构建等业务场景&#xff0…...

实践促成长:成都理工大学华清远见成都中心实训

2025年5月, 华清远见成都中心迎来了成都理工大学大数据管理与应用专业23级以及电子商务22级的同学们&#xff0c;以实践为导向、以提升能力为目标的校企合作实训活动在此展开&#xff0c;为同学们开启了一段充满挑战与收获的学习之旅。 华清远见成都中心为两个专业的同学们量身…...

北京本地 SEO 推广:从技术成本到效果转化的深度拆解

在数字化营销的浪潮中&#xff0c;北京本地企业对 SEO 推广的需求日益增长。然而&#xff0c;SEO 推广服务的价格参差不齐&#xff0c;效果也难以预估。本文将从技术实现、成本构成等角度&#xff0c;深入剖析北京本地 SEO 推广服务的价格与效果&#xff0c;baidu0048为企业选择…...

JavaScript 中的五种继承方式进行深入对比

文章目录 前言JavaScript 五种继承方式对比原型链继承构造函数继承组合继承寄生组合继承ES6 class extends 继承五种继承方式对比表前言 对 JavaScript 中的五种继承方式进行深入对比:原型链继承、构造函数继承、组合继承、寄生组合继承、以及 ES6 的 class extends。 内容将…...

CAU数据库class2 SQL语言

​ SQL分类 DDL 数据库操作 查询数据库&#xff1a; 查询所有数据库 show databases; 查询名字里有t的数据库 show databases like %t%;查询名字以t为结尾的数据库 show databases like %t;查看数据库name是怎么创建出来的 show create database name;创建数据库 创建…...

软考教材重点内容 信息安全工程师 25章 移动安全 26章 大数据安全

第 25 章移动应用安全需求分析与安全保护工程 移动互联网技术基本组成如图 25-1 所示&#xff0c;包括三个部分:一是移动应用&#xff0c;简称 App;二是通信网络&#xff0c;包括无线网络、移动通信网络及互联网;三是应用服务端&#xff0c;由相关的服务器构成&#xff0c;负责…...

有关Groutine无限创建的分析

有关Groutine无限创建的分析 文章目录 有关Groutine无限创建的分析从操作系统分析进程、线程、协程的区别进程内存线程内存执行单元 cpu切换成本协程切换成本线程切换成本内存占用 Go程是否可以无限创建不控制go程创建引发的问题简单方式控制go程创建channel有buffersync.WaitG…...

FANUC发那科焊接机器人智能气阀

在现代工业生产中&#xff0c;焊接技术的发展日新月异&#xff0c;其中发那科&#xff08;FANUC&#xff09;焊接机器人以其高精度和稳定性受到了广泛应用。而智能气阀作为发那科焊接机器人的重要组成部分&#xff0c;在提升焊接效率和质量方面发挥着不可忽视的作用。 工作原理…...

软件架构风格系列(7):闭环控制架构

文章目录 引言一、闭环控制架构&#xff1a;让系统学会“自我调节”的魔法&#xff08;一&#xff09;从温控系统理解核心原理&#xff08;二&#xff09;核心组件解析 二、架构设计图&#xff1a;闭环控制的“四大核心环节”三、Java实战&#xff1a;手写一个智能温控系统&…...

Java合并两个列表到目标列表,并且进行排序

可以通过使用addAll()方法将两个列表合并到目标列表中。以下是实现代码&#xff1a; java 复制 下载 List<LedgerRecord> rkRecordList warehouseMapper.selectLedgerRkRecordByMaterialNo(materialNo); List<LedgerRecord> ckRecordList warehouseMapper.se…...

关于在Unity项目中使用Post Processing插件打包到web端出现的问题

关于在Unity项目中使用Post Processing插件打包到web端出现的问题 解决方法&#xff1a;是不激活摄像机上的Post Processing有关组件&#xff0c;拉低场景中的Directional Light平行光的强度进行web端打包。 &#xff08;烘焙灯光时是可以激活。&#xff09; web端支持这个Pos…...

智象科技:自动化模块驱动IT运维效能升级

智象自动化模块概览 智象科技的一站式IT运维平台中的自动化模块&#xff0c;是企业数字化转型的强大助推器。该模块集成了IT运维作业的流程编排、脚本编排&#xff0c;各类运维资源配置项目和脚本的合规巡检&#xff0c;以及基础信息、监控指标的巡检配置等自动化管理&#xff…...

GPU状态监控

GPU 状态监控 对比&#xff1a; GPU项目名称项目名称单机多 GPUGPU状态监控以时间为横轴展示GPU被占用的动态过程&#xff0c;但不显示具体时间单机多 GPUGPU 实时监控服务多卡GPU统一展示&#xff0c;数据简洁清晰多机多 GPU服务器集群监控面板可以同时监控多个服务器上的GPU…...

VS2017编译openssl3.0.8

openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证书验证、P…...

构建高效移动端网页调试流程:以 WebDebugX 为核心的工具、技巧与实战经验

现代前端开发早已不仅仅局限于桌面浏览器。随着 Hybrid 应用、小程序、移动 Web 的广泛应用&#xff0c;开发者日常面临的一个关键挑战是&#xff1a;如何在移动设备上快速定位并解决问题&#xff1f; 这不再是“打开 DevTools 查查 Console”的问题&#xff0c;而是一个关于设…...

前缀和——和为K的子数组

作者感觉本题稍稍有点难度&#xff0c;看了题解也思考了有一会TWT 显然&#xff0c;暴力我们是不可取的&#xff0c;但这里我们可以采取一种新的遍历数组形式&#xff0c;从后向前&#xff0c;也就是以i位置为结尾的所有子数组&#xff0c;这个子数组只统计i位置之前的。 然后…...

web常见的攻击方式

web攻击&#xff08;webAttack&#xff09;是针对用户上网行为或网站服务器等设备进行攻击的行为&#xff0c;如植入恶意代码、修改网站权限、获取网站用户隐私等等&#xff0c;即使是代码在的很小的bug也有可能导致隐私信息被泄漏&#xff0c;站点安全就是保护站点不受未授权的…...

为什么wifi有信号却连接不上?

WiFi有信号&#xff0c;无法连接WiFi网络的可能原因及解决方法&#xff1a; 1.长时间使用路由器&#xff0c;路由器可能会出现假死现象。重启无线路由器即可。 2.认证类型不合适。尝试更改路由器的认证类型&#xff0c;选择安全的 “WPA2-PSK” 类型模式要好&#xff0c;下面…...

CVE-2015-4553 Dedecms远程写文件

CVE-2015-4553 Dedecms远程写文件 首页 访问 http://192.168.1.3/install/index.php?step11&insLockfilea&s_langa&install_demo_name…/data/admin/config_update.php这句话会跳转到http://updatenew.dedecms.com/base-v57/dedecms/demodata.a.txt中读取内容写入…...

如何评估开源商城小程序源码的基础防护能力?

在电商行业快速发展的背景下&#xff0c;开源商城已经为更多企业或者开发者的首选方案&#xff0c;不过并不是所有的开源商城源码都能让人放心使用&#xff0c;今天就带大家一起了解下如何评估开源商城小程序源码的基础防护能力&#xff0c;帮助大家更好地筛选安全性高的商城源…...

音视频之H.265/HEVC率失真优化

H.265/HEVC系列文章&#xff1a; 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...

linux安装git

[rootMiWiFi-RC06-srv rpm-gpg]# yum install git 已加载插件&#xff1a;fastestmirror Repository base is listed more than once in the configuration Repository updates is listed more than once in the configuration Repository extras is listed more than once in …...

Node 服务监控及通过钉钉推送告警提醒

背景:需要监控某个服务是否在线,运行是否正常; 实现步骤: 1、需要在项目中内置一个可以监控的健康状态接口,详情可参考之前的文章:使用 PM2 启动node服务,并添加监控接口_node pm2-CSDN博客 2、再添加另外一个进程来监控这个接口是否正常在线,然后通过钉钉推送异常消…...

健康生活指南:从日常细节开启养生之旅

在数字化与快节奏交织的时代&#xff0c;健康危机常潜伏于日常的点滴疏忽中。想要保持良好的身体状态&#xff0c;不妨从这些容易被忽视的生活细节入手&#xff0c;开启科学养生之路。​ 长期伏案工作和沉迷电子设备&#xff0c;让颈椎与腰椎承受巨大压力。调整办公环境&#…...

Node-Red通过Profinet转ModbusTCP采集西门子PLC数据配置案例

一、内容简介 本篇内容主要介绍Node-Red通过node-red-contrib-modbus插件与ModbusTCP设备进行通讯&#xff0c;这里Profinet转ModbusTCP网关作为从站设备&#xff0c;Node-Red作为主站分别从0地址开始读取10个线圈状态和10个保持寄存器&#xff0c;分别用Modbus-Read、Modbus-…...

# YOLOv4:目标检测的全新突破

YOLOv4&#xff1a;目标检测的全新突破 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法一直以其高效的检测速度和出色的性能受到广泛关注。从最初的 YOLOv1 到如今的 YOLOv4&#xff0c;这一系列算法不断进化&#xff0c;为实时目标检测和…...

计算机视觉设计开发工程师学习路线

以下是一条系统化的计算机视觉&#xff08;CV&#xff09;学习路线&#xff0c;从基础到进阶&#xff0c;涵盖理论、工具和实践&#xff0c;适合逐步深入&#xff0c;有需要者记得点赞收藏哦&#xff1a; 相关学习&#xff1a;python深度学习&#xff0c;python代码定制 python…...

CLIP:论文阅读 -- 视觉模型

更多内容&#xff1a;XiaoJ的知识星球 目录 1.CLIP概述2.CLIP的方法2.1. 自然语言监督2.2. 创建足够大的数据集2.3. 选择有效的预训练方法2.4. 选择和缩放模型1&#xff09;CLIP模型选择&#xff1a;2&#xff09;模型缩放 2.5 训练 3.CLIP 核心伪代码3.1. CLIP伪代码3.2. CLIP…...

26、DAPO论文笔记(解耦剪辑与动态采样策略优化,GRPO的改进)

DAPO论文笔记 1、项目背景与目标2、DAPO算法与关键技术3、过长响应奖励塑形&#xff08;Overlong Reward Shaping&#xff09;**一、问题背景&#xff1a;截断惩罚的缺陷****二、解决方案&#xff1a;分层惩罚与软截断策略**1. **过长过滤&#xff1a;屏蔽无效惩罚**2. **软过长…...

【框架安装】win10 配置安装GPU加速的tensorflow和keras教程

本机配置 win10 4090&#xff0c;需要安装最后支持windows GPU加速的最后版本tensorflow2.10 重点安装命令 pip install tensorflow-gpu2.10.0 protobuf3.19.6 numpy1.23.5 pip install keras2.10.0 pip install keras-cv0.3.5 pip install tensorflow-addons0.17.1conda li…...

整合安全能力:观测云进一步强化数据价值

在 2025 年 5 月 13 日的观测云年度发布会上&#xff0c;观测云发布了 GuanceDB 3.0 全新数据引擎。这次更新标志着观测云进一步整合了云端安全能力&#xff0c;帮助用户进一步挖掘数据的价值。 全新底座&#xff1a;GuanceDB 3.0&#xff0c;数据驱动的安全基石 GuanceDB 3.…...

质检LIMS系统检测数据可视化大屏 全流程提效 + 合规安全双保障方案

在质检实验室的数字化转型浪潮中&#xff0c;「数据看得见、问题找得准、决策下得快」成为衡量管理水平的核心标准。然而传统模式下&#xff0c;检测数据分散在设备日志、纸质记录和 Excel 表格中&#xff0c;管理者如同在迷雾中摸索&#xff0c;决策失误率高达 30% 以上。 一、…...

企业销售管理痛点解析与数字化解决方案

在数字化转型浪潮中&#xff0c;传统销售模式正面临多重挑战&#xff1a; ▫️ 数据决策滞后&#xff1a;缺乏实时市场洞察&#xff0c;热销趋势依赖经验预判&#xff0c;战略响应慢半拍 ▫️ 客户管理碎片化&#xff1a;信息散存于纸质记录 / 聊天窗口&#xff0c;跟进细节遗漏…...

关于海光22DC4_2主板获取usb3.0端口信息重复问题的解决方案

需求 使用qt程序实现以下功能&#xff1a;检查主机所有usb端口是否可用&#xff0c;检查方法为&#xff1a;使用同一个3.0u盘&#xff0c;依次插入usb所有的端口&#xff0c;读取以下代码中所写的端口信息 #include <libusb-1.0/libusb.h>//只保留键鼠和u盘的设备 if (…...

GStreamer (三)常⽤插件

常⽤插件 1、Source1.1、filesrc1.2. videotestsrc1.3. v4l2src1.4. rtspsrc和rtspclientsink 2、 Sink2.1. filesink2.2. fakesink2.3. xvimagesink2.4. kmssink2.5. waylandsink2.6. rkximagesink2.7. fpsdisplaysink 3 、视频推流/拉流3.1. 本地推流/拉流3.1.1 USB摄像头3.1…...

Jenkins 使用技巧

1. 通过配置文件更改Jenkins默认端口&#xff08;8080&#xff09;&#xff1f; 这里以macos 为例来说明 Jenkins在macOS上通常通过Homebrew或类似的包管理器运行&#xff0c;这与Linux或Windows相比&#xff0c;使用了不同的配置文件布局。默认Jenkins端口8080在启动配置中是…...

Pichome 任意文件读取漏洞复现(CVE-2025-1743)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前…...

Elasticsearch 深入分析三种分页查询【Elasticsearch 深度分页】

前言&#xff1a; 在前面的 Elasticsearch 系列文章中&#xff0c;分享了 Elasticsearch 的各种查询&#xff0c;分页查询也分享过&#xff0c;本篇将再次对 Elasticsearch 分页查询进行专题分析&#xff0c;“深度分页” 这个名词对于我们来说是一个非常常见的业务场景&#…...

避开封禁陷阱:动态IP在爬虫、跨境电商中的落地实践

​​1. 为什么需要动态IP&#xff1f;​​ 在日常网络操作中&#xff0c;你是否遇到过&#xff1a; ​​爬虫被封​​&#xff1a;频繁请求目标网站&#xff0c;IP被限制访问。​​跨境业务受限​​&#xff1a;某些平台对特定地区的账号有限制。​​数据采集失败​​&#x…...

公网ip是固定的吗?动态ip如何做端口映射?内网ip怎么让外网远程访问?

网络IP地址有内网与公网区分&#xff0c;公网IP同时有固定IP和动态IP之分。很多企业所用的办公网络都是公网ip&#xff0c;下载文件的速度更快&#xff0c;而且平台存储的问题可以让他人看得到&#xff0c;体验度比较好。对于无公网IP环境想要申请公网ip的用户来说&#xff0c;…...

MyBatis入门指南

查询user表中所有数据 创建user表&#xff0c;添加数据导入依赖&#xff0c;创建模块编写MyBatis核心配置文件编写SQL映射文件编写代码 定义P0J0类加载核心配置文件&#xff0c;获取SqlSessionFactory对象获取SqlSession对象&#xff0c;执行SQL语句释放资源 一、创建user表…...

GitHub排名第一的开源ERP项目:Odoo生产计划与执行的功能概述

Odoo生产计划与执行隶属于Odoo MRP与MES的运营管理解决方案。Odoo中生产计划有多种形式&#xff0c;从销售预测到销售运作计划(SOP)开始&#xff0c;到随后的主生产计划、物料需求计划(MRP)、分销需求计划(DRP)、长期生产计划&#xff0c;以及粗能力计划(RCCP)和详细能力计划。…...

使用 OpenCV 实现 ArUco 码识别与坐标轴绘制

&#x1f3af; 使用 OpenCV 实现 ArUco 码识别与坐标轴绘制&#xff08;含Python源码&#xff09; Aruco 是一种广泛用于机器人、增强现实&#xff08;AR&#xff09;和相机标定的方形标记系统。本文将带你一步一步使用 Python OpenCV 实现图像中多个 ArUco 码的检测与坐标轴…...

RAC共享存储扩容

存储工程师扩完共享存储后&#xff0c;DBA做如下操作&#xff1a; 1.主机端识别磁盘 在两个节点扫描磁盘命令 # for i in find /sys/class/scsi_host/host*; do echo - - - > $i/scan; done lsblk 2.比对确定新加的盘的uuid&#xff0c;确保uuid是一致的&#xff0c;别…...

高德地图 MCP,可用 Java SolonMCP 接入(支持 java8, java11, java17, java21)

1、MCP技术概述 1.1 什么是 MCP MCP (Model Control Protocol) 是一种允许大模型与外部工具交互的协议&#xff0c;高德地图基于此协议提供了地图服务能力&#xff0c;使 AI 大模型能够直接调用高德的 LBS。 1.2 两种接入架构对比 高德地图 MCP 提供了两种不同的接入方式&a…...