哈希表的实现01
文章目录
- 哈希表的实现01
- 哈希概念
- 直接定址法
- 哈希冲突
- 负载因子
- 将关键字转换为整数
- 哈希函数
- 除法散列法:
- 乘法散列法(了解)
- 全域散列法(了解)
- 处理哈希冲突(开放定址法)
- 线性探测:
- 二次探测
- 双重散列
- 代码实现:
- 结构定义
- 插入操作
- 查找和删除
- 仿函数转整形
- 结语
很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!!
今天我们进入哈希章节,为封装unordered系列打下坚实基础
作者:٩( ‘ω’ )و260
我的专栏:C++进阶,C++初阶,数据结构初阶,题海探骊,c语言
欢迎点赞,关注!!
哈希表的实现01
哈希概念
哈希(hash)又称散列,是⼀种组织数据的方式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建立⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进行快速查找。
特点:无序+建立映射关系(存取都是用这个映射关系)
直接定址法
使用条件:当数据范围比价集中的时候,可以直接创建一个Hash数组来存放数据。效率非常高。
例题:字符串中第一个唯一字符
这里因为只含有小写字母,所以我们可以直接创建一个大小为26的Hash数组。a映射0,b映射1,以此类推
但是:该方法的缺陷也特别明显,当我的数据过于分散,就会造成大量的空间浪费,比如:我需要映射1和10000,那么1到10000之间的空间是不是都被浪费了呢?
因此:直接定址法只适用于数据集中的时候
哈希冲突
哈希冲突:本质上就是同一个位置可能会映射多个值,也被叫做哈希碰撞
理想情况是找出一个好的哈希函数避免冲突,但是实际场景中,冲突是不可避免的,所以我们尽可能设计出优秀的哈希函数,减少冲突的次数,同时也要去设计出解决冲突的方案。
在一个哈希表中,当哈希冲突越多的时候,哈希表的效率会被直线下降。因为建立的映射关系,哈希表的效率能够达到O(1)。所以,当发生哈希冲突的时候,需要进行处理
负载因子
假设哈希表中已经映射存储了N个值,哈希表的大小为M,那么负载因子=N/M。负载因子越大,哈希冲突的概率越高,空间利用率越高;负载因子越小,哈希冲突的概率越低,空间利用率越低
在库中:当负载因子大于0.7的时候就需要对数组进行扩容,因为负载因子越大,越容易出现哈希冲突,因为被占用的位子更多,所以需要扩容。
总之:哈希表是永远具有空位置的
将关键字转换为整数
我们将key映射到哈希表中,我们常见的方法是对整数进行取模操作,这样就可以得到一个银映射值。
如果不能取模怎么办?如果是string,负数,这些能区取模吗?肯定是不行的,所以,我们需要将将不能取模的使用一定的操作转换为整形。
这里我们需要传递一个仿函数。
只有当我们需要求key的映射的时候,才需要使用到这个仿函数,因为我们是将其转换成整形之后再来求模
转换成整数的时候我们必须保证哈希函数是一样的,这样才能够保证我们在插入的时候映射到的是一个固定的位置,查找的时候映射的也是一个固定的位置。
哈希函数
一个好的哈希函数应该让N个关键字被等概率的均匀的散列分布到哈希表的M个空间中,但是实际中却很难做到,但是我们要尽量往这个方向去考量设计
除法散列法:
顾名思义,假设哈希表的大小为M,那么通过key除以M的余数作为映射位置的下标,也就是哈希函数为:h(key) = key % M
使用除法散列法时,需要避免M为某些值,比如:2的k次幂,10的k次幂
因为如果是2的k次幂的话,一个int取模2k,这样就会造成该int二进制形式中只有k个位被参与比较了。前面的位没有参与比较。
说明:为什么只有k个位的参与比较?
因为我取模,是2k的倍数都会被取模为0,只有小于2k的数字才会被保留
我们来举例一下:
{63,31}看起来没有关联的值,如果M是16,也就是24 ,那么计算出的哈希值都是15,因为63的二进制后8位是00111111,31的二进制后8位是00011111。如果是10x ,就更明显了,保留的都是10进值的后x位,如:{112,12312},如果M是100,也就是 ,那么计算出的哈希值都是12
以上的情况就会造成哈希冲突。
我们这里可以来扩展学习一下:在Java中,其实M是2的倍数。
这样通过可以不用取模,就直接进行位运算,而且前面我们已经提到过,如果是使用2的倍数在负载因子大于等于0.7的时候其实是更好扩容的。因为大小乘一个二倍就行。
例如:此时M是216,int%M得到后16位,随后我们将int右移16位,然后再来取模,目的:是为了让int中的所有位都能够来参与运算
那么我们c++中是如何进行处理的呢?
如果我们来二倍扩,当前M是质数,就一定能够保证2*M是质数吗?肯定是不能的,所以库中直接实现了一个素数表:
inline unsigned long __stl_next_prime(unsigned long n)
{// Note: assumes long is at least 32 bits.static const int __stl_num_primes = 28;static const unsigned long __stl_prime_list[__stl_num_primes] ={53,97,193,389,769,1543,3079,6151,12289, 24593,49157,98317,196613, 393241, 786433,1572869, 3145739, 6291469, 12582917, 25165843,50331653, 100663319, 201326611, 402653189, 805306457,1610612741, 3221225473, 4294967291};//不可能到达最后一个素数,当到达最后一个数时,内存都崩了const unsigned long* first = __stl_prime_list;const unsigned long* last = __stl_prime_list + __stl_num_primes;const unsigned long* pos = lower_bound(first, last, n);//>=return pos == last ? *(last - 1) : *pos;
}
当到达最后一个数时,应该说不可能会到达最后一个素数,因为到达最后一个素数,内存都已经爆了,程序肯定崩溃。
lower_bound取得是>=的数值
乘法散列法(了解)
乘法散列法对哈希表大小M没有要求,他的大体思路第⼀步:用关键字K乘上常数A(0<A<1),并抽取出kA的小数部分。第二步:后再用M乘以kA的小数部分,再向下取整
这里我们的A取得是黄金分割点:A = ( 根号5 -1)/2 = 0.6180339887…
举例:假设M为1024,key为1234A=0.6180339887,Akey=762.6539420558,取小数部分为0.6539420558,M×((A×key)%1.0)=0.65394205581024=669.6366651392,那么h(1234)=669。
全域散列法(了解)
因为我们是设定了一个散列函数来映射key,所以,如果有人知道了这个key,就能够设置一组值来构造哈希冲突,为了解决这种情况,就只能够使用全域散列法来映射key。
全域散列法的目的主要给我们的散列函数增加随机性。
P需要选⼀个足够大的质数,a可以随机选[1,P-1]之间的任意整数,b可以随机选[0,P-1]之间的任意整数,这些函数构成了⼀个P*(P-1)种可能性的全域散列函数组:h (key) =((a × key + b)%P )%M
细节:在插入和查找的情况下,必须是同一个散列函数,否则映射关系会被修改,就可能导致找不到了
假设P=17,M=6,a=3,b=4,则h (8) =34((3 × 8 + 4)%17)%6 = 5
但是:我们一般还是倾向于使用除法散列法作为哈希函数。
处理哈希冲突(开放定址法)
我们前面提到,在现实生活中,肯定会出现哈希冲突。
在开放定址法中所有的元素都放到哈希表里,当⼀个关键字key用哈希函数计算出的位置冲突了,则按照某种规则找到⼀个没有存储数据的位置进行存储,开放定址法中负载因子一定是小于的。这里的规则有三种:线性探测、二次探测、双重探测。
线性探测:
1:从发生冲突的位置开始,依次线性向后探测,直到寻找到下一个没有存储数据的位置为止,如果走到哈希表尾,则回绕到哈希表头的位置。
2:h(key) = hash0 = key % M,hash0位置冲突了,则线性探测公式为:
hc(key,i) = hashi = (hash0 + i) % M, i = {1, 2, 3, …, M − 1},因为负载因子小于1,则最多探测M-1次,一定能找到一个存储key的位置
我们来画一个图演示一下:
其实线性探测仍有不足,比如,a占了b的位置,当数据需要放到b上时,b又占了c的位置,当数据需要放到c上时,c又占了d的位置,以此类推。这样大量的哈希冲突就会导致效率直线下降。
这种现象被叫做:群集/堆积
二次探测
二次探测可以改善群集/堆积的问题。
1:从发生冲突的位置开始,依次左右按⼆次方跳跃式探测,直到寻找到下一个没有存储数据的位置为止,如果往右走到哈希表尾,则回绕到哈希表头的位置;如果往左走到哈希表头,则回绕到哈希表尾的位置。
2:h(key) = hash0 = key % M,hash0位置冲突了,则⼆次探测公式为:
hc(key,i) = hashi = (hash0 ± i2 ) % M, i ={1, 2, 3, …, M/2}(其实就是给i加了一个偏移量的平方)
3:⼆次探测当hashi = (hash0 − i2 )%M时,当hashi<0时,需要hashi+=M,否则会造成越界访问
举例:
双重散列
上述线性探测,二次探测还是有迹可循,双重散列就是将数据分散的更散,更不会那么集中。
1:h1 (key) =hash0 = key % M,hash0位置冲突了,则双重探测公式为:
hc(key,i) = hashi = (hash0 + i ∗ h2 (key)) % M, i ={1, 2, 3, …, M},这里有两个哈希函数
2:要求h (key) <M且M和h2 (key)互为质数,这样不至于在几个位置中来回跳,即当哈希冲突时,所有位置都有可能来存放这个冲突的数据。
这里我们就不再举例了
结论:其实这三种方法都有不足,因为当哈希冲突的时候,我们都是去抢别人的位置,那么比尔呢该放这个位置的时候,又会去抢别人的位置,这样就会造成一种恶性循环。
下片文章我们会详细讲解下一种方案。
代码实现:
接下来我们来进行代码实现:
结构定义
enum State
{//设置状态是为了查找的时候EMPTY,EXIST,DELETE
}template<class K,class V>
struct HashData
{pair<K,V> _kv;State _state = EMPTY;//标记一下状态
}template<class K,class V,class Hash>//传递一个仿函数,来计算整形,包含本身是整形的或者是转为整形的
class HashTable
{
private:vector<HashData<K,V>> _tables;
}
插入操作
插入,我们直接来插入一个pair,不用实现泛型。
插入思路:我们先需要对里面存储的数据进行去重,再来看负载因子的情况,看是否需要扩容,计算key的映射,是否造成哈希冲突,是,进行线性探测,不是,直接将数据进行插入即可。来看代码:
bool Insert(const pair<K,V>& kv)
{if(_tables.Find(kv.first)) return false;//进行去重操作if((double)n/(double)_tables.size()>=0.7)//进行扩容,使用提前已经准备好的素数表,也是成二倍的趋势的{HashTable<K,V,Hash> newht(__stl_next_prime(_tables.size()+1));for(int i=0;i<newht.size();i++){if(_talbes[i]._state == EXIST){newht.Insert(_table[i]._kv);//直接复用现有的Insert逻辑}}_tables.swap(newht._table);//类似于赋值重载的现代写法return true;}Hash hs;int hash0=hs(key)%_tables.size();int hashi=hash0;int i=1;//看是否需要进行线性探测,只要是空或者删除就能够进行数据覆盖while(_tables[hashi]._state == EXIST){hashi+=i;i++;hash%=_tables.size();}//找到空的位置,建立映射关系_tables[hashi]._kv = kv;_tables[hashi]._state = EXIST;++_n;
}
总结:哈希表中的扩容的代价很大,因为扩容之后需要重新建立映射关系,所以所有存在的数据都需要进行重新映射。
查找和删除
细节:查找和删除使用的形参都是key,无论是kv型,还是k型
查找思路:需要先计算key的映射,如果造成了哈希冲突,执行线性探测,找到了,返回地址,反之nullptr
HashData<K,V>* Find(const K&key)
{Hash hs;int hash0=hs(key)%_tables.size();int hashi=hash0;int i=1;while(_table[hashi] !=EMPTY)//只要状态是空的话,才停止循环{if(_tables[hashi]._state == EXIST && _tables[hashi]._kv.first == key){//因为删除的时候我只是修改一下状态,不是真的将数据给删除了。所以需要判断一下状态return &_tables[hashi];}hashi+=i;i++;hash%=_tables.size();}return nullptr;//没找到
}
删除思路:这里我们直接复用查找的思路即可:
bool Erase(const K& key)
{HashData<K,V>* ret = _tables.Find(key);if(ret){ret->_state = DELETE;--_n;return true;}else{return false;}
}
仿函数转整形
在现实生活中,key大多数情况都是string,所以我们需要设置仿函数来进行对string的映射,一般的方法是对string中的所有字符ascll码进行相加即可。
来看代码:
struct StringHashFunc
{size_t operator()(string& s){size_t hash = 0;for(auto& e:s){hash += e;}return hash;}
}
如果说我们给的字符串是"abc"和"cba",此时ascll码之和是一样,可以尝试如下解决方案。
我们根据顺序迭代器遍历的时候我们来乘一个131,这样就能够体现出顺序差别。
struct StringHashFunc
{size_t operator()(string& s){size_t hash = 0;for(auto& e:s){hash += e;hash *= 131;}return hash;}
}
个人新得总结:
1:写仿函数这种东西,operator()中的this最好都添加上const修饰
2:哈希冲突,哈希探测越多,效率越低,让更多的bit为参数运算,能够降低哈希冲突的概率
3:二次,双重探测的目的都是将数据分散
4:%的时候一定是size(),因为size才是有效数据个数,因为后面需要使用到[],所以只有在size的长度中才能够使用[],reverse操作的是capacity()。
5:有符号%无符号,有符号会被隐式类型转化为无符号
6:如果不能够取模,需要配对一个对应的仿函数,而且也要做到区别,可以进行每个元素*131来进行区别
7:在进行整形转换的运算时,我们一般会选取能够进行转整形操作的数据,例如:字符串或负数,其他结构体,例如Date是不支持的,库中也不支持。
结语
感谢大家阅读我的博客,不足之处欢迎指正,感谢大家的支持
逆水行舟,楫摧而志愈坚;破茧成蝶,翼湿而心更炽!!加油!!
相关文章:
哈希表的实现01
文章目录 哈希表的实现01哈希概念直接定址法哈希冲突负载因子将关键字转换为整数 哈希函数除法散列法:乘法散列法(了解)全域散列法(了解) 处理哈希冲突(开放定址法)线性探测:二次探测…...
学习日志06 java
还有四天要去比赛了,能赢吗?逼自己一把。。。!!加油! 1 对比一下java重写还是不重写tostring的区别 1. 不重写 toString() 的情况 java class Point {private int x;private int y;public Point(int x, int y) {th…...
spring中的@MapperScan注解详解
一、核心功能与作用 MapperScan是Spring与MyBatis框架集成时用于批量扫描Mapper接口的核心注解,其主要功能包括: 自动注册Mapper接口 通过指定包路径,Spring会自动扫描该路径下的所有Mapper接口,并将其注册为Spring Bean&#x…...
PYTHON训练营DAY25
BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐:捕获所有类型的异常&…...
视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解
引言 在数字图像与视频压缩领域,离散余弦变换(Discrete Cosine Transform, DCT)凭借其卓越的能量集中特性,成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域,分离出DC系数(直流分量&…...
YOLO v1:目标检测领域的革命性突破
引言 在计算机视觉领域,目标检测一直是一个核心任务,它不仅要识别图像中的物体类别,还要确定物体的精确位置。传统目标检测方法如R-CNN系列虽然准确率高,但计算复杂度高、速度慢。2016年,Joseph Redmon等人提出的YOLO…...
AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)
目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型_生成对话文案 2.3 代码_字幕切割 2.4 画板_对话背景 2.5 循环_对话语音01 2.5.1 选择器_2 2.5.2 语音合成02 2.5.3 语音合成03 2.5.4 变量聚合_1 2.5.5 视频合成01 2.6 循环_3 2.6.1 选择器_3 …...
HVV蓝队实战面试题
HVV蓝队实战,防守筹备之“部署蜜罐捕获横向扫描行为”。 蜜罐通过模拟内网脆弱服务(如SMB、SSH、数据库端口),诱捕攻击者突破边界后的横向探测行为。 通过监测高频端口扫描、非常规协议请求及非授权IP段遍历,结合多源…...
正则表达式(二)-高级应用_谨慎使用
没事建议别瞎用正则表达式,能让后端处理好的数据,尽量后端处理好,减少前端对数据的处理,保证数据原始的完整性,减少前端耗能。(其实就是懒╮(╯▽╰)╭) 1. 分组捕获 分组捕获用于提取匹配的子字符串,使用 () 定义分组。 示例:提取日期中的年、月、日 (\d{4})-(\d{2…...
在K8S集群中部署EFK日志收集
目录 引言环境准备安装自定义资源部署ElasticsearchMaster 节点与 Data 节点的区别生产优化建议安装好以后测试ES是否正常部署Fluentd测试filebeat是否正常推送日志部署Kibana获取账号密码,账号是:elastic集群测试 引言 系统版本为 Centos7.9内核版本为…...
解决常见数据库问题:保障数据安全与稳定的全方位指南
本文结合行业最佳实践与前沿技术,系统性总结数据库运维中的核心问题与解决方案,助力开发者构建高可靠、高性能的数据服务) 一、性能优化:从SQL到架构的全面调优 性能问题是数据库运维中最常见的挑战,直接影响用户体验…...
武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛
武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛 2025年5月9日至11日,第五届中国膜计算论坛(CWMC 2025)在成都信息工程大学隆重召开。会议由 国际膜计算学会(IMCS) 主办,汇聚了来…...
Femap许可硬件绑定
在电磁仿真领域,Femap软件因其卓越的性能和广泛的应用场景而备受用户青睐。为了确保软件的安全与稳定运行,Femap提供了许可硬件绑定的功能。本文将详细介绍Femap许可硬件绑定的概念和优势,帮助您了解并充分利用这一功能,确保软件在…...
构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
一、建造者模式的本质与核心价值 在面向对象的软件设计中,创建复杂对象一直是一个需要精心处理的问题。当一个对象的构建需要多个步骤,并且这些步骤具有不同的组合方式时,传统的构造函数方式会显得力不从心。建造者模式(Builder …...
vim启动的时候,执行gg
在 Vim 编辑器中,gg 命令是一个非常有用的命令,它可以将光标快速移动到当前窗口的顶部(即第一行)。如果你想在 Vim 启动时自动执行 gg 命令,有几种方法可以实现这一点: 方法 1:使用 Vim 的启动…...
【SSL部署与优化】HTTP/2与HTTPS的协同效应
HTTP/2与HTTPS的协同效应:为何HTTP/2强制要求TLS 1.2? HTTP/2是HTTP协议的现代升级版,旨在通过多路复用、头部压缩等技术提升性能。然而,HTTP/2的设计与部署与HTTPS(TLS加密)紧密相关,甚至强制…...
JavaScript篇:揭秘函数式与命令式编程的思维碰撞
大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了…...
ubuntu24.04上安装NVIDIA driver+CUDA+cuDNN+Anaconda+Pytorch
一、NVIDIA driver 使用Ubuntu系统的:软件和更新——>附加驱动,安装NVIDIA驱动。 二、CUDA 安装命令:sudo apt install nvidia-cuda-toolkit 三、cuDNN cuDNN 9.10.0 Downloads | NVIDIA Developer 四、Anaconda Download Anaconda Di…...
vue3基础学习(上) [简单标签] (vscode)
目录 1. Vue简介 2. 创建Vue应用 2.1 下载JS文件 2.2 引用JS文件 2.3 调用Vue方法编辑 2.4 运行一下试试: 2.5 代码如下 3.模块化开发模式 3.1 Live Server插件 3.2 运行 4. 常用的标签 4.1 reactive 4.1.1 运行结果 4.1.2 代码: 4.2 ref 4.2.1 运行结果 4.2.2…...
.Net HttpClient 使用代理功能
HttpClient 使用代理功能 实际开发中,HttpClient 通过代理访问目标服务器是常见的需求。 本文将全面介绍如何在 .NET 中配置 HttpClient 使用代理(Proxy)功能,包括基础使用方式、代码示例、以及与依赖注入结合的最佳实践。 注意…...
深入理解Java适配器模式:从接口兼容到设计哲学
引言:接口不兼容的困局 在软件开发中,我们经常遇到这样的场景: 旧系统有一个「RS232串口设备」(仅支持sendByRS232(String data)方法),新系统需要通过「USB接口」(要求sendByUSB(String data)…...
非异步信号安全函数
这个程序演示了如何使用sigaction来捕获和处理信号(特别是SIGINT,即CtrlC)。以下是关键点和潜在问题的分析: 程序功能 信号捕获:注册自定义处理函数handler来捕获信号2(SIGINT,通常由CtrlC触发…...
PHP黑白胶卷底片图转彩图功能 V2025.05.15
关于底片转彩图 传统照片底片是摄影过程中生成的反色图像,为了欣赏照片,需要通过冲印过程将底片转化为正像。而随着数字技术的发展,我们现在可以使用数字工具不仅将底片转为正像,还可以添加色彩,重现照片原本的色彩效…...
【C++ / STL】封装红黑树实现map和set
文章目录 一. 源码及框架分析1.决定搜索类型的传参思考:为什么要传第一个参数 2.KeyOfValue的作用 二. 模拟实现map和set1. 实现出复用红黑树框架,并支持insert2. 支持iterator的实现iterator实现思路分析【iterator操作实现详解】 3.支持map的[ ]操作4.map和set代码…...
记录: Windows下远程Liunx 系统xrdp 用到的一些小问题(免费踩坑 记录)
采用liunx Ubuntu22.04版本以下,需要安装 xrdp 或者VNC 具体过程就是下载 在linux命令行里 首先更新软件包:sudo apt update 安装xrdp服务:sudo apt install xrdp 启动XRDP:sudo systemctl start xrdp(如果在启动的…...
WordPress 文章和页面:它们的区别是什么?
很多刚接触WordPress的用户,在创建网站内容时往往会遇到这样一个问题:“我应该用‘文章’还是‘页面’?”虽然两者都能发布内容,但它们之间到底有什么区别呢?这篇文章将从易于理解的角度,帮助大家厘清WordP…...
【工具变量】各省市场化指数-杨兴权版共三个方法(1997-2023年)
市场化指数是衡量中国各地区市场化改革进程的重要指标。本次数据基于杨兴全、马连福和夏立军三位学者的研究成果,系统整理并更新了我国1997-2023年间31个省、自治区、直辖市的市场化指数,便于研究者进行横向和纵向比较分析。 一、数据介绍 数据名称&…...
Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景
团结引擎 1.5.0 版本已于 4 月 14 日正式发布,从 1.5.0 版本开始,团结引擎车机版带来了一个激动人心的新能力 —— Android App View。现在,开发者可以将任意第三方安卓应用以 2D 组件或 3D 组件的形式,原生嵌入到 Tuanjie 开发的…...
完整的 CentOS 6.10 虚拟机安装启动脚本
好的!下面是一个 完整的 CentOS 6.10 虚拟机安装启动脚本,专为你在 macOS(M 系芯片) QEMU(x86_64 软件模拟) 环境设计,确保你能顺利启动并安装一个接近 Red Hat 6.4 的开发环境。 ⸻ ✅ 前提准…...
如何远程执行脚本不留痕迹
通常我们在做远程维护的时候,会有这么一个需求,就是我想在远程主机执行一个脚本,但是这个脚本我又不想保留在远程主机上,那么有人就说了,那就复制过去再登录远程执行不就行了吗?嗯嗯,但是这还不…...
观测云:从云时代走向AI时代
过去十年,云计算让企业的数据处理能力实现了指数级增长,而观测云作为全栈监控观测平台,见证并参与了这一进程。通过强大的数据采集、处理与展示能力,观测云帮助数百家企业实现了对 IT 基础设施、应用服务、业务链路的全面掌控。 …...
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- consistency is the key
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- consistency is the key DeepSeek v3的时候,它模型已经足够强大到能带来consistency稳定性。所以当这个DeepSeek R1 Zero或者DeepSeek R1使用GRPO进行训练的时候,它能够…...
鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp
UniApp 实现图片上传与压缩功能 前言 在移动应用开发中,图片上传是一个非常常见的需求。无论是用户头像、朋友圈图片还是商品图片,都需要上传到服务器。但移动设备拍摄的图片往往尺寸较大,直接上传会导致流量消耗过大、上传时间过长&#x…...
SymPy | 如何提取指定项的系数
SymPy 是 Python 中一个强大的符号计算库,广泛应用于数学、物理和工程领域的符号运算。在代数表达式的处理中,提取特定项的系数是一项常见且重要的操作。本文将详细介绍 SymPy 中提取指定项系数的多种方法,并通过丰富的示例帮助读者掌握这些技…...
MUSE Pi Pro 更换kernel内核及module模块
视频讲解: MUSE Pi Pro 更换kernel内核及module模块 脚本仓库: https://github.com/LitchiCheng/MUSE-Pi-Pro-Learning 结合上期编译内核,编译成功后的输出如下: 输入 uname -a 可以看到如下信息,未修改的内核时间在 …...
java每日精进 5.14【参数校验】
参数校验 1.1概述 本文使用 Hibernate Validator 框架对 RESTful API 接口的参数进行校验,确保数据入库的正确性。 例如,在用户注册时,校验手机号格式、密码强度等。如果校验失败,抛出 ConstraintViolationException 或相关异…...
CPS联盟+小程序聚合平台分销返利系统开发|小红书番茄网盘CPA拉新推广全解析
导语: 在私域流量与社交电商爆发的时代,CPS联盟分销返利系统与小红书CPA拉新推广成为企业增长的核心引擎。本文深度解析如何通过小程序聚合平台开发、多层级返利机制搭建及精准CPA推广策略,快速占领市场,实现用户裂变与收益倍增。…...
基于EFISH-SCB-RK3576/SAIL-RK3576的光伏逆变器控制器技术方案
(国产化替代J1900的能源物联网解决方案) 一、硬件架构设计 电力转换与控制模块 高精度功率控制: Cortex-M0硬实时核驱动多相PWM(频率>200kHz),动态调节DC-AC转换误差<0.5%FPGA实现MPPT算法…...
HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera
HarmonyOS NEXT 适配高德地图 Flutter SDK 实现地图展示,添加覆盖物和移动 Camera 在现代移动应用开发中,地图功能是许多应用的核心组成部分之一。HarmonyOS NEXT 提供了强大的跨平台开发能力,而高德地图 Flutter SDK 则为开发者提供了丰富的…...
计算机网络:手机和基站之间是通过什么传递信息的?怎么保证的防衰减,抗干扰和私密安全的?
手机与基站之间的通信依赖无线电磁波信号,其传输介质、频率选择、抗衰减/抗干扰技术及隐私保护机制共同构成了现代移动通信的核心。以下从技术原理到实际应用逐一解析: 一、信号本质与传输介质 1. 信号类型 电磁波:手机与基站通过射频(RF)电磁波传递信息,采用数字调制技…...
C#调用C++dll 过程记录
C#调用Cdll 过程记录 问题:1、设置修改记录2 修改对应问题3 继续出问题4 许久之后的转机5 最后的成功 如题,过程记录 问题: 提示:main 已经在 dllmain.obj 中定义,针对该问题作进一步的处理 1、设置修改记录 &…...
Vue百日学习计划Day4-8——Gemini版
番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。灵活性: 这仍然是一个建议性计划。某些主题(尤其是 Flexbox 和 Grid)可能需要比预期更多的时间来练习和理解…...
DHCP协议
DHCP协议 1、掌握DHCP的工作原理 2、会在Windows server上去部署DHCP服务 3、抓流量 正常收到攻击后 一、DHCP 1、DHCP基本概念 dhcp(动态主机配置协议):主要就是给客户机提供TCP/IP参数(IP地址、子网掩码、网关、DNS等) 2、好处 减少管理员工作…...
级联与端到端对话系统架构解析:以Moshi为例
一、对话系统架构对比 1.1 级联对话系统(Cascaded Dialogue Systems) 传统级联系统采用多阶段处理流程: 语音识别(ASR):将24kHz音频信号通过卷积神经网络(CNN)和Transformer转换为…...
3、ubantu系统docker常用命令
1、自助查看docker命令 1.1、查看所有命令 docker 客户端非常简单,可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 angqiangwangqiang:~$ dockerUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:ru…...
【leetcode】349. 两个数组的交集
文章目录 代码1.set()2. 哈希表3. 数组 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输…...
BGP联邦和发射试验
一、要求 二、需求分析 1. **拓扑与地址规划** - **AS1**:环回16.1.1.0/24需宣告,192.168.1.0/24不宣告。 - **AS3**:环回11.1.1.0/24需宣告,192.168.2.0/24不宣告。 - **AS2**:使用172.16.0.0/16划分子…...
LeetCode Hot100 (1/100)
目录 一、有关数组和动态数组的排序(sort函数) 1.普通数组的排序 基本用法 降序排序 2.vector的排序 基本用法 降序排序 二、数组长度和一些vector的基本语法 1. 静态数组长度计算 2. 安全获取数组长度(C17 起) 3.vecto…...
LeetCode热题100--234.回文链表--简单
1. 题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: 输入…...
Java—接口和抽象类
一、接口 Java 接口(Interface) 是面向对象编程中用于定义行为规范的核心机制。接口通过抽象方法约定“能做什么”,而不关心“如何做”,从而实现多态和代码解耦。 1.1 接口的特点 接口用interface定义接口中全为抽象方法默认用p…...