基于开放定址法的哈希造表和查找

哈希查找算法之线性探测法(开放地址法) 哈希查找是一种时间复杂度为O(1)的一种效率极高的查找方法,与常见的遍历查找不同,哈希算法是通过数组元素数值与哈希表下标构建的一种查找方法,因此我们不需要遍历整个数组,即可对其进行访问。... 阅读详情

为什么要用哈希查找 ?

在之前学过的所有查找算法里 ,  不论是折半查找 , 亦或静态数表查找 , 还是索引顺序表查找 ,这些查找方式都是基于 "比较" 的查找方式.也就是说 , 想知道自己要查的元素在集合里有没有 , 把集合里的元素拿出来跟自己的元素一个一个比较 , 一样的话 , 就说明集合里有 , 找不到就是没有. 这种方式简单 , 可简单 , 并不快! 

怎么样让查找更快呢?最好是不采用比较的方式 , 而是能用某一个公式 , 就像初中学过的y = f(x) 一样 ,  知道x , 就能知道y .只要知道自己手中的待查找数据 ,待入公式里 , 就能找到它在集合里的位置.

哈希就实现了这样的 想法.

哈希之所以不同 , 就是因为y =f(x)不同 ,即要待入的公式不同.

常见的哈希构造方法有:

1:直接定址法  2: 数字分析法   3:平方取中法   4:折叠法  5:除留取余法

这次的哈希构造采用除留取余法 , 解决冲突的方式采用开放定址法中的线性探测在散列

节点HashTable中的int * elem指向哈希表元素 , 在代码中可以看到 , 只有在Hash表全部放满数据后造表才结束.更好的算法是 , 如果线性探测再散列导致索引超出表大小 , 需要在扩大哈希表 , 但这里并没有采用这样的算法 , 为简单起见 , 当冲突次数较多导致插入位置超出表大小后 , 直接提示无法插入.

具体代码如下:

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct
{
	int *elem;       //数据元素存储基址 
	int count;      //当前元素个数 
	int sizeindex;  //哈希表的当前容量 
}HashTable;

#define  SUCCESS      1
#define  UNSUCCESS    0
#define  DUPLICATE   -1
#define  NULLKEY    -99   //设定-99为哈希表初值,代表此处哈希表没有元素 
#define  EQ(a,b)    ((a) == (b))
typedef int KEYTYPE; //在searchHash()中作为参数使用 

int main()
{
	int createHashTable(HashTable &H);
	int searchHash(HashTable &H , KEYTYPE K , int &p , int &c);
	HashTable H;
	createHashTable(H);
	cout<<"hash表中的元素依此是:"<<endl; 
	for(int i=0 ; i<10 ;i++)
	{
		cout<<H.elem[i]<<endl;
	}
	
	//接着查找元素27
	int K =27, p ,c;
	if(searchHash(H , K , p ,c) == SUCCESS) 
	{
		cout<<"查找成功,元素位置是:"<<p<<"        元素值是:"<<H.elem[p]<<endl; 
	}
	else
	{
		cout<<"查找失败,hash表中没有这个元素!"<<endl; 
	}
	
}

int  createHashTable(HashTable &H)  
{
	int Hash(int); //申明 
	H.elem = (int *) malloc(sizeof(int)*10);  //创建hash表长度为10,录入的数据将放在这个数组里
	H.sizeindex =10;
	for(int i=0 ; i<10 ; i++)  //初始化表中元素 
	{
		H.elem[i] = NULLKEY;
	}
	H.count =0;  //初始时表中元素为0 
	cout<<"构造hash函数"<<endl;
	int hashValue;     //记录元素 
	int hashValueIndex=0;  //记录元素哈希后的位置 
	while(H.count<H.sizeindex)
	{
		cout<<"输入要插入的数据:"<<endl;
		cin>>hashValue;
		hashValueIndex = Hash(hashValue);   //除留取余法 
		while(H.elem[hashValueIndex] != NULLKEY  &&  hashValueIndex < 10)
		{
			hashValueIndex++;
		}	 
		if(hashValueIndex == 10 && H.elem[hashValueIndex-1]  != NULLKEY) //如果冲突元素排到数组边界,则不将这个元素插入 
		{
			cout<<"元素"<<hashValue<<"无法插入"<<endl; 
		}
		else
		{
			H.elem[hashValueIndex] = hashValue;
			H.count++;
			cout<<"插入成功,插入的位置是"<<hashValueIndex<<"此时count是:"<<H.count<<endl; 
		}
	}
	return SUCCESS;
}

int Hash(int hashValue)  //p取质数7--------H(key) = key MOD p , p<= m 
{
	hashValue %= 7;
	return hashValue-1;
}
 

