哈希表(Hash Table),有时也称为散列表,是一种数据结构,它提供了一种快速存取数据的方法。哈希表利用一个被称为哈希函数的机制将键映射到表中的一个位置来直接访问记录,以此加快查找的速度。哈希表通常支持非常快的插入、删除和查找操作,平均情况下这些操作的时间复杂度为O(1)。

基本概念

键(Key):

用于唯一标识哈希表中每个元素的值。

值(Value):

与键关联的数据或信息。

哈希函数(Hash Function):

用于计算给定键的哈希码,从而确定该键值对在哈希表中的存储位置。

冲突(Collision):

当两个不同的键通过哈希函数得到相同的哈希码时,这种情况称为冲突。解决冲突是设计哈希表时必须考虑的问题。

发生冲突时的解决策略

链地址法(Chaining):

使用链表存储具有相同哈希值的所有元素。因此,每个桶实际上是一个链表,包含所有被哈希到同一个索引的元素。

开放地址法(Open Addressing):

当发生冲突时,寻找下一个空位来存储这个键值对。常见的技术包括线性探测、二次探测和双重哈希等。


哈希表的操作

插入:

根据键计算出哈希值,并将其对应的值存入哈希表中。如果存在冲突,则按照所选的冲突解决策略处理。

查找:

根据键计算出哈希值,然后从相应的槽中找到对应的值。若采用链地址法,还需遍历链表;若采用开放地址法则可能需要沿着探查序列搜索。

删除:

首先查找要删除的键,然后移除它。在开放地址法中,删除后可能还需要重新组织哈希表以保持其正确性。

示例代码:

