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

哈希表-数据结构

一、哈希表基本概念


哈希表(也称为散列表)是根据键而直接访问在内存存储位置的数据结构,也就是说实际上是经过哈希函数进行映射,映射道表中一个位置来访问记录,这个存放记录的数组称为散列表。

哈希函数:就是将要存储的数据经过运算,映射到我们要存储的位置

二、哈希的本质

本质是一给数组,将通过哈希函数映射,将一定的数据放在指定的位置,再通过映射能够很快找到数据。

三、哈希冲突(哈希矛盾)


就是经过运算,不同的数据,但是,对应相同的位置,而前面这个地方已经将数据存储,要尽可能避免冲突

四、解决哈希冲突的办法
4.1、开放寻址法


简单点来说,对于冲突元素,找到空位置,放进去即可

开放寻址法(Open Addressing)是一种解决哈希冲突的方法,它在哈希表中直接解决冲突,即当两个或多个键的哈希值相同时,它们会尝试在哈希表中找到下一个空闲位置来存储数据。开放寻址法的主要思想是所有的元素都存储在哈希表中,而不是像链地址法那样在表外链接。

4.2、链地址法

链地址法(Separate Chaining)是另一种解决哈希冲突的方法。在这种方法中,哈希表的每个槽(slot)或桶(bucket)都关联一个链表,我们把具有相同属性的元素进行连接,最后只需要我们进行查找的时候只需要进行哈希映射,找到数组的地址之后,去遍历里面的链表,找到对应的元素。用于存储具有相同哈希值的所有元素。

工作原理
1. **哈希函数**:首先,使用哈希函数将键映射到哈希表的一个位置。
2. **冲突处理**:如果两个键映射到同一个位置(即发生冲突),它们会被存储在同一个链表中。
3. **插入操作**:插入新元素时,首先计算其哈希值,然后在对应的链表中添加新元素。
4. **查找操作**:查找元素时,首先计算其哈希值,然后在对应的链表中遍历查找。
5. **删除操作**:删除元素时,首先找到对应的链表,然后在链表中找到并删除元素。

### 优点
- **简单易实现**:链地址法的实现相对简单,容易理解。
- **动态扩容**:可以通过调整链表的大小来动态地处理负载因子的变化,从而保持操作的效率。

### 缺点
- **额外空间**:每个槽需要额外的空间来存储链表的指针,这可能会增加内存的使用。
- **性能依赖于负载因子**:当哈希表的负载因子(即表中元素数量与槽数量的比率)较高时,链表可能会变得较长,导致查找效率下降。

### 性能优化
- **动态扩容**:随着元素的增加,可以动态地增加哈希表的大小,以保持负载因子在一个合理的范围内。
- **负载因子控制**:通过控制负载因子,可以平衡内存使用和查找效率。

链地址法是哈希表中常用的冲突解决策略之一,适用于键值对的存储和快速查找。

五、哈希操作

1、哈希表的创建

int hash_function(char key)
{if (key >= 'a' && key <= 'z'){return key-'a';}else if (key >= 'A' && key <= 'Z'){return key-'A';}else{return HASH_SIZE-1;}
}

2、哈希表的插入

int insert_hashtable(HSDataTYpe data)
{int addr = hash_function(data.name[0]);HSNode_t *pnode = malloc(sizeof(HSNode_t));if(NULL == pnode){perror("fail malloc");return -1;}pnode->data = data;pnode->pnext = NULL;pnode->pnext = hashtable[addr];hashtable[addr] = pnode;return 0;
}vv

3、哈希表的遍历

void each_for_hsnode()
{for(int i = 0;i < HASH_SIZE;++i){HSNode_t *pnode = hashtable[i];while(pnode != NULL){printf("name = %s\n",pnode->data.name);printf("telephone = %s\n",pnode->data.tel);pnode = pnode->pnext;}}printf("\n");
}

4、哈希表的查找

