哈希表(散列表)

哈希表算法(闭散列表操作,开散列表操作)创建,查找,插入,删除 #include <stdio.h> #include <malloc.h> #include "stdlib.h" #include <math.h> typedef int Status; typedef int KEYTYPE; typedef struct { KEYTYPE key; }ElemType; typedef struct { ... 阅读详情

本文参考《大话数据结构》

哈希表的定义

我们希望查找数据,能够像访问数组那样,能够随时随地的查找到第几个元素。也就是希望能够给一个关键字,查找的它的时间是o(1)

也就是说,我们需要通过某个函数f,使得

通过这样的转换,我们就不需要通过关键字进行比对寻找,直接通过位置寻找。使得关键字和存储位置一一对应。有点儿像python中的字典。

哈希表查找的步骤

  1. 通过散列函数计算散列地址。

  2. 查找时通过散列函数记录的地址,按照散列地址访问记录。

散列技术既是一种存储方法,又是查找方法

哈希函数的构造方法

首先构造一个哈希函数。那么如何构造一个比较好的哈希函数呢。

  1. 计算简单,散列表的计算时间尽量简单

  2. 散列地址分布均匀

直接定址法

比如说统计年龄0~100岁的人口数字,直接用年龄作为关键字查找。通常其哈希函数为线性

$$
f(key) = a*key+b
$$

数字分析法

抽取数字的关键部分进行截取,然后计算存储位置

平方取中法

假设关键字为1234,它的平方为1522756,再抽取中间的3位数,就是227.适合不知道关键字的分布,而位数又不大。

折叠法

将关键字从左到右分割成位数相等的几部分(最后一个不部分不够可以短些)

除留余数法

$$
f(key) = key \quad mod \quad p (p<<m)
$$

假如我们有个12条记录表,我们就用法f(key)mod12,例如29mod12=5

下标01234567891011
关键字122538151629786756212247

根据经验,p为小于或等于表长的最小质数或不包含小于20质因子的合数

随机数法

选择一个随机数,随机函数为它的散列地址f(key)=random (key)

散列冲突的方法

开放定址法(线性探测法)

一旦发生了冲突,就去寻找下一个空的散列地址。

$$
f_i(key)=(f(key)+d_{i})\quad mod\quad m(d_i=1,2,3,4,m-1)
$$

比如说我们的关键字集合为{12,67,56,16,25,37,22,29,15,47,48,34},表长为12,。我们散列函数f(key)=key mod 12

下标01234567891011
关键字12251667

key=37时,f(37)=1,与25所在的位置冲突。f(37)=(f(37)+1) mod 12 =2将其存入2的位置

下标01234567891011
关键字1225371667

key=48时,我们计算得到f(48)=0,与12冲突,f(48)=(f(48)+1)mod12 =1 还冲突,我们一直重复。直到没有发生冲突。

二次探测法

下标01234567891011
关键字1225371516294867562247

我们会发生以下情况,34与22发生冲突,可是后面的没有地址了。为了不让关键字都聚集在某一块区域。我们称这种方法为二次探测法。

$$
f_i(key)=(f(key)+d_i)\quad mod m(d_i=1^2,-1^2,2^2,-2^2,..,q^2,-q^2,q<<m/2)
$$

再散列函数法

我们事先准备多个散列函数

$$
f_i(key)=RH_i(key)(i=1,2,...k)
$$

$$
RH_{i} 就是不同的散列函数
$$

每当发生一个冲突时换一个散列函数

链地址法

 

散列表的实现