int searchHash(HashTable &H , KEYTYPE K , int &p , int &c)
{
	//在开方定址法中查找 关键码为K 的元素,若查找成功,以p指示待查元素在表中位置,并返回SUCCESS , 否则, 返回UNSUCCESS
	int Hash(int); //申明
	void collision(int& ,int&);
	p = Hash(K); 
	while(H.elem[p] != NULLKEY && !EQ(K ,H.elem[p]) )  //该位置已有记录且关键字不相等 ,探查下一记录
	collision(p ,++c); 
	if(EQ(K , H.elem[p]) )  return SUCCESS;
	else   return  UNSUCCESS;
}

void collision(int &p ,int &c)  //线性探测再散列, 后移一位 
{
	p++;
}

运行结果如图:


58、【查找】哈希表——拉链法和开放地址寻址法(C/C++版) 一、算法介绍 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 哈希表实现将一个较大的集合映射到一个相对较小的集合内,在一个较大的值域里从中选 阅读详情

相关推荐

PLSQL 14.0.6 下载使用教程

众所周知,PLSQL 只是一个oracle第三方开发测试工具,它依赖oracle 客户端搭配使用,但是oracle 客户端有2G,相当庞大,不建议安装。所以我们如果下载安装好PLSQL,再下载好轻量级的支持远程链接的oracle客户端,这样搭配使用可以的话就最好了,答案是可以的。 第一步: PLSQL 下载与安装 PLSQL 14.0.6 下载地址 : https://www.allroundautomations.com/registered-plsqldev/ 下载下来,除了安装路径更改一下,

qq976511508的博客 2134

开放地址法开放地址法

开放地址法是指大小为 M 的数组保存 N 个键值对,其中 M > N。我们需要依靠数组中的空位解决碰撞冲突。基于这种策略的所有方法被统称为“开放地址”哈希表。线性探测法,就是比较常用的一种“开放地址”哈希表的一种实现方式。线性探测法的核心思想是当冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。简单来说就是:一旦发生冲突,就去寻找下 一个空的散列表地址,只要散列表足够大,空的散列地址总能找到。 线性探测法的数学描述是:h(k, i) = (h(k, 0) + i) mod m,i表示当

地推 4791

半导体AMHS系统振动控制技术演进:从0.5G到超低振动的工艺革命

在半导体制造进入埃米级时代后,AMHS的振动控制能力将成为区分厂商技术等级的标尺。国内企业通过“弹性机械设计-混合主动控制-智能调度”的三重创新,正逐步突破0.2G阈值,支撑12英寸晶圆厂向3nm/2nm制程升级。未来,振动抑制不再仅是物流系统的性能参数,而是与光刻、刻蚀等核心工艺深度耦合的基础能力,这将重塑半导体设备产业的竞争格局。

m0_60674045的博客 1583

查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

代码改变世界 1万+

【鸿蒙游戏上架审核规范指南】

华为鸿蒙游戏上架审核规范指南摘要

weixin_44161102的博客 915

先进半导体材料与器件Chapter3

Chapter3 异质结双极晶体管(HBT) 作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 知乎:https:/...

一个会写代码的烤鸭 5801

数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)

数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法) 在开放地址散列表中,删除操作要很小心。通常只能“懒惰删除”,即需要增加一个“删除标记(Deleted)”,而并不是真正删除它。以便查找时不会“断链”。其空间可以在下次插入时重用。

li13437542099的博客 1万+

基于Python实现基于遥感指数的水体提取

基于Python实现基于遥感指数的水体提取

gis收藏家的博客 6145

算法:查找

查找算法:快速查找,折半查找、二叉查找表和哈希查找即散列表

qingttqing的博客 1286

【应用】什么是Azure?一文读懂微软云的核心逻辑与全球版图

作为微软的核心云计算服务平台,Azure不仅是数字化转型的引擎,更是全球企业在构建、扩展与优化IT基础设施时的首选平台。在这篇文章中,我们将深入探讨Azure云服务平台的各个方面,涵盖其核心优势、架构、功能、应用场景以及未来发展趋势。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1946

PCIe 全解析笔记:从协议本质到工程实现

学习 PCIe,最容易陷入的误区是直接跳进协议手册(Base Spec 1300 多页),然后在 TLP 字段、LTSSM 状态、Ordering Rules 中迷失方向。正确的思维路径历史维度:从 PCI 到 PCIe,解决了什么核心矛盾?抽象维度:协议栈分层的真正意图是什么?工程维度:高速串行链路面临哪些物理挑战?协议如何应对?系统维度:作为 CPU 与外设的"动脉",PCIe 如何融入整个计算机体系?带着这四个视角去看每一个细节,知识才能内化为认知。

m0_46644103的博客 261

哈希查找

哈希查找 哈希表 哈希函数 理想的情况下是不希望经过任何比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。因而在查找时,只需要根据这个对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需要进行比较便可以直接存取所查记录。我们称这个对应关系为哈西函数,...

AnalogElectronic的博客 5908

SolidWorks速成教程P1——简介及基础操作

SolidWorks教程P1——简介及基础操作

嵌入式阿齐Archie 2万+

hash冲突及解决方法(平均查找长度)

