哈希表

【数据结构】哈希表(6000字超详细) 哈希表概念:哈希表是构造出来的一种可以快速查找的存储结构。哈希存储的基本思想是以关键字为自变量,通过一定的函数关系(称为散列函数或者哈希函数),计算出对应的函数值,以这个值作为数据元素的地址,将该数据元素存到相应的地址单元中去。查找时,再根据关键字采用计算哈希值的方式计算出相应的哈希地址,再到相应的存储单元去取需要的元素即可。在顺序结构和平衡树中,元素关键码与它的存储位置之间没有对应映射关系,在查找时需要多次比较,而哈希表可以通过哈希函数建立元素关键码与存储位置之间的对应关系。 阅读详情

        哈希表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

        哈希表利用函数计算出数据应该存放的地址,存入数据,在需要查找数据的时候还是用同样的函数。

       那么如果是通过函数来计算数据的存放地址,那么数据之间的关系存储了吗?实际上这就是第四类逻辑结构,即“集合”。前期提到的三大类数据结构(线性表、树、图)都是对数据之间内部关系非常敏感的。在实际软件开发中,还会有这一种内部结构为松散关系的数据结构,那就是把一批数据作为一个整体,只关注某个数据是否在其中,也就是查找操作,称为“集合”。对于集合来说,既然对它内部数据关系并不敏感,那就可以不处理这些关系信息,而仅仅设法提高查找效率即可。

        把上述思路小结一下,第一,数据结构采用“集合”,第二,定位放置采用“函数”。这种利用函数计算存储地址的集合结构称为hash table;函数被称为“哈希函数”;利用这种结构进行查找的技术称为“哈希查找法”。

       选取某个函数,依照该函数按关键码计算元素的存储位置,并按此存放;查找时。由同一个函数对给定值finddata计算地址,之后在相应的地址单元中读取该元素,这就是哈希查找法,哈希查找法中使用的地址计算函数称为哈希函数,按这个思想构造的表称为哈希表。

       这种存储方法并不是顺序存储,虽然存储空间连续,但是数据并没有连续存放,也不是链式存储,因为存储位置随机,但是并没有启用链表指针。数据仅仅存储在一片内存空间中,并没有额外地存储一批管理数据,所以也不是索引存储。

       哈希方法通常用在较大的数据需求空间下使用较小的实际空间存储,而将大空间地址压缩存储到小空间中,地址计算就无法避免重复的相同结果。这种情况称为“冲突”,而映射到同一个哈希地址上的关键码称为“同义词”。实用编程应用中冲突是不可避免的,只能尽量减少。

根据上面的讨论,可以看到采用哈希方法需要解决以下两个问题:

(1) 构造好的哈希函数。首先要使得所设计的函数要尽可能简单,易于计算和实现,以便提高求地址的速度。另外要使所选函数对关键码计算出的地址在整个地址空间中大致均匀分布,以减少冲突发生的概率。

(2) 制定解决冲突的方案。


a)定义hash表和基本数据节点

typedef struct _NODE
{
	int data;
	struct _NODE* next;
}NODE;

typedef struct _HASH_TABLE
{
	NODE* value[10];
}HASH_TABLE;
b)创建hash表
HASH_TABLE* create_hash_table()
{
	HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
	memset(pHashTbl, 0, sizeof(HASH_TABLE));
	return pHashTbl;
}
c)在hash表当中寻找数据
NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
{
	NODE* pNode;
	if(NULL ==  pHashTbl)
		return NULL;

	if(NULL == (pNode = pHashTbl->value[data % 10]))
		return NULL;

	while(pNode){
		if(data == pNode->data)
			return pNode;
		pNode = pNode->next;
	}
	return NULL;
}

d)在hash表当中插入数据

STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
{
	NODE* pNode;
	if(NULL == pHashTbl)
		return FALSE;

	if(NULL == pHashTbl->value[data % 10]){
		pNode = (NODE*)malloc(sizeof(NODE));
		memset(pNode, 0, sizeof(NODE));
		pNode->data = data;
		pHashTbl->value[data % 10] = pNode;
		return TRUE;
	}

	if(NULL != find_data_in_hash(pHashTbl, data))
		return FALSE;

	pNode = pHashTbl->value[data % 10];
	while(NULL != pNode->next)
		pNode = pNode->next;

	pNode->next = (NODE*)malloc(sizeof(NODE));
	memset(pNode->next, 0, sizeof(NODE));
	pNode->next->data = data;
	return TRUE;
}
e)从hash表中删除数据
STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
{
	NODE* pHead;
	NODE* pNode;
	if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
		return FALSE;

	if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
		return FALSE;

	if(pNode == pHashTbl->value[data % 10]){
		pHashTbl->value[data % 10] = pNode->next;
		goto final;
	}

	pHead = pHashTbl->value[data % 10];
	while(pNode != pHead ->next)
		pHead = pHead->next;
	pHead->next = pNode->next;

final:
	free(pNode);
	return TRUE;
}