#define unsuccess 0
#define Hashsize 12  //定义表长的长度
#define INIT 0
#include<stdio.h>
#include<stdlib.h>
typedef struct {
    int* elem; //数据元素存储基址,动态分配数组
    int count; //当前数据元素的个数
}HashTable;
​
int m = 0; //散列表长,全局变量
​
/*初始化散列表*/
void InitHashTable(HashTable* H) {
    int i;
    m = Hashsize;
    H->count = m;
    H->elem = (int*)malloc(m * sizeof(int));
    for (i = 0; i < m; i++)
        H->elem[i] = INIT;
}
​
/*散列函数*/
int Hash(int key) {
    return key % m; /*除留余数法*/
}
​
/*插入关键字进行散列表*/
void InsertHash(HashTable* H, int key) {
    int addr = Hash(key); //求散列地址
    while (H->elem[addr] != 0)  //如果不空,则冲突
        addr = (addr + 1) % m;  //开放定址法的线性探测
    H->elem[addr] = key;   //直到有空位后插入关键字
}
​
​
/*散列表查找关键字*/
int  SearchHash(HashTable H,int key, int* addr) {
    *addr = Hash(key); //求散列地址
    while (H.elem[*addr] != key)
    {
        *addr = (*addr + 1) % m;//开放地址法的线性探测
        if (H.elem[*addr] == 0 || *addr == Hash(key))
        {
            return 0;//说明关键字不存在
        }
    }
    return 1;
}
哈希表与散列表的原理及C++实现 哈希表(Hash Table)是一种高效的数据结构,用于存储键值对(Key-Value Pairs)。它通过哈希函数(Hash Function)将键(Key)映射到一个固定大小的数组(称为散列表)中的某个位置,从而实现快速的插入、查找和删除操作。哈希表的核心思想是通过哈希函数将键转换为数组的索引,从而直接访问对应的值。理想情况下,哈希表的插入、查找和删除操作的时间复杂度都是O(1)。哈希表是一种高效的数据结构,通过哈希函数将键映射到数组索引,从而实现快速的插入、查找和删除操作。 阅读详情

相关推荐

hash table 哈希表(散列表)

hash table ,也叫散列表。涉及到哈希函数、哈希冲突处理的问题。哈希函数是哈希表的关键,是用来从值到哈希表索引(存放位置)的映射。 比如:要存放一个学校学生的姓名,他们是Amanda, Jack, Andy, Tom, Bob, Black等等500个人。我们可以设计一个哈希表,容量为500,来存放这些学生的信息。哈希表的目的是快速访问,利用数组的随机访问性,快速的通过下表访问元素。需要

csdn_chai的博客 786

散列表(哈希表)

缺点:能使第i个哈希地址的同义词存入第i+1个地址,这样本应存入第i+1个哈希地址的元素变成了第i+2个哈希地址的同义词,……以关键字的平方值的中间几位作为存储地址,求"关键字的平方值"的目的是"扩大差别",同时平方值的中间各位又能收到整个关键字中各个位数的影响。基本思想:将所有散列地址相同的记录,即所有同义词的记录存储再一个单链表中(称为同义词子表),在散列表中存储的是所有同义词子表的头指针。基本思想:有冲突时就去寻找下一个空的哈希地址,只要哈希表足够大,空的哈希地址总能够找到,并且将数据元素存入。

Gremmie的博客 1174

什么是散列表(哈希表)?

本文文末有福利,不要错过奥! 前言 假设你们班级100个同学每个人的学号是由院系-年级-班级和编号组成,例如学号为01100168表示是1系,10级1班的68号。为了快速查找到68号的成绩信息,可以建立一张表,但是不能用学号作为下标,学号的数值实在太大。因此将学号除以1100100取余,即得到编号作为该表的下标,那么,要查找学号为01100168的成绩的时候,只要直接访问表下标为68的数据即可...

守望的博客-编程珠玑 3568

数据结构算法设计——哈希表(散列表)

哈希表又叫散列表,他们两个是同一个东西,本文全文采用“散列表”的叫法。散列表的本质其实就是一个数组,他的作用就像使用数组时一样,输入下标可以得到对应元素,散列表可以实现输入一个关键字的时候得到这个关键字的地址信息。

给你糖ya的博客 1736

ArcGIS中利用DEM数据生成地形图既视感的等高线;利用掩膜进行等高线注记;DEM的可视化表达总结