//哈希表#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int DATATYPE;
typedef struct
{DATATYPE* head;int tlen;
} HSTABLE;HSTABLE* CreateHSTable(int n)
{HSTABLE* hs = malloc(sizeof(HSTABLE));if(NULL == hs){fprintf(stderr,"CreateHSTable malloc");return NULL;}hs->head = malloc(sizeof(DATATYPE)*n);if(NULL == hs->head){fprintf(stderr,"CreateHSTable malloc");return NULL;}hs->tlen = n;for(int i=0; i<n;i++) //给数组设置初值{hs->head[i] = -1;}return hs;}int HSFun(HSTABLE* hs,DATATYPE* dat)
{return *dat %hs->tlen;
}int HS_Insert(HSTABLE* hs, DATATYPE* dat)
{int idx = HSFun(hs,dat);while(hs->head[idx]!=-1)  //判断当前位置是否是空闲{printf("冲突 idx:%d num:%d\n",idx, *dat);idx= (idx+1) %hs->tlen;}hs->head[idx] = *dat;return 0;
}int HS_Search(HSTABLE* hs, DATATYPE* dat)
{int idx = HSFun(hs,dat);int old_idx = idx;while(hs->head[idx] != *dat){idx= (idx+1) %hs->tlen;if(old_idx == idx){return -1;}}return idx;return 0;
}int DestroyHS(HSTABLE* hs)
{free(hs->head);free(hs);return 0;
}DATATYPE *GetItemHSTable(HSTABLE* hs,int idx) //5 0-4
{if(idx<0 || idx > hs->tlen-1){return NULL;}return &hs->head[idx];
}int main(int argc, char** argv)
{int array[12]={12,67,56,16,25,37,22,29,15,47,48,34};HSTABLE* hs = CreateHSTable(12);for(int i = 0 ;i<12 ;i++){HS_Insert(hs, &array[i]);}int want_num = 35;int ret = HS_Search(hs, &want_num);if(-1 == ret){printf("cant find %d\n",want_num);}else  {printf("find it , idx:%d num:%d\n",ret,*GetItemHSTable(hs, ret));}// system("pause");return 0;
}

优缺点

优点:

平均时间复杂度为O(1),非常适合用于快速查找。
空间利用率高,适合大规模数据集。

缺点:

在最坏的情况下(如所有元素都被哈希到同一个桶),查找时间复杂度可能会退化至O(n)。
需要额外的空间来处理冲突。
不同类型的哈希函数对于不同类型的数据表现不同,选择合适的哈希函数至关重要。

应用场景

哈希表广泛应用于各种领域,比如数据库系统中的快速查找、编译器设计中的符号表管理、缓存实现以及算法设计中的集合、图表示等。由于其实现简单且效率高,在实际编程中也是常用的数据结构之一。例如,在Python中,字典(dictionary)就是基于哈希表实现的;在Java中,HashMap也是一个典型的哈希表实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93153.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93153.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93153.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 23种设计模式-工厂模式

工厂模式是一种创建型的设计模式&#xff0c;他提供了一种创建对象的最佳方式&#xff0c;而无需指定将要创建对象的具体类。包括&#xff1a;简单工厂模式、工厂方法模式、抽象工厂模式。简单工厂模式组成成员&#xff1a;抽象产品类、具体产品类 A、B、C等、工厂类工作原理&a…

vue3 el-table 行的某个特定值来决定某些列是否显示

在 Vue 3 中使用 Element Plus 的 <el-table> 组件时&#xff0c;如果你想要根据行的某个特定值来决定某些列是否显示&#xff0c;你可以通过自定义列渲染函数&#xff08;render 函数&#xff09;来实现这一需求。下面是一个如何实现该功能的步骤说明和示例代码。步骤 1…

电商数据采集API与爬虫技术结合的全网比价方案

一、技术选型与工具准备API优先策略官方API接入&#xff1a;京东、淘宝、拼多多等平台提供商品详情API&#xff0c;需注册开发者账号获取API Key。例如&#xff1a;京东API支持实时获取商品价格、库存、评价数据。淘宝API通过RESTful接口返回JSON格式的商品信息&#xff0c;需O…

Socket详解

一.定义Socket&#xff08;套接字&#xff09;是网络编程的核心&#xff0c;它允许不同主机或同一主机的不同进程之间进行通信&#xff0c;Socket API 提供了一套标准的接口&#xff0c;支持 TCP、UDP、IP 等协议分为以下三个类型&#xff1a;SOCK_STREAM: 用于tcp协议&#xf…

如何实现打印功能

一、AI赋能提供思路基本框架<!-- 隐藏的打印内容&#xff08;默认不显示&#xff09; --> <div id"print-container" style"display: none;"><h1>退货单打印内容</h1><table><!-- 打印专用的表格结构 --></table&g…

Android 架构演进:从 MVC 到 MVVM 的设计之道

在 Android 开发初期&#xff0c;很多开发者会把所有逻辑塞进 Activity—— 网络请求、数据处理、UI 更新全堆在一起&#xff0c;导致代码超过数千行&#xff0c;改一个按钮点击都要翻半天。这种 “面条式代码” 的根源是缺乏架构设计。随着应用复杂度提升&#xff0c;MVC、MVP…

使用 gh-pages 将 next.js15 静态项目部署到 github pages

以下我使用 next.js15 写的 Todo List 为例,假设我们本地已经存在一个 next.js15 的 Todo List 项目。 说明:解决了项目部署到 github pages 后访问不到 css、js、字体以及访问不到 public 目录下的图片问题。 第一步 安装 gh-pages: npm i gh-pages第二步 在 public 目…

rename系统调用及示例

21. rename - 重命名文件或目录 函数介绍 rename系统调用用于重命名文件或目录&#xff0c;也可以将文件或目录移动到另一个位置。如果目标文件已存在&#xff0c;则会被替换。 函数原型 #include <stdio.h>int rename(const char *oldpath, const char *newpath);功能 将…

PHP框架之Laravel框架教程:3. 数据库操作(简要)

3. 数据库操作&#xff08;简要&#xff09; 配置 数据库的配置文件在 config/database.php 文件中&#xff0c;你可以在这个文件中定义所有的数据库连接配置&#xff0c;并指定默认的数据库连接。这个文件中提供了大部分 Laravel 能够支持的数据库配置示例。 mysql > [driv…

项目七.AI大模型部署

环境准备此处使用的是rock linux8.9操作系统k8s集群三个设备&#xff0c;使用centos7.9操作系统设备配置##上传ollama工具的压缩包 [rootproject ~]# ll total 1497732 -rw-r--r-- 1 root root 1533674176 Jul 21 11:27 ollama-linux-amd64.tgz [rootproject ~]# tar -C /usr -…

Oracle 19C RU 19.28 升级和安装

背景介绍 概述 本次升级包括安全漏扫中所有19c数据库,漏扫预警版本19.3到19.27各个版本,数据库需要升级至19.28版本满足安全要求。 原端19C 升级目标端19.28 db_name racdb racdb ORACLE_SID racdb1/2 racdb1/2 ORACLE_HOME GI:/oracle/asm DB:/oracle/db GI:/orac…

嵌入式学习日志————对射式红外传感器计次

前言这是第二次学习这部分内容了&#xff0c;第一次是大一上学期&#xff0c;因为大二下忙着其他事一直没来得及吧STM32学完&#xff0c;所以假期从头开始再学&#xff0c;比第一次也有了更深的理解&#xff0c;以下内容均是看【STM32入门教程-2023版 细致讲解 中文字幕】https…

ONLYOFFICE深度解锁系列.13-如何复制、重新排序 PDF 页面:onlyoffice 9.0.3 新功能

在处理合同、讲义、研究资料或扫描文档时&#xff0c;保持页面顺序井然尤为重要。有时文件页数繁多、排序混乱或缺少逻辑&#xff0c;这不仅影响阅读体验&#xff0c;也不利于后续使用或分享。好消息是&#xff0c;借助 ONLYOFFICE PDF 编辑器&#xff0c;您可以轻松拖拽页面&a…

vue递归树形结构删除不符合数据 生成一个新数组

首先看一下数据结构&#xff08;我的是路由菜单&#xff09;{"code": 200,"message": "请求成功!","success": true,"data": [{"startDate": null,"endDate": null,"createTime": "2023…

【机器学习之推荐算法】基于K最近邻的协同过滤推荐与基于回归模型的协同过滤推荐

基于K最近邻的协同过滤推荐 基于K最近邻的协同过滤推荐其实本质上就是MemoryBased CF&#xff0c;只不过在选取近邻的时候&#xff0c;加上K最近邻的限制。 这里我们直接根据MemoryBased CF的代码实现 修改以下地方 class CollaborativeFiltering(object):based Nonedef __ini…

望言OCR视频字幕提取2025终极评测:免费版VS专业版提全方位对比(含免费下载)

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01;一、产品定位&#xff1a;AI时代的视频字幕处理专家望言OCR作为专业的视频硬字幕提取工具&#xff0c;在AI视频处理领域占据重要地位。最新评测显示&#xff0c;其免费版本依然保持着惊人的97…

Matplotlib(二)- Matplotlib简单绘图

文章目录一、pyplot模块介绍二、Matplotlib简单绘图1. 绘制折线图1.1 折线图介绍1.2 plt.plot()函数介绍1.3 绘制简单折线图1.3.1 绘制单条折线图1.3.2 绘制多条折线图1.4 示例&#xff1a;绘制天气气温折线图2. 绘制柱形图2.1 柱形图介绍2.2 plt.bar()函数介绍2.3 绘制柱形图2…

【世纪龙科技】数字化技术解锁新能源汽车电驱动总成装调与检修

随着新能源汽车产业加速升级&#xff0c;电驱动总成装调与检修技术已成为职业院校汽车专业教学的核心挑战。传统实训模式面临设备投入高、更新周期长、高压操作安全隐患多、教学与产业需求脱节等现实问题&#xff0c;导致学生实践能力培养滞后于行业发展。如何通过数字化手段突…

springboot基于Java与MySQL库的健身俱乐部管理系统设计与实现

用户&#xff1a;注册&#xff0c;登录&#xff0c;健身教练&#xff0c;健身课程&#xff0c;健身器材&#xff0c;健身资讯&#xff0c;课程报名管理&#xff0c;教练预约管理&#xff0c;会员充值管理&#xff0c;个人中心管理员&#xff1a;登录&#xff0c;个人中心&#…

如何修改debian的ip地址

编辑配置文件&#xff1a; sudo nano /etc/network/interfaces修改内容&#xff08;示例将 eth0 设为静态IP&#xff09;&#xff1a; auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4 #…