void find_hsnode(HSDataTYpe data)
{int addr = hash_function(data.name[0]);HSNode_t *pnode = hashtable[addr];while(pnode != NULL){if(strcmp(pnode->data.name,data.name) == 0){printf("name = %s\n",pnode->data.name);printf("telephone = %s\n",pnode->data.tel);break;}pnode = pnode->pnext;}printf("\n");
}

5、哈希表的销毁

void destory_hsnode()
{for(int i = 0;i < HASH_SIZE;++i){HSNode_t *p = NULL;while(hashtable[i]!= NULL){p = hashtable[i];hashtable[i] = p->pnext;free(p);}}
}

相关文章:

哈希表-数据结构

一、哈希表基本概念 哈希表&#xff08;也称为散列表&#xff09;是根据键而直接访问在内存存储位置的数据结构&#xff0c;也就是说实际上是经过哈希函数进行映射&#xff0c;映射道表中一个位置来访问记录&#xff0c;这个存放记录的数组称为散列表。 哈希函数&#xff1a;就…...

指针之旅(4)—— 指针与函数:函数指针、转移表、回调函数

目录 1. 函数名的理解 1.1 “函数名”和“&函数名”的含义 1.2 函数(名)的数据类型 2. 函数指针(变量) 2.1 函数指针(变量)的创建格式 2.2 函数指针(变量)的使用格式 2.3 例子 判别 3. typedef 关键字 3.1 typedef的作用 3.2 typedef的运作逻辑 和 函数指针类型…...

打造线上+线下相结合的O2O平台预约上门服务小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 本系统采用前后端分离的设计架构&#xff0c;前端以微信小程序为载体&#xff0c;提供直观、易用的用户界面&#xff1b;后端则采用稳定的服务器架构&#xff0c;确保数据处理的高效与安全。系统主要包括用户端、商户端和管理员端三大模块&#xff0c;通过API接口实现…...

python sys模块

在Python中&#xff0c;sys模块提供了访问和使用解释器的许多功能的方法&#xff0c;包括命令行参数、环境变量、路径管理、标准输入输出流等。sys模块是Python的标准库的一部分&#xff0c;不需要额外安装即可使用。 常用的sys模块功能 1. sys.argv sys.argv是一个包含命令…...

【Linux 报错】SSH服务器拒绝了密码。请再试一次。(xshell)

出现该错误 可能的原因&#xff1a; 你写入的登录密码错误了&#xff0c;错误原因有&#xff1a; 1、本来输入就错误了 2、创建用户时&#xff0c;只创建了用户名&#xff0c;但密码没有重新设置 3、多人使用同一台服务器时&#xff0c;该服务器管理员&#xff08;本体&#x…...

云计算实训43——部署k8s基础环境、配置内核模块、基本组件安装