文章目录前言一、效果图展示二、地形(DEM)可视化表达1.一维可视化2.二维可视化2.三维可视化二、ArcGIS中利用DEM数据制作等高线2.三维可视化2.三维可视化2.三维可视化2.三维可视化二、ArcGIS中利用DEM数据制作等高线2.三维可视化2.三维可视化2.三维可视化总结 前言 最近老师布置作业:DEM的可视化表达。想做一个等高线地形图那样、看起来高级一点的等高线,可是我看网上大多数教程都只展示了【等值线】工具,做出来效果都一般。我自认为自己做出来的效果还可以,把步骤分享给大家。 一、

pink_pig__的博客 5万+

YOLOv8缺陷检测可视化界面实战:PyQt5布局设计与代码实现

本文详细介绍了如何利用PyQt5为YOLOv8缺陷检测模型构建一个专业、易用的可视化界面。通过实战讲解PyQt5的布局管理器设计、信号槽机制与YOLOv8核心的集成,帮助开发者快速将AI模型部署为直观的桌面应用,提升工业质检等场景的落地效率。

redis7keeper的博客 758

【数据结构(八)】哈希表

散列表(Hash table,也叫哈希表),是根据关键码-值(Key、value)而直接进行访问的数据结构。也就是说,它通过把关键码-值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

weixin_44883789的博客 377

立创·庐山派-K230-CanMV(嘉楠勘智)开发板通过ATK-ESP8266实现图像识别数据无线传输与原子云对接

本文详细介绍了如何利用立创·庐山派K230开发板与ATK-ESP8266模块实现图像识别数据的无线传输及与原子云平台的对接。通过硬件连接、环境配置、代码实现及调试技巧的讲解,为开发者提供了一套完整的物联网解决方案,特别适用于智能监控和边缘计算场景。

study的专栏 950

散列表(哈希表)

散列表(哈希表)

weixin_61611746的博客 4346

可视化大屏系列(5):设备状态面板与数据分析仪表盘

在这篇文章中,我们将重点讨论如何通过智能化手段提升工地设备的管理效率与维护质量。随着智能工地系统的不断发展,设备监控与维护管理变得尤为重要。本篇将从 设备状态实时监控、自动化维护提醒、设备管理与维修记录 三个方面入手,展示如何通过 Vue3 和 ECharts 构建一个智能化的设备管理平台,实时采集和展示设备运行状态、及时生成维护提醒并记录维修历史,以提高设备的使用效率与安全性。我们还将结合实际代码示例,详细讲解如何实现这些功能,帮助你在智能工地项目中实现设备管理的智能化、数字化和自动化。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 3365

遥感SCI期刊模板下载教程———IEEE TGRS、GRSL、JSTARS

IEEE下的期刊模板下载,以IEEE TGRS 为例。

海淀小天的blog 2万+

哈希表(散列表)C/C++代码实现

哈希表(散列表): 1,构造散列函数 最常用的方法是除留余数法: H(key) = key%p 这个方法的关键是选取适当的p, 一般情况下,可以选p为小于表长的最大质数。例如表长m=100, 可取p=97。 2,处理冲突 选择一个 “好” 的散列函数可以在一定程度上减少冲突,但在实际应用中,很难完全避免发生冲突 1,开放地址法 (1)线性勘测法 (2)二次探测法 (3)伪随机探测法 线性探测法的优点是:只要散列表未填满,总能 找到一个不发生冲突的地址。缺点是:会产生 ”二次聚集“ 现象。而二次探测法和伪随机

Ycy的博客 1万+

Apollo Control——超详细入门教程(六):MPC二次规划问题转化

专栏文章列表 Apollo Control——超详细入门教程(一):基于道路误差的车辆动力学模型 Apollo Control——超详细入门教程(二):连续状态空间方程离散化与离散LQR公式推导 Apollo Control——超详细入门教程(三):基于Frenet坐标系及XY坐标系的多项式轨迹生成 Apollo Control——超详细入门教程(四):控制模块轨迹误差计算 Apollo Control——超详细入门教程(五):油门刹车标定表之双线性插值算法 ...

凉了鸭的博客 2233

数据结构——哈希表(散列表)