一、什么是hash冲突? 假设hash表的大小为9(即有9个槽),现在要把一串数据存到表里:5,28,19,15,20,33,12,17,10 简单计算一下:hash(5)=5, 所以数据5应该放在hash表的第5个槽里;hash(28)=1,所以数据28应该放在hash表的第1个槽里;hash(19)=1,也就是说,数据19也应该放在hash表的第1个槽里——于是就造成了碰撞(也称为冲突,collision)。 二、Hash冲突解决方法: 1.开放定址法(再散列法): 基本思想:当关键字key的哈希地址p

qq_41475583的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

一、哈希表 1、概念        哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就做散列函数,存放记录的数组叫做散列表。 2、散列存储的基本思路        以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连

smile4lee的博客 15万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据结构——查找3_哈希表

根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表。[可理解为哈希表是由哈希函数和记录的存储位置组成]这一映像过程称为哈希造表或散列,所得存储位置称哈希地址或散列地址。

2301_79397563的博客 1992

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

哈希表的查找及分析

哈希表的查找过程和造表过程基本一致:根据给定的关键字key,用该表对应的哈希函数求得哈希地址,判断该地址的记录与key是否相同。若不相同,则用此哈希表处理冲突的方法来找到下一个哈希地址,直到哈希地的记录为空或者找到与key值相同的记录为止。以开放定址等方法处理冲突的哈希表的查找算法//开放定址哈希表的存储结构//哈希表容量递增表,素数序列typedef struct Elemtype //数据元素类型定义//关键字int a;//其他数据int b;

m0_60707708的博客 781

数据结构期末复习-哈希表的6种构造方法和4种解决冲突方法

文章目录哈希表的概念哈希表散列法存储的基本思想优点缺点哈希方法(杂凑法)哈希函数(杂凑函数)哈希表(杂凑表)冲突哈希方法必须解决以下两个问题构造好的哈希函数制定一个好的解决冲突的方案哈希函数的构造方法直接定址法Hash(key)=a * key+b (a、b为常数)优点缺点举例除留余数法Hash(key)=key mod p (p是一个整数)特点关键技巧数字分析法特点举例平方取中法特点理由例折叠法特点适用于移位法间界叠加法举例随机数法Hash(key)=random(key) (random为随机

博客地址 www.sec0nd.top 1万+

解决Hash(哈希表)冲突的四种方案

哈希是一种通过对数据进行压缩, 从而提高效率的一种解决方法,但由于哈希函数有限,数据增大等缘故,哈希冲突成为数据有效压缩的一个难题。本文主要介绍哈希冲突、解决方案,以及各种哈希冲突的解决策略上的优缺点。哈希冲突即不同key值产生相同的地址,即发生了hash冲突。一般来说,哈希冲突是无法避免的,所以就有了解决方案。常见的解决Hash冲突的方案有开放寻址法、链地址法和再哈希法。

frozenpenguin的博客 1万+

数据结构之哈希表

哈希表通过计算一个以记录的关键字为自变量的函数(称为哈希函数)来得到该记录的存储地址,所以在哈希表中进行查找操作时,需用同一哈希函数计算得到待查记录的存储地址,然后到相应的存储单元去获得有关信息再判定查找是否成功

qq_33501207的博客 1856

Hash算法

概述 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。    Hash主要...

稻草人技术博客 915

查找-哈希查找

在前面讨论的各种结构(线性表、树等)中,记录在结构中的相对位置是随机的,和记录的关键字之后不存在确定的关系。因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在比较的基础上。 理想的情况是希望不经过任何比较,一次存取就能得到所查记录。如何得到? 根据所查找的关键字计算元素位置,设法使得记录在表中的位置和它的关键字取值联系起来。 冲突:不同的关键字可能得到同一个哈希地址的现...

辣条不爱辣的博客 699

hash构造和解决哈希冲突

hash表的实现主要包括构造哈希和处理哈希冲突两个方面: 对于构造哈希来说,主要包括直接地址法、平方取中法、除留余数 法等。 对于处理哈希冲突来说,最常用的处理冲突的方法有开放定址法、再哈希法、链地址法、建立公共溢出区等方法。SGL版本使用链地址法,使用一个链表保持相同散列值的元素。 虽然链地址法并不要求哈希桶长度必须为质数,但SGI STL仍然以质数来设计哈希桶长度,并且将28个质数(逐渐呈现大约两倍的关系)计算好,以备随时访问,同时提供一个函数,用来查询在这28个质数之中,“最接近某数并大于某数

Victor_psl的博客 514

解决哈希冲突的几种方法

拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时, 拉链法中增加的指针域可忽略不计,因此节省空间;在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。

weixin_62988359的博客 5461

【数据结构】哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度

一、哈希表 1、概念 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就做散列函数,存放记录的数组叫做散列表。 2、散列存储的基本思路 以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中。 3、哈希表查找的时间复杂度 哈希表...

lisheng19870305的专栏 1万+
上一篇: 基于c++的作业调度算法模拟
下一篇: 行编辑程序
libingbojava
博客等级 码龄9年 64粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值