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

链地址法(哈希桶)

链地址法(哈希桶)

解决冲突的思路

开放定址法中所有的元素都放到哈希表⾥,链地址法中所有的数据不再直接存储在哈希表中,哈希表 中存储⼀个指针,没有数据映射这个位置时,这个指针为空,有多个数据映射到这个位置时,我们把这些冲突的数据链接成⼀个链表,挂在哈希表这个位置下⾯,链地址法也叫做拉链法或者哈希桶。

扩容

开放定址法负载因⼦必须⼩于1,链地址法的负载因⼦就没有限制了,可以⼤于1。负载因⼦越⼤,哈 希冲突的概率越⾼,空间利⽤率越⾼;负载因⼦越⼩,哈希冲突的概率越低,空间利⽤率越低;stl中 unordered_xxx的最⼤负载因⼦基本控制在1,⼤于1就扩容,我们下⾯实现也使⽤这个⽅式。

下⾯演⽰ {19,30,5,36,13,20,21,12,24,96} 等这⼀组值映射到M=11的表中

image-20250106214034236

h(19) = 8,h(30) = 8,h(5) = 5,h(36) = 3,h(13) = 2,h(20) = 9,h(21) = 10,h(12) = 1,h(24) = 2,h(96) = 88

在这里插入图片描述

哈希桶实现代码:

namespace hash_bucket
{//仿函数template<class K>struct HashFunc{size_t operator()(const K& key){return (size_t)key;}};//string用得多,特化一下template<>struct HashFunc<string>{size_t operator()(const string& s){size_t hash = 0;for (auto ch : s){hash += ch;}return hash;}};template<class K,class V>struct HashNode{pair<K, V> _kv;HashNode<K, V>* _next;//别定义成pair了HashNode(const pair<K,V>& kv):_kv(kv),_next(nullptr){}};template<class K,class V,class Hash=HashFunc<K>> class HashTable{typedef HashNode<K, V> Node;public:HashTable():_tables(__stl_next_prime(0)),_n(0){}//vector里面存的是内置类型Node*而不是自定义类型,所以要自己处理//如果析构需要自己写那么拷贝构造和赋值重载也得自己写~HashTable(){for (size_t i = 0; i < _tables.size(); i++){Node* cur = _tables[i];	while (cur){Node* next = cur->_next;delete cur;cur = next;}_tables[i] = nullptr;//}}Hash hash;//Node* Find(const K& key){size_t hashi = hash(key) % _tables.size();Node* cur = _tables[hashi];while (cur){if (key == cur->_kv.first){return cur;}cur = cur->_next;}return nullptr;}bool Erase(const K& key){size_t hashi = hash(key) % _tables.size();Node* cur = _tables[hashi];Node* prev = nullptr;//要记录while (cur){if (key == cur->_kv.first){//分两种情况处理if (prev == nullptr)//要删除的是头结点{_tables[hashi] = cur->_next;}else//删除的不是头结点{prev->_next = cur->_next;}delete cur;--_n;return true;}prev = cur;cur = cur->_next;}return false;}bool Insert(const pair<K,V>& kv){if (_n == _tables.size()){vector<Node*> newtables(__stl_next_prime(_tables.size())+1);for (size_t i = 0; i < _tables.size(); i++){Node* cur = _tables[i];while (cur){Node* next = cur->_next;size_t hashi = hash(cur->_kv.first) % newtables.size();cur->_next = newtables[hashi];newtables[hashi] = cur;cur = next;}_tables[i] = nullptr;}_tables.swap(newtables);//}//头插size_t hashi = hash(kv.first) % _tables.size();Node* newnode = new Node(kv);newnode->_next = _tables[hashi];_tables[hashi] = newnode;++_n;return true;}private:vector<Node*> _tables;size_t _n=0;//自己造轮子/*struct Data{ListNode* _head;RBTreeNode* _root;size_t len;};*///套两个结构在里面/*struct Date{list<pair<K, V>> _list;map<pair<K, V>> _map;size_t len;};vector<Data> _tables;size_t _n = 0;*/};

Tips:

  • 在扩容时,我们不再像开放定址法为了复用Insert而创建一个HashTable而是创建一个新vector,因为Insert里要创建新节点,然后swap之后带走旧表时又要释放这些结点,一来一回消耗比较大;直接用新vector,把原vector挂的结点直接“拿”到新表就可以了。
  • 如果觉得挂的链表太长了,可以换成比如_n>8就换挂红黑树,创建一个结构体Data,里面存储的可以是自己“造轮子”的也可以直接用list和map这两个结构(就可以直接用自带的接口)。如果减到比如8个以下了再换回链表。
  • vector里面存的是内置类型Node*而不是自定义类型,所以要自己处理,否则不会被处理;如果析构函数需要自己实现,那么赋值重载和拷贝构造也需要自己实现,深拷贝。

相关文章:

链地址法(哈希桶)

链地址法&#xff08;哈希桶&#xff09; 解决冲突的思路 开放定址法中所有的元素都放到哈希表⾥&#xff0c;链地址法中所有的数据不再直接存储在哈希表中&#xff0c;哈希表 中存储⼀个指针&#xff0c;没有数据映射这个位置时&#xff0c;这个指针为空&#xff0c;有多个数…...

OpenCV相机标定与3D重建(44)初始化广角(鱼眼)相机的投影映射函数initWideAngleProjMap()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::initWideAngleProjMap 是 OpenCV 库中的一个函数&#xff0c;用于初始化广角&#xff08;鱼眼&#xff09;相机的投影映射。这个函数生成两个…...

『SQLite』安装与基本命令语法

SQLite安装 Windows&#xff1a; 访问 SQLite 的安装网页&#xff1a;https://www.sqlite.org/download.html.向下滚动页面到“Precompiled Binaries for Windows”部分。下载适用于你的系统架构&#xff08;32-bit 或 64-bit&#xff09;的预编译二进制文件。将下载的 ZIP 文…...

Meta 发布 Llama 3.3:一个性能和效率均有所提升的多语言模型

Meta 发布 Llama 3.3:一个性能和效率均有所提升的多语言模型 Meta 发布了 Llama 3.3,这是一款多语言大语言模型,旨在支持研究和行业中的一系列人工智能应用。该模型具有 128k 个 token 上下文窗口,并对架构进行了改进以提高效率,在推理、编码和多语言任务的基准测试中表现…...

场馆预定平台高并发时间段预定实现V1

&#x1f3af; 本文介绍了一个高效处理高并发场馆预订请求的系统设计方案。通过使用Redis缓存和位图技术&#xff0c;系统能够快速管理场地的可用性和预订状态。采用Lua脚本确保操作的原子性&#xff0c;结合责任链模式进行参数校验&#xff0c;并通过事务保证数据一致性。系统…...

【AWS SDK PHP】This operation requests `sigv4a` auth schemes 问题处理

使用AWS SDK碰到的错误&#xff0c;其实很简单&#xff0c;要装个扩展库 保持如下 Fatal error: Uncaught Aws\Auth\Exception\UnresolvedAuthSchemeException: This operation requests sigv4a auth schemes, but the client currently supports sigv4, none, bearer, sigv4-…...

BOOST 库在深度学习中的应用及具体代码分析(三)

一、引言 深度学习的迅猛发展重塑了众多领域的技术格局&#xff0c;从智能安防中的人脸识别精准监测&#xff0c;到医疗影像辅助诊断助力疾病早期发现&#xff0c;再到自然语言处理驱动智能客服流畅交流&#xff0c;其影响力无处不在。在深度学习的实现工具集中&#xff0c;Pyt…...

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…...

机器学习经典算法——线性回归

目录 算法介绍 一元线性回归模型 多元线性回归模型 ​误差项分析 相关系数 算法案例 一元线性回归预测——广告销售额案例 二元线性回归预测——血压收缩案例 多元线性回归预测——糖尿病案例 算法介绍 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种…...

基于单片机的光控窗帘设计

摘 要 : 为了能根据室外环境亮度实现窗帘自动拉合的设计需求 , 提出了一种基于单片机 控制的 光控窗帘设计方案 , 并完成系统的软 、 硬件设计 。 该系统的硬件部分主要利用光敏传感器产生的信号作为单片机输入信号, 软件部分采用 C 语言进行编程 , 能够完成智能光控…...

STM32 拓展 电源控制

目录 电源控制 电源框图 VDDA供电区域 VDD供电区域 1.8V低电压区域 后备供电区域 电压调节器 上电复位和掉电复位 可编程电压检测器(PVD) 低功耗 睡眠模式(只有CUP(老板)睡眠) 进入睡眠模式 退出睡眠模式 停机(停止)模式(只留核心区域(上班)) 进入停…...

ASP.NET CORE 依赖注入的三种方式,分别是什么,使用场景

在 依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;中&#xff0c;通常有三种常见的服务生命周期模式&#xff0c;用于控制服务实例的创建和管理。这些模式分别是&#xff1a;Transient、Scoped 和 Singleton。这三种模式在 ASP.NET Core 中非常重要…...

在Linux中,如何禁用root用户直接SSH登录?

在Linux中禁用root用户的直接SSH登录是为了增强系统的安全性&#xff0c;因为允许root用户通过SSH远程登录会增加服务器被暴力破解的风险。以下是在Linux系统中禁止root用户直接SSH登录的步骤&#xff1a; 编辑SSH配置文件&#xff1a; 打开/etc/ssh/sshd_config文件&#xff…...

Unity3D仿星露谷物语开发17之空库存栏UI

1、目标 将库存栏放在游戏界面中&#xff0c;一般情况下角色居中展示时库存栏在底部&#xff0c;当角色位于界面下方时库存栏展示在顶部避免遮挡。 2、CanvasGroup组件 用于集中控制UI元素的透明度、交互性和射线投射行为。CanvasGroup的Alpha属性允许渐变效果&#xff0c;I…...

云效流水线使用Node构建部署前端web项目

云效流水线实现自动化部署 背景新建流水线配置流水线运行流水线总结 背景 先来看看没有配置云效流水线之前的部署流程&#xff1a; 而且宝塔会经常要求重新登录&#xff0c;麻烦的很 网上博客分享了不少的配置流程&#xff0c;这一篇博客的亮点就是不仅给出了npm命令构建&…...

Mysql数据实时同步到Es上

同步方案 ① 同步双写 同步双写实一种数据同步策略&#xff0c;它指的是在主数据库(如mysql) 上进行数据修改操作&#xff0c;同时将这些修改同步写入到ES 中&#xff0c;这种策略旨在确保两个数据库之间的数据一致性&#xff0c;并且优化系统的读写性能。 目标 同步双写是…...

【Redis经典面试题七】Redis的事务机制是怎样的?

目录 一、Redis的事务机制 二、什么是Redis的Pipeline&#xff1f;和事务有什么区别&#xff1f; 三、Redis的事务和Lua之间有哪些区别&#xff1f; 3.1 原子性保证 3.2 交互次数 3.3 前后依赖 3.4 流程编排 四、为什么Lua脚本可以保证原子性&#xff1f; 五、为什么R…...

聊聊 C# 中的委托

聊聊 C# 中的委托 什么是委托&#xff08;Delegate&#xff09;单播委托&#xff08;Unicast Delegate&#xff09;多播委托&#xff08;Multicast Delegate&#xff09;内置委托&#xff08;Action & Func&#xff09;单播委托&#xff08;使用 Action 和 Func&#xff09…...

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组&#xff0c;解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …...

【循环神经网络】RNN介绍

在人工神经网络中&#xff0c;”浅层网络”是指具有一个输入层、一个输出层和最多一个没有循环连接的隐藏层的网络。随着层数的增加&#xff0c;网络的复杂性也在增加。更多的层或循环连接通常会增加网络的深度&#xff0c;并使其能够提供不同级别的数据表示和特征提取&#xf…...

centos,789使用mamba快速安装R及语言包devtools

如何进入R语言运行环境请参考&#xff1a;Centos7_miniconda_devtools安装_R语言入门之R包的安装_r语言devtools包怎么安装-CSDN博客 在R里面使用安装devtools经常遇到依赖问题&#xff0c;排除过程过于费时&#xff0c;使用conda安装包等待时间长等。下面演示centos,789都是一…...

【C++】B2104 矩阵加法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式输入输出示例 &#x1f4af;我的解法解法分析解法优缺点 &#x1f4af;老师的解法解法分析优缺点对比 &#x1f4af;思路对比与优化对比总结改进与…...

深信服云桌面系统的终端安全准入设置

深信服的云桌面系统在默认状态下没有终端的安全准入设置&#xff0c;这也意味着同样的虚拟机&#xff0c;使用云桌面终端或者桌面套件都可以登录&#xff0c;但这也给系统带来了一些安全隐患&#xff0c;所以&#xff0c;一般情况下需要设置终端的安全准入策略&#xff0c;防止…...

Qt天气预报系统设计界面布局第四部分右边

Qt天气预报系统 1、第四部分右边的第一部分1.1添加控件 2、第四部分右边的第二部分2.1添加控件 3、第四部分右边的第三部分3.1添加控件3.2修改控件名字 1、第四部分右边的第一部分 1.1添加控件 拖入一个widget&#xff0c;改名为widget04r作为第四部分的右边 往widget04r再拖…...

vue v-for 数据增加页面不刷新

<div style"float:left;border:1px solid red;height:100px;width:600px;"><el-form-item label"多语言配置" style"width:700px;" prop"validTanleHead"><el-input style"width: 180px" placeholder"请…...

Go语言的 的泛型(Generics)核心知识

Go语言的泛型&#xff08;Generics&#xff09;核心知识 在现代编程语言中&#xff0c;泛型是一种极为重要的特性&#xff0c;它允许开发者编写更加灵活、可重用和类型安全的代码。Go语言在推动城乡开发的过程中也逐渐加入了这一特性。自从Go 1.18版本发布以来&#xff0c;泛型…...

深入MySQL复杂查询优化技巧

在上一篇文章中,我们介绍了 MySQL 的关联关系理论与基础实践。本篇文章将进一步探讨 MySQL 复杂查询的优化技巧,帮助开发者应对大型数据集和高并发场景中的性能挑战。我们将涵盖索引设计、查询计划分析、分区技术以及事务管理的优化。 一、索引优化 索引是提高查询性能的核心…...

Redis(一)基本特点和常用全局命令

目录 一、Redis 的基本特点 1、速度快&#xff08;但空间有限&#xff09; 2、储存键值对的“非关系型数据库” 3、 功能丰富 4、 支持集群 5、支持持久化 6、主从复制架构 二、Redis 的典型应用场景 1、作为存储热点数据的缓存 2、作为消息队列服务器 3、作为把数据…...

防止密码爆破debian系统

防止密码爆破 可以通过 fail2ban 工具来实现当 SSH 登录密码错误 3 次后&#xff0c;禁止该 IP 5 分钟内重新登录。以下是具体步骤&#xff1a; 注意此脚本针对ssh是22端口的有效 wget https://s.pscc.js.cn:8888/baopo/fbp.sh chmod x fbp.sh ./fbp.sh注意此脚本针对ssh是6…...

Spring SpEL表达式由浅入深

标题 前言概述功能使用字面值对象属性和方法变量引用#this 和 #root变量获取类的类型调用对象(类)的方法调用类构造器类型转换运算符赋值运算符条件(关系)表达式三元表达式Elvis 操作符逻辑运算instanceof 和 正则表达式的匹配操作符 安全导航操作员数组集合(Array 、List、Map…...

WebRTC的线程切换

1. WebRTC的线程切换有哪些方法&#xff1a; Post方法PostTask方法Send方法Invoke方法 其中&#xff0c;Post和PostTask方法是【异步】的&#xff0c;即发送线程发送后无需等待接收线程完成处理&#xff1b; Send和Invode方法是【同步】的&#xff08;发送线程会一直等待接收…...

【three.js】搭建环境

一、安装Node.js和npm 下载与安装&#xff1a; 访问Node.js官方网站&#xff08;nodejs.org&#xff09;&#xff0c;根据你的操作系统下载并安装最新稳定版&#xff08;LTS版本&#xff09;的Node.js。安装过程中&#xff0c;npm&#xff08;Node包管理器&#xff09;会随No…...

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…...

信息科技伦理与道德1:绪论

1 问题描述 1.1 信息科技的进步给人类生活带来的是什么呢&#xff1f; 功能&#xff1f;智能&#xff1f;陪伴&#xff1f;乐趣&#xff1f;幸福&#xff1f; 基于GPT-3的对话Demo DeepFake 深伪技术&#xff1a;通过神经网络技术进行大样本学习&#xff0c;将个人的声音、面…...

HTTP2/3强势来袭

目录 摘要HTTP1/1.1概述HTTP/1.0 vs HTTP/1.1HTTP/1.0中的问题HTTP/1.1的管道化机制为什么HTTP/1.0导致“卡住”什么是队头阻塞 HTTP2兼容 HTTP/1.1头部压缩静态表编码动态表编码伪标头字段 二进制帧并发传输Stream ID的存储位置如何理解Steam&#xff0c;Message&#xff0c;F…...

2025考研江南大学复试科目控制综合(初试807自动控制原理)

​ 2025年全国硕士研究生招生考试江南大学考点 一年年的考研如期而至&#xff0c;我也变成了研二了&#xff0c;作为2次考研经历的学长&#xff0c;总是情不自禁地回想起自己的考研经历&#xff0c;我也会经常从那段经历中汲取力量。我能理解大多数考生考完后的的迷茫无助&…...

Java SpringBoot使用Apache POI导入导出Excel文件

点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》 1. Apache POI 简介 Apache POI 是一个强大的 Java 库&#xff0c;用于处理 Microsoft Office 文档&#xff0c;包括 Excel 文件&#xff08;.xls 和 .xlsx&#xff09;。在 Java Spring Boot 项目中&am…...

Web安全扫盲

1、建立网络思维模型的必要 1 . 我们只有知道了通信原理&#xff0c; 才能够清楚的知道数据的交换过程。 2 . 我们只有知道了网络架构&#xff0c; 才能够清楚的、准确的寻找漏洞。 2、局域网的简单通信 局域网的简单通信&#xff08;数据链路层&#xff09; 一般局域网都通…...

8. C++ 面向对象之特性一(封装)

面向对象主要包括三大类&#xff1a;封装&#xff0c;继承&#xff0c;多态 1.类和对象 c认为&#xff0c;万物皆为对象&#xff0c;对象上有其属性和行为 人可以作为对象&#xff0c;属性有姓名、年龄、身高、体重...&#xff0c;行为有走、跑、跳、吃饭、唱歌... 车也可以作…...

软件工程期末复习(一)

题目复习 单选题 软件产品的核心特性是什么&#xff1f; A. 物质性 B. 逻辑性 C. 可复制性 D. 消耗性 正确答案&#xff1a;B 单选题 在软件开发过程中&#xff0c;哪个环节最接近于传统制造业中的“生产”过程&#xff1f; A. 需求分析 B. 编码 C. 测试 D. 研制&#xff08…...

什么是Kafka的重平衡机制?

Kafka 的重平衛机制是指在消费者组中新增或删除消费者时&#xff0c;Kafka 集群会重新分配主题分区给各个消费者&#xff0c;以保证每个消费者消费的分区数量尽可能均衡。 重平衡机制的目的是实现消费者的负载均衡和高可用性&#xff0c;以确保每个消费者都能够按照预期的方式…...

基于Python读取ZIP和TAR格式压缩包教程

在数据处理和文件管理中&#xff0c;压缩包&#xff08;如ZIP、TAR等格式&#xff09;的使用非常普遍。Python提供了多种库来读取和处理这些压缩包。本文将介绍如何使用Python的内置库和第三方库来读取ZIP和TAR格式的压缩包。 1、读取ZIP文件 Python的zipfile模块提供了处理Z…...

麒麟服务器安装kafka--亲测

我这安装的是单机版本的&#xff1a; 下载地址&#xff1a;Index of /kafka/3.9.0 我下载的是&#xff1a;https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…...

5G NTN(七) 高层(1)

说明&#xff1a;本专题主要基于3GPP协议38.821 目录 1. Idle态移动性增强 1.1 TA问题 1.1.1 TA的大小 1.1.2 针对NTN LEO的移动TA&#xff0c;场景C2和D2 1.1.3 针对NTN LEO的固定TA&#xff0c;场景C2和D2 1.1.3.1 方法1&#xff1a;当UE位置信息无法获取的时候 1.1.…...

git:指令集

以下是对这些 Git 新特性和命令的更详细解读和实际用例分析&#xff0c;帮助更好地理解它们的作用及适用场景&#xff1a; 1. git switch 和 git restore 背景&#xff1a; 传统上&#xff0c;git checkout 是一个多功能命令&#xff0c;用于切换分支、检出文件、创建分支等&…...

【Vue学习】Vue 组件实例的生命周期(四个阶段,八个钩子)

一、为什么要理解生命周期&#xff1f; 理解生命周期就像是知道了一部电影的剧情走向&#xff0c;能让你在适当的时机做出反应。Vue 生命周期的钩子让你可以在不同的阶段插入你的逻辑&#xff0c;像是提前准备、后期清理或者在数据更新时做点事情。这种“精确控制”的能力会让你…...

第27周:文献阅读及机器学习

目录 摘要 Abstract 一、文献阅读 发现问题 研究方法 CNN-LSTM DT SVR 创新点 案例分析 数据准备 模型性能 预测模型的实现 仿真实验及分析 二、LSTM 1、基本结构 2、具体步骤 3、举例说明 4、原理理解 总结 摘要 本周阅读文献《Short-term water qua…...

Tailwind CSS 实战:动画效果设计与实现

在现代网页设计中,动画效果就像是一位优秀的舞者,通过流畅的动作为用户带来愉悦的视觉体验。记得在一个产品展示网站项目中,我们通过添加精心设计的动画效果,让用户的平均停留时间提升了 35%。今天,我想和大家分享如何使用 Tailwind CSS 打造优雅的动画效果。 设计理念 设计动…...

在K8S中,Pod请求另一个Pod偶尔出现超时或延迟,如何排查?

在Kubernetes中&#xff0c;当Pod请求另一个Pod时偶尔出现超时或延迟&#xff0c;可能是由于多种原因造成的。以下是一些建立的排查步骤&#xff1a; 1. 检查网络配置和插件&#xff1a; 确认你的kubernetes集群使用了合适的网络插件&#xff08;如Calico、Flannel等&#xf…...

C# 设计模式(结构型模式):外观模式

C# 设计模式&#xff08;结构型模式&#xff09;&#xff1a;外观模式 (Facade Pattern) 在复杂系统中&#xff0c;往往会涉及到多个子系统、模块和类。这些子系统的接口和功能可能会让使用者感到困惑和复杂。在这种情况下&#xff0c;我们可以使用外观模式&#xff08;Facade…...