哈希表算法(闭散列表操作,开散列表操作)创建,查找,插入,删除 #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 { ... 阅读详情

相关推荐

哈希表与散列表的原理及C++实现

哈希表(Hash Table)是一种高效的数据结构,用于存储键值对(Key-Value Pairs)。它通过哈希函数(Hash Function)将键(Key)映射到一个固定大小的数组(称为散列表)中的某个位置,从而实现快速的插入、查找和删除操作。哈希表的核心思想是通过哈希函数将键转换为数组的索引,从而直接访问对应的值。理想情况下,哈希表的插入、查找和删除操作的时间复杂度都是O(1)。哈希表是一种高效的数据结构,通过哈希函数将键映射到数组索引,从而实现快速的插入、查找和删除操作。

Lostgreen的博客 1568

哈希表(散列表)原理详解

哈希表(散列表)原理详解

那年聪聪 30万+

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

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

守望的博客-编程珠玑 3568

算法数据结构基础——哈希表(Hash Table)

哈希表(Hash Table):也叫做散列表。是根据关键码值(Key Value)直接进行访问的数据结构。哈希表通过「键key」和「映射函数Hash(key)」计算出对应的「值value」,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做「哈希函数(散列函数)」,存放记录的数组叫做「哈希表(散列表)」。哈希表的关键思想是使用哈希函数,将键key映射到对应表的某个区块中。向哈希表中插入一个关键码值:哈希函数决定该关键字的对应值应该存放到表中的哪个区块,并将对应值存放到该区块中。

白话机器学习 3万+

HashSet和HashMap的底层实现——哈希表、散列表

java.lang  类 Object java.lang.Object int hashCode()            返回该对象的哈希码值。 boolean equals(Object obj)           指示某个其他对象是否与此对象“相等”。 一、概述 java最基本的两种数据结构

lpp1234567的专栏 7370

NC65实现Restful接口开发及调试

NC65实现Restful接口开发及调试

linzhongshu的专栏 2145

哈希表(HashTable)

哈希表:也叫做散列表。是根据关键字和值(Key-Value)直接进行访问的数据结构。也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(散列函数),用于存放记录的数组叫做 哈希表(散列表)。 哈希表的关键思想是使用哈希函数,将键 key 和值 value 映射到对应表的某个区块中。可以将算法思想分为两个部分:哈希表的原理示例图如下所示: 哈希函数:将哈希表中元素的关键键值映射为元

Cdreamfly的博客 5万+

论文代码复现 | 无人机与卡车联合配送(Python+Gurobi)(The flying sidekick traveling salesman problem)

无人机配送-代码复现The flying sidekick traveling salesman problem-Part 1文献笔记:(无人机配送-代码复现)The flying sidekick traveling salesman problem-Part 1摘要论文主要图标摘录数值实验算例结果参考文献 文献笔记:(无人机配送-代码复现)The flying sidekick traveling salesman problem-Part 1 摘要 Once limited to the milit

HsinglukLiu的博客 3万+

【数据结构】哈希表

想要了解Hash表,首先我们要了解一下Hash函数。在顺序结构以及平衡树中,元素关键码(数据)与其存储位置之间没有对应的关系,顺序表,需要遍历一遍循序表,它查找的时间复杂度为O(N);平衡树则需要从根节点开始进行查找,从结点取出数据或者索引与查找的值进行比较。它的时间复杂度为树的高度,即O(logN),搜索的效率取决于搜索过程中元素比较的次数。理想的搜索方法:可以不经过任何比较,依次直接从表中得到要搜索的元素。

m0_73067372的博客 5753

从菜鸟到高手:我的Abaqus壳单元S4R、S3R、S8R选择心路历程