一、前期系统环境准备 1、关闭防火墙与selinux [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus…...

TAbleau 可视化 干货分享 | 简单三步助你打造完美仪表板

只需单击几下&#xff0c;你将能轻松创建美观、信息丰富的可视化效果、节省时间并推动业务向前发展&#xff01; 借助精心设计的仪表板&#xff0c;分析师可以更好地理解复杂数据背后的信息&#xff0c;更有效地向他人分享你的见解&#xff0c;从而做出更明智的决策。 值得思考…...

JVM性能调优之5种垃圾收集器

JDK垃圾收集器 一、Serial GC垃圾收集器Serial GC的工作原理Serial GC的特点Serial GC的配置参数Serial GC的适用场景Serial GC的优缺点优点&#xff1a;缺点&#xff1a; Serial GC的总结 二、Parallel GC垃圾收集器Parallel GC的工作原理Parallel GC的特点Parallel GC的配置参…...

基于单片机的仔猪喂饲系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…...

Helm Deploy Online Rancher v2.9.1

文章目录 准备安装查看下载 准备 $ kubectl get node NAME STATUS ROLES AGE VERSION kube-master01 Ready control-plane 19d v1.29.5 kube-node01 Ready <none> 19d v1.29.5 kube-node02 Ready <none&…...

【办公效率】Axure会议室预订小程序原型图,含PRD需求文档和竞品分析

作品说明 作品页数&#xff1a;共50页 兼容版本&#xff1a;Axure RP 8/9/10 应用领域&#xff1a;中小型企业的会议室在线预订 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为会议室预订小程序原型图&#xff0c;定位于拥有中大型…...

论文解析一: SuperPoint 一种自监督网络框架,能够同时提取特征点的位置以及描述子

目录 SuperPoint&#xff1a;一种自监督网络框架&#xff0c;能够同时提取特征点的位置以及描述子1.特征点预训练2.自监督标签3.整体网络结构3.1 先对图像进行卷积3.2 特征点提取部分&#xff08;Interest Point Decoder&#xff09;3.3 特征描述子提取部分&#xff08;Descrip…...

【评估指标】Fβ-score

1. Fβ-score 概述 Fβ-score 是一种综合考量精确率&#xff08;precision&#xff09;和召回率&#xff08;recall&#xff09;的分类评估指标。其公式为&#xff1a; 1.1 Precision&#xff08;精确率&#xff09;&#xff1a;预测为正类的样本中&#xff0c;实际为正类的比…...

1963Springboot个性化音乐推荐管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…...

solidity从入门到精通(持续更新)

我一度觉得自己不知何时变成了一个浮躁的人&#xff0c;一度不想受外界干扰的我被干扰了&#xff0c;再无法平静的去看一本书&#xff0c;但我仍旧希望我能够克服这些&#xff0c;压抑着自己直到所有的冲动和奇怪的思想都无法再左右我行动。 自律会让你更加自律&#xff0c;放纵…...

UEFI入门(二):edk2项目编译流程

UEFI入门&#xff08;二&#xff09;&#xff1a;edk2项目编译流程 一、编译构建流程&#xff1a;1. 安装依赖工具2. 初始化构建环境3. 配置工具链和目标4. 定义平台配置5. 构建并编译 二、uefi-tools编译edk2实践&#xff1a;1. 克隆EDK2 项目2. 构建并编译 参考文章&#xff…...

局域网一套键鼠控制两台电脑(台式机和笔记本)

服务端&#xff08;有键盘和鼠标的电脑作为服务端&#xff09; 下载软件 分享文件&#xff1a;BarrierSetup-2.3.3.exe 链接&#xff1a;https://pan.xunlei.com/s/VO66rAZkzxTxVm-0QRCJ33mMA1?pwd4jde# 配置服务端 一&#xff0c; 二&#xff0c; 客户端屏幕名称一定要和…...

最新Nessus2024.9.8版本主机漏洞扫描/探测工具下载Windows版

Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上遥控&#xff0c;进行系统的漏洞分析扫描…...

关于使用 @iconify/vue2图标库组件的离线使用

Iconify 是最通用的图标框架&#xff0c;将各种图标库的图标集中在这里的一个组件库&#xff0c;例如ant-design,element-ui等 网站地址如下 https://iconify.design/getting-started/ 1.安装依赖 这两个包提供了图标组件和离线图标数据的支持。 npm install iconify/vue2 i…...

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据&#xff0c;将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdf…...

实战指南:基于快马平台,快速构建可部署的unet卫星图像分割系统

今天想和大家分享一个实战项目&#xff1a;基于UNet的卫星图像建筑物分割系统。这个项目特别适合在InsCode(快马)平台上快速搭建&#xff0c;因为它涉及从数据处理到模型部署的完整流程&#xff0c;而平台的一键部署功能正好能省去繁琐的环境配置工作。 项目背景与需求分析 卫星…...

Pixel Couplet Gen应用场景:微信小程序开发者如何复用像素皇城UI组件

Pixel Couplet Gen应用场景&#xff1a;微信小程序开发者如何复用像素皇城UI组件 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的创新应用。作为微信小程序开发者&#xff0c;您可以直接复用其UI组件库&#xff0c;快速构建具有以下特点的应…...

Python MCP服务部署卡在step3?揭秘92%开发者忽略的config.toml权限校验机制(配置失效终极诊断指南)

第一章&#xff1a;Python MCP服务部署卡在step3的典型现象与问题定位当执行 Python MCP&#xff08;Model Control Platform&#xff09;服务自动化部署脚本时&#xff0c;step3&#xff08;即服务容器化构建与镜像推送阶段&#xff09;常出现长时间无响应、日志停滞于 Buildi…...

Pikachu靶场实战:File Inclusion漏洞利用与防御全解析

1. File Inclusion漏洞初探&#xff1a;从理论到靶场实战 文件包含&#xff08;File Inclusion&#xff09;漏洞是Web安全领域最常见的漏洞类型之一&#xff0c;它允许攻击者通过参数控制加载服务器上的任意文件。想象一下&#xff0c;你家的门锁如果设计不当&#xff0c;小偷只…...

从手机端到边缘设备:聊聊轻量化模型设计中FLOPs、MACs和Params的权衡艺术

从手机端到边缘设备&#xff1a;轻量化模型设计中FLOPs、MACs和Params的权衡艺术 当我们在智能手机上使用人脸解锁功能&#xff0c;或是通过智能音箱与AI助手对话时&#xff0c;背后运行的往往是经过精心设计的轻量化神经网络模型。这些模型需要在有限的算力和内存资源下&#…...

阿里语音识别模型WebUI实战:一键部署,会议录音秒变文字稿

阿里语音识别模型WebUI实战&#xff1a;一键部署&#xff0c;会议录音秒变文字稿 1. 引言&#xff1a;语音转文字的高效解决方案 在日常工作中&#xff0c;会议录音转文字是一项耗时又枯燥的任务。传统的人工听写方式不仅效率低下&#xff0c;还容易出错。现在&#xff0c;借…...

二手车价格预测:特征工程比调参重要10倍!我的天池赛从800分降到490分的实战复盘

二手车价格预测实战&#xff1a;如何通过特征工程将MAE从800降到490 二手车市场向来以信息不对称为特点&#xff0c;价格波动大、影响因素复杂。对于数据科学家来说&#xff0c;准确预测二手车价格不仅是一个有趣的机器学习挑战&#xff0c;更是一个极具商业价值的实际问题。在…...

Port-Hamiltonian建模在ROS2中的实战:用Python实现双机器人能量交换仿真

Port-Hamiltonian建模在ROS2中的实战&#xff1a;用Python实现双机器人能量交换仿真 当两个机器人在协作搬运物体时&#xff0c;它们的能量如何通过接触点传递&#xff1f;当一群无人机编队飞行时&#xff0c;如何数学描述它们之间无形的能量交互&#xff1f;这正是Port-Hamilt…...

银行客户流失预警:用SMOTE与集成学习模型(如EasyEnsemble)应对数据不平衡挑战

银行客户流失预警&#xff1a;用SMOTE与集成学习模型应对数据不平衡挑战 在金融行业&#xff0c;客户流失预警一直是银行风控体系中的核心环节。当银行面临客户流失&#xff08;少数类&#xff09;远少于未流失客户&#xff08;多数类&#xff09;的情况时&#xff0c;传统的机…...

Kali Linux 2026.1 重磅发布,内核升至6.18

作为全球最受欢迎的渗透测试与安全审计Linux发行版,Kali Linux在2026年迎来了年度首发版本——Kali Linux 2026.1。这次更新不仅延续了每年“.1”版本的视觉刷新传统,更特别致敬BackTrack Linux 20周年,引入“BackTrack模式”,同时升级内核至6.18,并新增8款实用工具。无论…...