C++数据结构哈希表的实现(开散列实现、闭散列实现)
C++哈希
1. 哈希概念
哈希作为数据结构时,是一种通过某种哈希函数使元素的存储位置与它的关键码之间建立一一映射的关系,在查找时通过该函数就能快速找到该元素,平均时间复杂度为 O ( 1 ) \rm O(1) O(1) ,且遍历结果是无序的。
2. 哈希函数
2.1 直接定址法(常用)
直接定址法,使用关键字本身或关键字的某个线性函数作为哈希地址,哈希函数:
h ( k ) = a × k + b ( 其中 a 、 b 是常数 ) h(k)=a\times k+b\quad (其中a、b是常数) h(k)=a×k+b(其中a、b是常数)
优点: 简单高效,计算速度快。
缺点: 需要提前知道关键字的分布情况。
使用场景: 适用于查找数据量比较小且连续的情况。
2.2 留除余数法(常用)
留除余数法,用关键字除以一个正整数 m,然后取其余数作为哈希地址,哈希函数:
h ( k ) = k m o d m ( m 通常取质数 ) h(k) = k\! \mod m\quad (m \;通常取质数) h(k)=kmodm(m通常取质数)
优点: m m m 通常取质数,可以减少哈希冲突的概率。
缺点: 对于特定分布的关键字,可能会出现聚集现象,冲突较多。
使用场景: 适用于关键字分布随机的情况。
2.3 平方取中法
平方取中法,将关键字平方后,取中间几位作为哈希地址,哈希函数:
h ( k ) = k 2 h(k)=k^2 h(k)=k2
优点: 对关键字的局部性敏感,分布较均匀进一步减少哈希冲突概率)。
缺点: 哈希函数构造稍复杂。
使用场景: 利用平方扩展了关键字的分布范围,适合关键字位数少的情况。
2.4 其他方法
-
折叠法,将关键字分成若干部分(可以是等长或不等长),然后将这些部分叠加或按某种规则组合,最后取模。
-
随机数法,利用随机数生成器对关键字产生随机映射。
-
数学分析法,通过分析关键字的分布特点,设计一个适合的哈希函数,使关键字尽可能均匀分布在哈希表中。
3. 哈希冲突
哈希冲突(Hash Collision)是指在使用哈希函数时,两个或多个不同的关键字被映射到同一个哈希地址的情况。由于哈希表的存储空间有限,而关键字集合可能非常大,完全避免冲突通常是不现实的。因此,如何有效处理哈希冲突是哈希表设计的重要部分。
3.1 闭散列/开放地址法
3.1.1 闭散列的原理
开放地址法,是在发生冲突时,按某种探查规则在哈希表中寻找下一个空闲位置存储数据。
开放地址法的常用方法是线性探测,在发生哈希冲突时,地址依次递增 i i i ,直到找到下一个空闲的地址为止:
图片中 i i i 为 1。
除了线性探测之外,还有:
- 二次探测: 步长取 ( 1 ) − k i 2 ( k 为探测次数 ) (1)^{-k} i^2\, (k为探测次数) (1)−ki2(k为探测次数) 。
- 双重散列: 使用另一个哈希函数计算步长。
开放地址法的一个问题是,在代码层面上,不能够删除哈希表中已有的元素,因为直接删除元素会影响其他元素的搜索。在代码中,查找元素的逻辑是:
问题就出在判断哈希地址是否为空的步骤,如果采用直接删除,在之前的插入图片中,删除掉 4,查找 44,在 h a s h ( 44 ) hash(44) hash(44) 时,首先访问的是 4 原本的地址,判断地址元素为空,直接判断元素不存在,而如果不使用这种查找方法,就会丢失哈希表查找时间复杂度 O ( 1 ) O(1) O(1) 的特点。
所以在开放地址法中,不能直接删除元素,而是使用一个标记位将其视为无效。
enum State{EMPTY, EXIST, DELETE}
3.1.2 装填因子
装填因子是哈希表满程度的标志因子。状态因子的定义为: α = 表中有效元素个数 / 哈希表的总长度 \alpha=表中有效元素个数/哈希表的总长度 α=表中有效元素个数/哈希表的总长度
在不清楚实际插入数据的规模的情况下,难免需要对哈希表进行扩容。但在哈希表接近满的情况下,新插入的元素往往会发生很多次哈希冲突才能插入,因此实际设计中不能真的等待哈希表满时扩容,而是在哈希表的哈希冲突概率比较高时,就进行扩容,装填因子就是用来判断是否需要扩容的依据。
对于开放定址法,装填因子应该严格控制在 0.7 − 0.8 0.7-0.8 0.7−0.8 以下,如 Java 的系统库限制了装填因子上限为 0.75 0.75 0.75 ,超过该值就对哈希表进行扩容。因此,开放定址法的最大缺陷,就是空间利用率比较低。
开放定址法的扩容的损耗也是一个痛点,因为每次扩容,哈希映射也要跟着改变,已插入的元素都要重新插入哈希表中。哈希扩容需要重新映射,当次插入效率会比较低。重新映射后原来冲突的数据会分开,整体数据更分散。
3.1.3 闭散列的实现
代码主要实现线性探测和哈希函数的处理。
代码:
#include "Hash.hpp"
#include <vector>
#include <iostream>
using namespace std;enum class State
{EMPTY,EXIST,DELETE
};template <class K, class V>
class Element
{
public:pair<K, V> _data;State _state = State::EMPTY;
};template <class K>
class HashFunc
{
public:size_t operator()(const K& Key){return (size_t)Key;}
};template <class K, class V, class Hash = HashFunc<K>>
class HashTable
{
public:HashTable() : _table(10), _size(0) {};bool Insert(const pair<K, V>& kv){if (Find(kv.first)){// 如果数据已经存在,就不需要插入return false;}if (_size * 10 / _table.size() >= 7) // 当负载因子大于70%时扩容{// 创建一个新表,将原数据复制到新表中HashTable<K, V> newTB;newTB._table.resize(_table.size() * 2);for (size_t i = 0; i < _table.size(); i++){newTB.Insert(_table[i]._data);}// 交换新表和旧表的地址,并销毁旧表_table.swap(newTB._table);}// 线性探测Hash hash;size_t ptr = hash(kv.first) % _table.capacity();while (_table[ptr]._state == State::EXIST){++ptr;ptr %= _table.capacity();}_table[ptr]._data = kv;_table[ptr]._state = State::EXIST;return true;}Element<K, V>* Find(const K& key){Hash hash;size_t ptr = hash(key) % _table.capacity();// 线性探测while (_table[ptr]._state != State::EMPTY){if (_table[ptr]._state == State::EXIST && _table[ptr]._data.first == key){return &_table[ptr];}++ptr;ptr %= _table.size();}return nullptr;}bool Erase(const K& key){Element<K, V>* ret = Find(key);if (ret == nullptr){return false;}else{ret->_state = State::DELETE;--_size;}return true;}void print(){for (int i = 0; i < _table.size(); i++){if (_table[i]._state == State::EMPTY){cout << "pos:" << i << " " << "state:EMPTY" << " " << "key:" << _table[i]._data.first << " " << "val:" << _table[i]._data.second << endl;}else if (_table[i]._state == State::EXIST){cout << "pos:" << i << " " << "state:EXIST" << " " << "key:" << _table[i]._data.first << " " << "val:" << _table[i]._data.second << endl;}else{cout << "pos:" << i << " " << "state:DELETE" << " " << "key:" << _table[i]._data.first << " " << "val:" << _table[i]._data.second << endl;}}}private:vector<Element<K, V>> _table;size_t _size;
};int main()
{HashTable<int, int> ht;ht.Insert(make_pair(1, 1));ht.Insert(make_pair(3, 75));ht.Insert(make_pair(4, 35));ht.Insert(make_pair(22, 9));ht.Insert(make_pair(33, 1));ht.print();return 0;
}
效果:
如果数据类型是 String 或其他类型,可以使用模板的特化指定哈希值的计算方法:
template<>
struct HashFunc<string>
{size_t operator()(const string& key){size_t hash = 0;for (auto ch : key){hash *= 131;hash += ch;}return hash;}
};
3.2 开散列/哈希桶/拉链法
3.2.1 开散列的原理
开散列法又叫链地址法,它首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一集合,每一个子集称为一个桶,各个桶中的元素通过一个单链表连接起来,各链表的头节点存储在哈希表中。简单来说,开散列就是闭散列中,发生哈希冲突不另寻地址,而是直接冲突的位置接上数值。
3.2.2 开散列扩容
随着插入的元素增多,每个桶中的元素个数也会不断增多,极端情况下,可能会导致一个桶中链表节点非常多,从而影响哈希表的性能。因此需要对哈希表进行扩容。最理想的扩容情况是,每个哈希桶中只有一个节点,此时再进行插入元素时,每次都会发生哈希冲突。因此,在哈希表中元素个数刚好等于桶的个数(即哈希表的容量)时,对哈希表进行扩容。
3.2.3 开散列的实现
插入时,为了代码简洁使用的是头插。
代码:
#include "Hash.hpp"
#include <vector>
#include <iostream>
using namespace std;template <class K, class V>
class HashNode
{
public:pair<K, V> _kv;HashNode<K, V>* _next;HashNode(pair<K, V> kv) :_kv(kv) {}
};template <class K>
class HashFunc
{
public:size_t operator()(const K& Key){return (size_t)Key;}
};template <class K, class V, class Hash = HashFunc<K>>
class HashTable
{
public:HashTable() : _table(10), _size(0) {}bool Insert(const pair<K, V>& kv){if (Find(kv.first)){// 如果数据已经存在,就不需要插入return false;}if (_size == _table.size()) // 当负载因子为1时扩容{// 创建一个新表,将原数据复制到新表中HashTable<K, V> newTB;newTB._table.resize(_table.size() * 2);for (size_t i = 0; i < _table.size(); i++){newTB.Insert(_table[i]->_kv);}// 交换新表和旧表的地址,并销毁旧表_table.swap(newTB._table);}Hash hash;size_t ptr = hash(kv.first) % _table.capacity();HashNode<K, V>* newnode = new HashNode<K, V>(kv);//这里为了逻辑简单,使用头插newnode->_next = _table[ptr];_table[ptr] = newnode;++_size;return true;}HashNode<K, V>* Find(const K& key){Hash hash;size_t ptr = hash(key) % _table.capacity();HashNode<K, V>* cur = _table[ptr];while (cur){if (cur->_kv.first == key){return cur;}cur = cur->_next;}return nullptr;}bool Erase(const K& key){//...}void print(){for (int i = 0; i < _table.size(); i++){HashNode<K, V>* cur = _table[i];if (cur){while (cur){cout << " key:" << cur->_kv.first << " val:" << cur->_kv.second;if (cur){cout << "->";cur = cur->_next;}}}cout << "null"<< endl;}}private:vector<HashNode<K, V>*> _table;size_t _size;
};int main()
{HashTable<int, int> ht;ht.Insert(make_pair(1, 1));ht.Insert(make_pair(3, 75));ht.Insert(make_pair(4, 35));ht.Insert(make_pair(22, 9));ht.Insert(make_pair(33, 1));ht.print();return 0;
}
效果:
相关文章:
C++数据结构哈希表的实现(开散列实现、闭散列实现)
C哈希 1. 哈希概念 哈希作为数据结构时,是一种通过某种哈希函数使元素的存储位置与它的关键码之间建立一一映射的关系,在查找时通过该函数就能快速找到该元素,平均时间复杂度为 O ( 1 ) \rm O(1) O(1) ,且遍历结果是无序的。 …...
显著性检测分类(数据集和评估指标总结)
一:RGB显著性检测 常用数据集 其中有DUTS,ECSSD,DUT-OMRON,PASCAL-S,HKU-IS,SOD,SOC,MSRA-B (1)DUTS:DUTS-TR(训练集):10553张,DUT…...
【R语言】使用DESeq2对微生物组进行差异分析
代码展示: asv <- read.delim(paste0(input,_0.5wen.10050.asv_table.txt), row.names 1, sep \t, stringsAsFactors FALSE, check.names FALSE) group <- read.delim(paste0(group2_,input,.txt),row.names 1,sep \t) asv <- asv1 #将变量转换为因…...
什么是广播系统语言传输指数 STIPA
广播系统语言传输指数(STIPA) 是用于评估公共广播系统中语音信号传输质量的国际标准指标,主要用于衡量语音清晰度和可懂度。以下是其关键信息: 1. 定义与作用 STIPA(Speech Transmission Index for Public…...
【Json—RPC框架】:宏定义不受命名空间限制,续行符的错误使用造成的bug
为什么不受命名空间的限制? 宏处理在预处理阶段, 预处理在编译之前,编译才进行语法分析,语义分析。命名空间也只能限制这部分。 在Json-RPC框架的实现中,遇到如下问题。一开始以为是在实现日志宏的时候,有…...
解决前端文字超高度有滚动条的情况下padding失效(el-scrollbar)使用
<div class"detailsBlocksContent"><div>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试…...
失败的面试经历(ʘ̥∧ʘ̥)
一.面向对象的三大特性 1.封装:将对象内部的属性私有化,外部对象不能够直接访问,但是可以提供一些可以使外部对象操作内部属性的方法。 2.继承:类与类之间会有一些相似之处,但也会有一些异处,使得他们与众…...
大数据学习(70)-大数据调度工具对比
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
Description of a Poisson Imagery Super Resolution Algorithm 论文阅读
Description of a Poisson Imagery Super Resolution Algorithm 1. 研究目标与意义1.1 研究目标1.2 实际意义2. 创新方法与模型2.1 核心思路2.2 关键公式与推导2.2.1 贝叶斯框架与概率模型2.2.2 MAP估计的优化目标2.2.3 超分辨率参数α2.3 对比传统方法的优势3. 实验验证与结果…...
PIP离线安装包
获得离线包 pip freeze >requirements.txt pip download -rrequirements.txt 可以看到pip开始下载依赖包列表中的所有依赖包 安装离线包 如果你希望完全从本地 .whl 文件安装依赖,而不从 PyPI 或其他外网源下载任何包,可以使用 --no-index 参数来…...
动静态库区别
目录 示例 动静态库区别 定义和链接方式 文件大小 内存使用 更新和维护 加载时间 依赖关系 适用场景 动静态库总结 示例 Linux系统中ls也是一个进程,它运行也得依赖动态库,那么学习动静态库区别是有必要的!!!…...
剑指 Offer II 076. 数组中的第 k 大的数字
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20076.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E7%AC%AC%20k%20%E5%A4%A7%E7%9A%84%E6%95%B0%E5%AD%97/README.md 剑指 Offer II 076. 数组中的第 k 大的数字 …...
容联云大模型应用入选甲子光年AI Agent产业图谱
近日,甲子光年发布《2025中国AI Agent行业研究报告》,旨在系统梳理AI Agent技术演进与产业重构路径,展示行业标杆厂商及先锋实践。 容联云凭借卓越的Copilot & Agent产品和解决方案,以及在银行、保险等领域的成熟应用验证&…...
机器学习——深入浅出理解朴素贝叶斯算法
文章目录 引言一、朴素贝叶斯定理概述1.从贝叶斯定理说起2.朴素贝叶斯的“朴素”之处3.朴素贝叶斯算法的应用 二、朴素贝叶斯算法的优缺点三、python代码实现案例1.导入库2.数据预处理3.模型训练4.模型评估5.完整代码 四、总结 引言 朴素贝叶斯算法,一个听起来充满…...
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave) 一、TCP三次握手(Three-way Handshake)二、TCP四次挥手(Four-way Wave)三、常见问题解答总结为什么三次握手不…...
【CF】Day9——Codeforces Round 953 (Div. 2) BCD
B. New Bakery 题目: 思路: 被标签害了,用什么二分( 很简单的思维题,首先如果a > b,那么全选a就行了,还搞啥活动 否则就选 b - a 天来搞活动,为什么? 首先如果我…...
【AI知识管理系统】(一)AI知识库工具测评
嘿,朋友们!🧐你们有没有想过,咱们平日里那些一闪而过的知识笔记、各种碎片化的idea,记录下来之后都是怎么管理的呀? 还有啊,咱们读过的那些书,大家会不会随手写点东西记录一下呢?📝要知道,如果不写的话,很可能过不了多久就全忘得一干二净啦。 😭那多年前记下的…...
Model Context Protocol 的生命周期
生命周期阶段 生命周期分为三个主要阶段: 初始化阶段 (Initialization) 客户端与服务器建立协议版本兼容性。交换并协商能力。分享实现细节。客户端必须发送 initialize 请求,包含支持的协议版本、客户端能力和客户端实现信息。服务器必须响应其自身能力…...
hot100_part_堆
不该要求事情一开始就是完美。 堆排序 【从堆的定义到优先队列、堆排序】 10分钟看懂必考的数据结构——堆_哔哩哔哩_bilibili 排序算法:堆排序【图解代码】_哔哩哔哩_bilibili 堆定义 堆必须是完全二叉树,从上到下,从左到右不能用空缺。…...
CoreData 调试警告:多个 NSEntityDescriptions 声明冲突的解决
概述 目前在苹果生态 App 的开发中,CoreData 数据库仍然是大部分中小应用的优先之选。不过,运行时 CoreData 常常产生各种“絮絮叨叨”的警告不禁让初学的秃头小码农们云里雾里。 这不,对于下面这一大段 CoreData 警告,大家是否一…...
【白话神经网络(二)】矩阵、CNN、RNN
全连接层 回顾前面学过的知识: 一个最简单的神经网络,就是ywxb 套上一个激活函数。 如果有多个输入,那就是多个w和x 如果有多个输出,那就再来一行公式,多一组w和b 要是神经元多了的话,公式密密麻麻的&…...
map容器练习:使用map容器识别统计单词个数
题目链接:单词识别_牛客题霸_牛客网 对map的使用不太熟悉的同学可以参考:超详细介绍map(multimap)的使用-CSDN博客 题目解析 输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕…...
DeepSeek 是否被过度吹捧了?
DeepSeek 作为中国人工智能领域的后起之秀,其技术进展引发了广泛关注和讨论。然而,DeepSeek 是否被过度吹捧仍然值得客观分析。 DeepSeek 的确取得了不错的成果,不过可能没有媒体宣传和人们想象中那么重大。它的轰动性主要在于以低廉的成本达…...
前端大文件上传(分片上传)与下载
文章目录 一、问题二、思路1、选择文件2、校验文件是否符合规范3、文件切片上传4、分片上传注意点5、大文件下载 一、问题 日常业务中难免出现前端需要向后端传输大型文件的情况,这时单次的请求不能满足传输大文件的需求,就需要用到分片上传 业务需求为…...
【最佳实践】Go 状态模式
设计思路 状态模式的核心在于将对象的行为封装在特定的状态类中,使得对象在不同的状态下表现出不同的行为。每个状态实现同一个接口,允许对象在运行时通过改变其内部状态对象来改变其行为。状态模式使得状态转换更加明确,并且易于扩展新的状…...
如何用Python批量将CSV文件编码转换为UTF-8并转为Excel格式?
在处理数据时,CSV文件格式常常用作数据的交换格式。不过,很多情况下我们会遇到编码问题,特别是当文件不是UTF-8编码时。为了更好地处理这些文件,可能需要将它们转换为UTF-8编码,并且将其转换为Excel格式,这…...
回顾Transformer,并深入讲解替代方案Mamba原理(图解)
一种语言建模中 Transformer 的替代方案 Transformer 架构是大语言模型(LLMs)成功的关键组成部分。几乎所有今天使用的大语言模型都采用了该架构,从开源模型如 Mistral 到闭源模型如 ChatGPT。 为了进一步改进大语言模型,新的架构…...
2025开源风险治理最佳实践︱新能源汽车车企开源风险治理案例
案例来源:悬镜安全 案例背景 当前我国新能源汽车产业蓬勃发展,智能网联趋势持续深化。汽车技术与工程核心逐渐从传统硬件层面转移到软件层面,踏上软件定义汽车(SDV)的变革之路。引用开源组件成为车企、Tier1、Tier2在软件开发过程中的常规操…...
Spring中Bean的自动装配
1.自动装配的核心概念 定义: Bean的自动装配是Spring框架中用于自动满足Bean依赖的一种机制。通过自动装配,Spring容器会在应用上下文中为某个Bean寻找其依赖的Bean,从而减少手动配置的工作量。其核心目标是减少配置代码,通过类型…...
一文掌握 PostgreSQL 的各种指令(PostgreSQL指令备忘)
引言 PostgreSQL 作为一款功能强大、开源的关系型数据库管理系统(RDBMS),以其高扩展性、SQL 标准兼容性以及丰富的功能特性,成为企业级应用的首选数据库之一。无论是开发、运维还是数据分析,掌握 PostgreSQL 的核心指…...
C#入门学习记录(三)C#中的隐式和显示转换
C#类型转换:隐式与显式转换的机制与应用 在C#的强类型体系中,数据类型转换是实现数据交互和算法逻辑的基础操作。当数值类型范围存在包含关系,或对象类型存在继承层次时,系统通过预定义的转换规则实现类型兼容处理。隐式转换&…...
【Linux网络-网络层】TCP与IP的关系+IP协议基本概念+网段划分+路由+IP分片与组装
网络层 在复杂的网络环境中确定一个合适的路径 一、TCP与IP的关系 TCP(传输控制协议)和IP(互联网协议)是互联网协议栈中的两个核心协议,属于不同的层级,分别在传输层和网络层,共同实现数据的可…...
【第K小数——可持久化权值线段树】
题目 代码 #include <bits/stdc.h> using namespace std;const int N 1e5 10;int a[N], b[N]; int n, m, len; int rt[N], idx; // idx 是点分配器struct node {int l, r;int s; } tr[N * 22];int getw(int x) {return lower_bound(b 1, b len 1, x) - b; }int bui…...
需要使用新应用以打开此ms-gamingoverlay链接怎么解决
要解决Windows系统提示“需要使用新应用以打开此ms-gamingoverlay链接”的问题,通常与系统自带的游戏工具栏(Game Bar)或Xbox相关应用缺失或配置错误有关。以下是综合多个来源的详细解决方法: 方法1:关闭游戏栏功能 这…...
五子棋小游戏-简单开发版
一、需求分析 开发一个基于 Pygame 库的五子棋小游戏,允许两名玩家在棋盘上轮流落子,当有一方达成五子连珠时游戏结束,显示获胜信息,并提供退出游戏和重新开始游戏的操作选项。 1.棋盘显示 : 显示一个 15x15 的五子棋…...
C语言内存函数讲解
(一)memcpy函数 这是memcpy函数的说明。它的头文件是string.h。函数原型是 void* memcpy(void* destination, const void* source, size_t num) 第一个参数是一个指向一个字符串的指针,第二个也是一样的。而第三个参数是复制的字节个数。这…...
2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题C卷
目录 总体规划 模块二:设备基础信息配置 模块三:网络搭建与网络冗余备份方案部署 模块四:移动互联网搭建与网优 模块五:出口安全防护与远程接入 总体规划 CII教育公司在进行企业大学信息化建设的过程中,为了保证北京校区、广州校区与本部校区的日常OA办公通信等关键业务,…...
《解锁Flutter:跨平台开发的未来之光》:此文为AI自动生成
《解锁Flutter:跨平台开发的未来之光》:此文为AI自动生成 Flutter:崭新时代的跨平台框架 在当今数字化浪潮中,移动应用已成为人们生活中不可或缺的一部分。无论是购物、社交、娱乐还是办公,我们都离不开各种手机应用…...
基于大数据的酒类商品数据可视化分析系统
【大数据】基于大数据的酒类商品数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统充分利用Python与Flask的强大后端处理能力,结合前端Layui框架࿰…...
【数学建模】一致矩阵的应用及其在层次分析法(AHP)中的性质
一致矩阵在层次分析法(AHP)中的应用与性质 在层次分析法(AHP)中,一致矩阵是判断矩阵的一种理想状态,它反映了决策者判断的完全合理性和一致性,也就是为了避免决策者认为“A比B重要,B比C重要,但是C又比A重要”的矛盾。…...
【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet
主页:HABUO🍁主页:HABUO 🍁YOLOv8入门改进专栏🍁 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 【YOLOv8改进系列】: 【YOLOv8】YOLOv8结构解读…...
【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
在DQL的基础查询中,我们已经学过了多表查询的一种:联合查询(union)。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先,我们想要查询emp表和stu表两个表,按照我们之前的知识栈,我们直接使用…...
练习-平方拆分问题(线性筛法-筛质数)
问题描述 小蓝非常热爱数学,一天老师给小蓝出了一道数学题,想锻炼锻炼小蓝的思维能力。题目是这样的:给定两个数 a 和 b,在 a 到 b(包括 a,b)之间所有数的平方当中,试问有几个数能够表示为 xy …...
CVE-2018-2628(使用 docker 搭建)
介绍: 是一个影响 Oracle WebLogic Server 的严重漏洞,属于 远程代码执行(RCE) 漏洞。以下是对该漏洞的详细分析: ● 漏洞类型: 远程代码执行(RCE) ● 影响范围:Oracle WebLogic Server 10.3.6.0, 12.1.3.0, 12.2.1.2…...
【深度学习与大模型基础】第5章-线性相关与生成子空间
线性相关是指一组向量中,至少有一个向量可以表示为其他向量的线性组合。具体来说,对于向量组 v1,v2,…,vn,如果存在不全为零的标量 c1,c2,…,cn使得: c1v1c2v2…cnvn0 则称这些向量线性相关。否则,它们线性无关。 举…...
使用 PaddlePaddle 官方提供的 Docker 镜像
CUDA版本高PaddlePaddle不支持时,可以使用 PaddlePaddle 官方提供的 Docker 镜像 1. 安装 Docker Desktop1.1 下载 Docker Desktop1.2 安装 Docker Desktop1.3 启用 WSL 2 或 Hyper-V1.4 启动 Docker Desktop1.5 Docker不运行解决方法 2. 拉取 PaddlePaddle Docker …...
LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 论文阅读
一、TL;DR 为什么要这么做?预训练模型越来越大,比如GPT-3 175B训练独立变得越来越不可行方法:冻结预训练模型的权重,在Transformer架构的每一层中注入可训练的低秩分解矩阵效果:训练参数量减少10000x&…...
企业的应用系统
一、人力资源系统 负责管理员工信息,处理入职,离职,调岗。 1、一般员工的信息有电子档和纸质档两份。 电子档经常是excel文件。 2、高级的公司会建立一套Web应用系统。 3、实现的功能: 新员工入职登记 (登记信息一般是:…...
SpringBoot手动注册定时任务
一、背景 项目存在这样一个场景。程序启动过程中,在Spring的Bean组件注册完毕后,会初始化一些基础数据到数据库中,而项目中有部分定时任务需要依赖这些基础数据才能正常运行。如果直接使用Scheduled注解标注定时任务方法,会导致定…...
通过 Python 爬虫提高股票选股胜率
此贴为Python爬虫技术学习贴 在股票中,即便有了选股规则,从5000多只股票中筛选出符合规则的股票也是十分困难的,于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票 实现方案 1、指定两套规则,第一套弱约束,第…...