第一次打开Abaqus的单元库时,我被琳琅满目的壳单元类型晃花了眼。S4R、S3R、S8R、STRI65、S9R5...这些看似随意的字母数字组合,背后却隐藏着影响仿真精度的关键密码。作为一名从土木工程转行到汽车结构仿真的工程师,我花了三年时间才真正理解如何根据问题特性精准选择壳单元。这段学习历程充满试错与顿悟,今天就用几个关键案例,分享我的壳单元选择方法论。

weixin_42525637的博客 419

RTC 实时时钟实验

如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) // 往备份区域写用户数据的函数 (这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的)存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。寄存器操作完成,并同步之后,设置秒钟中断。

m0_55996456的博客 1205

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

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

Ycy的博客 1万+

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

专业解决各种上架过包问题,专业团队专业处理 751

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

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

m0_61705102的博客 1万+

Xilinx/AMD公司7系列FPGA的ISERDESE2仿真的”天坑”(附verilog的源码vivado仿真工程)

研究LVDS输出接口的ADC与7系列(ZYNQ)FPGA对接过程中,在Vivado中搭建了ISERDESE2的仿真工程,仿真结果ISERDESE2的并行输出口一直输出X或Z,这个坑之大,耗费了我数天的时间,可以称为“天坑”了。同步复位的要求肯定是高于异步复位的,古话说得好“两害相权取其轻”,所以,跟古话对着干就对了!就当RST是同步复位吧,最后经过反复验证,发现。开始怀疑复位信号是否高电平持续时间不够长?但是没有查到复位时间的要求 : - (

FPGA艺术家的博客 171

PowerDesigner 数据库建模使用详解

PowerDesigner 数据库建模使用详解

congge 7082

哈希表(散列表)详解

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

不能再留遗憾了的博客 2309

麒麟操作系统提示“默认密钥环已上锁”的解决办法

麒麟操作系统提示“默认密钥环已上锁”的解决办法

太极淘的博客 1万+

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

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

Philosophy7的博客 2405

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

散列表(哈希表)知识详解

哈希表知识总结

m0_57105290的博客 6515

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

ROBOT_a的博客 2705

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

散列表(哈希表)

散列表(hash table,又称哈希表),是一种数据集,其中数据项的存储方式尤其有利于将来快速的查找定位。散列表的基本思想是,首先在关键字key和存储位置p之间建立一个对应关系H,使得p = H(key),H称为哈希函数,p称为散列地址。当创建哈希表时,把关键字key的记录直接存入地址为H(key)的地址单元中;以后查找关键字为key的元素时,再利用哈希函数p = H(key)计算出该元素的散列地址p,从而达到直接存取记录的目的。

2302_77530416的博客 963

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

一:散列表的概念 定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希函数。 基本概念: 若关键字为k,则其值存放在f(k)的存储位置上。由此,不需比较便可直

eyes++的博客 2786

散列表 分布式散列表(DHT)哈希表 是什么

  (如果你自认为是一个熟练的程序员,请直接略过“预备知识”这个章节,看下一章节)   (注:在本文中,凡是提及“散列”或“哈希”或“hash”,均表示相同含义)   关于 hash 的概念,俺曾经写过一篇相关的扫盲教程《扫盲文件完整性校验——关于散列值和数字签名》,不了解此概念的同学,可以先看看。   老实说,如果你还没有搞明白 hash 的概念,就不要浪费时间看本文的后续部分啦。   “散列表/哈希表”是用来存储“键值对”的一种容器。“键值对”洋文称之为“key/value pairs”,简称“

软件工程小施同学 的专栏 2567

哈希表(散列表)

除留余数法用关键字除以p得到的余数作为关键字的存储位置.(p是一个整数) 那么关键是怎么取到合适的除数p?技巧:设表长为m,取p<=m且为质数例如{15,23,27,38,53,61,70},散列函数Hash(key)=key%7,那么哈希表为:查找的时候同样用这个哈希函数,比如我们要查找70.用10除以7余数为0,直接去0号位置查找.以上就是我们常用的散列表的构造方法:直接定址法和除留余数法.非同义词不会冲突,无”聚集”现象;链表上节点空间动态申请,更适合于表长不确定的情况.

weixin_75188368的博客 1391

面试八股之集合篇6.1——散列表——散列表(哈希表)HashTable概述

🔥本篇概览:详细讲解了散列表(哈希表)的性质

做一个善良的人,做好自己的事,如果愿意,再发一份光。 971
上一篇: 深刻理解Linux进程间通信(IPC)
下一篇: 字符串匹配KMP算法
小飞鱼hubble
博客等级 码龄15年 14粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值