文章目录一,哈希表(散列表)概念二,哈希(散列)函数的构造哈希(散列)函数的构造原则构造方法平方取中法折叠法保留余数法三,冲突处理散列冲突的方法开放定址法1.线性探测法2.二次探测法3.随机探测法再散列函数法公共溢出区法链地址法四,代码实现1.哈希函数2.链表和哈希表的创建3.哈希表初始化3.从哈希表中根据key查找元素4.哈希表插入元素5.元素删除6.哈希表销毁 一,哈希表(散列表)概念 大话数据结构里面是这样介绍的: 散列表,又称为哈希表(Hash table),采用散列技术将记录存储在一块连续的存储空

m0_61705102的博客 1万+

(九)DFI接口时序

文章目录一、DFI Interface 一、DFI Interface   DFI接口是连接DDR Controller与DDR_PHY之间的通用接口,其信号组如下表:       

Mr.翟的博客 1万+

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

862

哈希表(散列表)详解

深入理解哈希表,哈希函数的构造和解决哈希冲突的方法

不能再留遗憾了的博客 2302

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[一篇详解哈希表]数据结构之哈希表(散列表)

✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆 📃个人主页:Philosophy7的csdn博客 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞 文章目录散列表简介:为什么需要散列表?哈希函数的实现哈希表的代码 散列表 简介: 散列表又可以叫做哈希表,那什么是散列表呢? 现在就让我们深入研究一下吧 是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把.

Philosophy7的博客 2403

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据结构 | 散列表(哈希表)

​ 散列表(Hash Table),也称为哈希表,是一种根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,从而加快查找速度。这个映射函数称为散列函数,存放记录的数组称为散列表。

ROBOT_a的博客 2704

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

散列表(Hash table哈希表)应用案例

散列表(Hash table哈希表)应用案例

qqrrjj2011的博客 1326

C++数据结构之Hash table(哈希表|散列表)

哈希表(Hash Table),也称为散列表(思考:vs平衡二叉树),是一种数据结构,它提供了通过键(key)直接访问存储的值(value)的能力。哈希表的工作原理基于哈希函数(Hash Function),该函数将输入的键映射到表中的一个位置,使得和操作都能在接近常数时间内完成(

weixin_49962210的博客 3317

数据结构——散列表(Hash Table)(哈希表)

散列表 散列表英文是hashtable,经常被叫做Hash表,或者哈希表。 哈希表其实就是由数组演化而来的,利用的就是数组支持按照下标随机访问数据的特性,可以说散列表就是数组的一种扩展。 百度文库对散列表的解释: 根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的...

qq_42006733的博客 2016

算法设计与分析——散列表/哈希表(Hash Table)(三):散列表原理

直接寻址技术的缺点是非常明显的:如果全域U很大,则在一台标准的计算机可用内存容量中,要存储大小为∣U∣|U|∣U∣的一张表TTT也许不太实际,甚至是不可能的。还有,实际存储的关键字集合KKK相对UUU来说可能很小,使得分配给TTT的大部分空间都将浪费掉。 当存储在字典中的关键字集合KKK比所有可能的关键字的全域UUU要小许多时,散列表需要的存储空间要比直接寻址表少得多。特别地,我们能将散列表的存储需求降至Θ(∣K∣)\Theta(|K|)Θ(∣K∣),同时散列表中查找一个元素的优势仍得到保持,只需要O(1)

冯·诺依曼 1万+

哈希表(Hash Table)/散列表(Key-Value)

   目录 1. 哈希表的基本思想 2. 哈希表的相关基本概念   1.概念:   2.哈希表和哈希函数的标准定义:   1)冲突:   2)安全避免冲突的条件:   3)冲突不可能完全避免   4)影响冲突的因素 3. 哈希表的实现方法 4. 哈希表“定址”的方法   1)直接定址法   2)除法取余法   3)数字分析法   4)平方取中法   5)折叠法 5...

Lightmare625 1万+
上一篇: Makefile文件很简单
下一篇: 两数之和哈希方法
梵高的代码色盘
博客等级 码龄5年 188粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值