数据结构 --- 哈希表
哈希表(Hash Table),也叫散列表,是一种根据关键码值(Key value)而直接进行访问的数据结构。
一、基本原理
-
哈希函数
- 哈希表通过一个特定的哈希函数,将关键码映射到表中的一个位置。这个位置通常称为哈希地址或索引。
- 例如,对于一个整数关键码,可以使用简单的取余函数作为哈希函数,将关键码对哈希表的大小取余,得到对应的哈希地址。
-
冲突解决
- 由于不同的关键码可能会映射到相同的哈希地址,这就会产生冲突。解决冲突的方法有多种,常见的有开放寻址法和链地址法。
- 开放寻址法:当发生冲突时,通过探测哈希表中的其他位置来寻找空闲位置。例如线性探测,就是依次检查下一个位置,直到找到空闲位置。
- 链地址法:将哈希地址相同的元素存储在一个链表中。当查找元素时,先通过哈希函数计算出哈希地址,然后在对应的链表中进行查找。
二、特点和优势
-
快速查找
- 哈希表能够在平均情况下以接近常数时间的复杂度进行查找、插入和删除操作,效率非常高。
- 只要哈希函数设计合理,能够将关键码均匀地分布在哈希表中,就可以快速定位到元素的位置。
-
灵活性
- 可以存储不同类型的关键码和值,只要能够为这些关键码定义合适的哈希函数。
- 适用于各种数据结构和算法中,如数据库索引、编译器符号表、缓存等。
三、应用场景
-
数据库索引
- 在数据库中,哈希表可以用于快速查找特定的数据行。通过将表中的关键列作为关键码,经过哈希函数计算得到哈希地址,然后将数据存储在对应的位置。这样在查询时,可以快速定位到数据所在的位置,提高查询效率。
-
缓存
- 缓存系统通常使用哈希表来存储已经访问过的数据,以便下次访问时能够快速获取。当需要访问某个数据时,先计算其哈希地址,然后在哈希表中查找。如果找到,则直接返回缓存中的数据;如果没有找到,则从数据源获取数据并存储到缓存中。
-
编译器符号表
- 在编译器中,符号表用于存储程序中的变量、函数等标识符的信息。哈希表可以作为符号表的实现方式,通过将标识符作为关键码,快速查找其对应的类型、作用域等信息。
以存储通讯录为例
#ifndef __HASH_H__
#define __HASH_H__#define HASH_SIZE 27 //26个字母表数量以及符号typedef struct per //数据结构体
{char name[32];char tel[32];
}hsdatatype;typedef struct hsnode //结构体类型
{hsdatatype data;struct hsnode *pnext;
}hsnode_t;int insert_hashtable(hsdatatype data);
void hashtable_array();
void destroy_hash();#endif
#include "hash.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>hsnode_t *hashtable[HASH_SIZE] = {NULL};int hash_func(char key) //哈希函数
{if(key >= 'a' && key <= 'z'){return key - 'a';}else if(key >= 'A' && key <= 'Z'){return key - 'A';}else{return HASH_SIZE - 1;}
}int insert_hashtable(hsdatatype data) //插入数据,以哈希键值插入
{int addr = hash_func(data.name[0]);hsnode_t *p = (hsnode_t *)malloc(sizeof(hsnode_t));if(!p)return -1;p->data = data;p->pnext = NULL;/*if(!hashtable[addr])hashtable[addr] = p;else {while(hashtable[addr]->pnext && !strcmp(hashtable[addr]->data.name,data.name)){hashtable[addr] = hashtable[addr]->pnext;}p->pnext = hashtable[addr];hashtable[addr]->pnext = p;}*/p->pnext = hashtable[addr];hashtable[addr] = p;return 0;
}void link_array(hsnode_t *p)
{while(p){printf("%s %s\n",p->data.name,p->data.tel);p = p->pnext;}
}void hashtable_array() //遍历哈希表
{int i = 0;while(i < HASH_SIZE){/*while(hashtable[i]){//printf("%s %s\n",hashtable[i]->data.name,hashtable[i]->data.tel);//hashtable[i] = hashtable[i]->pnext;link_array(hashtable[i]);}*/link_array(hashtable[i]);++i;}
}hsnode_t *find_hash(char *name) //通过名字在哈希表中查找数据,返回地址
{int addr = hash_func(name[0]);hsnode_t *p = hashtable[addr];while(p){if(!strcmp(name,p->data.name)){return p;}p = p->pnext;}return NULL;
}void destroy_link(hsnode_t *p) //销毁链表
{while(p){hsnode_t *q = p;p = p->pnext;free(q);}
}void destroy_hash() //销毁哈希表
{int i = 0;while(i < HASH_SIZE){destroy_link(hashtable[i]);++i;}
}
相关文章:
数据结构 --- 哈希表
哈希表(Hash Table),也叫散列表,是一种根据关键码值(Key value)而直接进行访问的数据结构。 一、基本原理 哈希函数 哈希表通过一个特定的哈希函数,将关键码映射到表中的一个位置。这个位置通常…...
Linux相关:在阿里云下载centos系统镜像
文章目录 1、镜像站2、下载方式一2.1、第一步打开镜像站地址2.2 下载地址: https://mirrors.aliyun.com/centos/2.3、选择7版本2.4、镜像文件在isos文件夹中2.5、选择合适的版本 3、下载镜像快捷方式 1、镜像站 阿里云镜像站地址 2、下载方式一 2.1、第一步打开镜像站地址 2…...
24. 线模型对象
线模型Line渲染顶点数据 下面代码是把几何体作为线模型Line (opens new window)的参数,你会发现渲染效果是从第一个点开始到最后一个点,依次连成线。 // 线材质对象 const material new THREE.LineBasicMaterial({color: 0xff0000 //线条颜色 }); //…...
EasyExcel 快速入门
目录 一、 EasyExcel简介 官网链接: 代码链接: 二、 EasyExcel快速上手 引入依赖: 设置Excel相关注解 编写对应的监听类: 简单写入数据: 简单读取数据: 不需要使用监听器: 需要使…...
Sparse4D v1
Sparse4D: Multi-view 3D Object Detection with Sparse Spatial-Temporal Fusion Abstract 基于鸟瞰图 (BEV) 的方法最近在多视图 3D 检测任务方面取得了重大进展。与基于 BEV 的方法相比,基于稀疏的方法在性能上落后,但仍然有很多不可忽略的优点。为了…...
速盾:你知道高防 IP 和高防 CDN 的区别吗?
在当今网络安全形势日益严峻的情况下,网站的安全防护成为了企业和个人关注的焦点。高防 IP 和高防 CDN 作为两种常见的网络安全防护手段,被广泛应用于网站的安全防护中。那么,高防 IP 和高防 CDN 有什么区别呢?防护网站哪个更好呢…...
HTML和CSS网页制作成品
HTML和CSS网页制作成品 一、引言 1. 背景介绍 在当今数字化时代,网页已成为信息传递和交流的重要媒介。HTML和CSS作为网页制作的基石,对于构建美观、功能丰富的网站至关重要。本文将详细介绍如何使用HTML和CSS来制作一个网页成品。 2. 目的和重要性 …...
Ai+若依(集成easyexcel实现excel表格增强)
EasyExcel 介绍 官方地址:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一…...
钻机、塔吊等大型工程设备,如何远程维护、实时采集运行数据?
在建筑和工程领域,重型设备的应用不可或缺,无论是在道路与桥梁建设、高层建筑施工,还是在风电、石油等能源项目的开发中,都会用到塔吊、钻机等大型机械工程设备。 随着数字化升级、工业4.0成为行业发展趋势,为了进一步…...
【AutoX.js】选择器 UiSelector - 查找包名
文章目录 原文:https://blog.c12th.cn/archives/38.html选择器 UiSelector - 查找包名笔记直接查找包名双层判断(推荐)查找最外层控件的子控件 最后 原文:https://blog.c12th.cn/archives/38.html 选择器 UiSelector - 查找包名 笔记 AutoX.js UiSelec…...
ERP进销存多仓库管理系统源码 带完整的安装代码包以及搭建部署教程
系统概述 ERP进销存多仓库管理系统是一款专为中小企业量身定制的集成化管理软件,它集成了采购管理、销售管理、库存管理、财务管理以及多仓库协同作业等核心模块。通过统一的平台,企业可以实时掌握商品从入库到出库的全过程,实现库存的自动化…...
数据清洗-缺失值填充-对XGBoost参数优化填充
目录 一、安装所需的python包二、采用XGboost算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1 代码运行过程截屏:2.2.2 填充后的数据截屏:三、网格搜索(Grid Search)对 XGBoost 模型的超参数进行优化原理介绍3.1 说明3.2 参数优化的原理1. 网格搜索(…...
Qt_按钮类控件
目录 1、QAbstractButton 2、设置带图标的按钮 3、设置带有快捷键的按钮 4、QRadioButtion(单选按钮) 4.1 QButtonGroup 5、QCheckBox 结语 前言: 按钮类控件是Qt中最重要的控件类型之一,该类型的控件可以通过鼠标的点击…...
union 的定义和基本结构以及用途
在 C 语言中,union(联合体) 是一种数据结构,它允许多个成员共享相同的内存空间。换句话说,联合体中的所有成员都存储在同一块内存区域,不同的成员会占用相同的内存地址,但在同一时刻只能保存一个…...
混合整数规划及其MATLAB实现
目录 引言 混合整数规划的基本模型 混合整数规划的求解方法 MATLAB中的混合整数规划实现 示例:多变量系统的混合整数规划 表格总结:混合整数规划的求解方法与适用场景 结论 引言 混合整数规划(Mixed Integer Programming, MIP…...
【数据结构】6——图1,概念
数据结构6——图1,概念 文章目录 数据结构6——图1,概念基本概念图的分类图的表示方法 基本概念 由 顶点(Vertex) 和 边(Edge) 组成的集合。顶点表示图中的点,而边表示顶点之间的连接。记为 G …...
技术周总结 09.09~09.15周日(C# WinForm WPF)
文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中,WPF和WinForm的区别和联系?联系:区别: 二、09.12 周四2.1)问题01:visual studio的相关快捷键有哪些?通用快捷键编辑导航调试窗口管理 2…...
4K投影仪选购全攻略:全玻璃镜头的当贝F6,画面细节纤毫毕现
在当今的投影市场上,4K投影仪已经成了主流产品,越来越多家庭开始关注如何选择一款性价比高、口碑好的4K投影仪。4K投影仪其实指的是具备3840*2160像素分辨率投影仪,它能够提供更清晰、更细腻、更真实的画面效果。 那么4K投影仪该怎么选&…...
除了字符串前导的*号之外,将串中其它*号全部删除
要求 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。 例如,字符串中的内容为:-**…...
SpringBoot开发——使用@Slf4j注解实现日志输出
文章目录 1、Lombok简介2、SLF4J简介3、实现步骤3.1 创建SpringBoot项目3.2 添加依赖3.3 使用 Slf4j 注解3.4 输出日志信息 4、结论 在现代Java开发中,日志记录是至关重要的。它不仅帮助开发者调试代码,还便于监控系统运行状态和性能。 Lombok 和 SLF4J …...
3分钟解锁CAJ文件:如何将知网专属格式转换为可搜索PDF
3分钟解锁CAJ文件:如何将知网专属格式转换为可搜索PDF 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https://gitcode.com/gh…...
图像处理入门避坑:拉普拉斯锐化中的‘标定’到底在做什么?用NumPy手撕一遍就懂了
图像处理入门避坑:拉普拉斯锐化中的‘标定’到底在做什么?用NumPy手撕一遍就懂了 当你第一次尝试用拉普拉斯算子锐化图像时,可能会遇到一个令人困惑的现象:明明按照教程写了代码,输出的却是一张全黑或全白的图片。这不…...
八千多条提示词,装成你的「随身工具箱」
做图、想创意的时候,最烦的不是「不会写」,而是找不到、和不好管,写过的好句子不知道丢哪了。群里转发的、自己试出来的、收藏夹里吃灰的链接——真要用时,往往只记得个大概,翻半天也找不回来。 BoltPrompt 提示词库想…...
番茄小说下载器:从网页到电子书的完整离线阅读解决方案
番茄小说下载器:从网页到电子书的完整离线阅读解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 番茄小说下载器是一款基于Rust语言开发的开源工具ÿ…...
RK3568平台开发系列讲解(热拔插篇)内核是如何发送事件到用户空间
🚀返回专栏总目录 文章目录 一、相关接口函数 二、udevadm 命令 三、实验程序 四、运行效果 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、相关接口函数 kobject_uevent 是 Linux 内核中的一个函数, 用于生成和发送 uevent 事件。 它是 udev 和其他设备管理工具与…...
NGA论坛优化摸鱼体验:终极指南让你的浏览效率提升300%[特殊字符]
NGA论坛优化摸鱼体验:终极指南让你的浏览效率提升300%🔥 【免费下载链接】NGA-BBS-Script NGA论坛增强脚本,给你完全不一样的浏览体验 项目地址: https://gitcode.com/gh_mirrors/ng/NGA-BBS-Script 你是否厌倦了在NGA论坛浏览时被杂乱…...
Austroads:速度管理证据与指导回顾(英) 2026
这份报告是澳大利亚和新西兰道路运输委员会(Austroads)2025 年发布的《车速管理证据与指南回顾》,核心是为更新《道路安全指南:安全车速》(AGRS Part 3)梳理研究证据、 stakeholder 反馈并给出修订建议。下…...
ARM TLBIP指令解析与应用实践
1. ARM TLBIP指令深度解析在ARMv8/v9架构中,TLB(Translation Lookaside Buffer)作为内存管理单元(MMU)的核心组件,负责缓存虚拟地址到物理地址的转换结果。当页表发生变更时,必须及时使TLB中对应的缓存条目失效,以确保内存访问的正…...
Mastra框架全解析:构建AI应用的全栈开发实践
1. 项目概述:一个面向AI应用开发的“全栈式”框架最近在折腾AI应用开发的朋友,估计都绕不开一个核心痛点:如何把大语言模型(LLM)的能力,稳定、高效、低成本地集成到自己的产品里。从调用API、管理对话状态、…...
FPGA新手避坑指南:用Vivado IP核搞定AXI总线,从看懂波形开始
FPGA新手避坑指南:用Vivado IP核搞定AXI总线,从看懂波形开始 第一次在Vivado中看到AXI总线波形时,我盯着屏幕上跳动的信号线完全摸不着头脑。VALID和READY信号像在玩捉迷藏,突发传输的时序如同天书——这大概是每个FPGA初学者都会…...
