数据结构--7.1散列表(哈希表)查找

2023-09-13 16:35:39

散列表查找 

我们要在a[ ] 中查找key关键字的记录:

——顺序表查找:挨个儿查找

——有序表查找:二分法查找

——散列表查找

        记录的存储位置 = f(关键字)

        散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。

        这里我们把这种对应关系f称为散列函数,又成为哈希(Hash)函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。
 

散列表的查找步骤:

——当存储记录时,通过散列函数计算出记录的散列地址

——当查找记录时,我们通过同样的是散列函数计算记录的散列地址,并按此散列地址访问该记录

我们可以取关键字的某个线性函数值为散列地址,即:f(key)= a * key + b。

数字分析法

数字分析法通常适合处理关键字位数比较大的情况。

平方取中法

平方取中法是将关键字平方之后取中间若干位数字作为散列地址。

折叠法

折叠法是将关键字从左到右分割成位数相等的几部分,然后将这几部分叠加求和,并按散列表表长取后几位作为散列地址。

除留余数法

此方法为最常见的构造散列函数方法,对于散列表长为m的散列函数计算公式为:

—— f(key) =  key mod p(p<=m)

        实际上,这个方法不仅可以对关键字直接取模,也可以通过折叠、平方取中后再取模。

随机数法
——选择一个随机数,取关键字的随机函数值为它的散列地址。

即:f(key) = random(key)。

这里的random是随机函数,当关键字的长度不等时,采用这个方法构造散列函数是比较合适的。

处理散列冲突的方法

开放地址法

所谓的开放地址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。

公式:

        fi(key) = (f(key)+di) mod m 

(是mod   m  ; di = 1,2,3,……,m-1)

再散列函数法

fi(key) = RHi(key)(i= 1,2,3,4,……,k) 

 

#define HASHSIZE 12
#define NULLKEY -32768

typedef struct
{
	int *elem;
	int count;
 }HashTable;
 
int InitHashTable(HashTable *H)
{
	H->count = HASHSIZE;
	H->elem = (int *)malloc(HASHSIZE * sizeof(int));
	if( !H->elem)
	{
		return -1;
	}
	for(i=0;i<HASHSIZE;i++)
	{
		H->elem[i] = NULLKEY;
	}
	return 0;
} 

//除留余数法
int Hash(int key)
{
	return key % HASHSIZE;
 } 

//插入关键字到散列表 
void InsertHash(HashTable *H,int key)
{
	int addr;
	addr = Hash(key);
	while(H->elem[addr] != NULLKEY)   //如果不为空,则冲突出现 
	{
		addr = (addr + 1) % HASHSIZE; //开放地址法的线性探测 
	}
	H->elem[addr] = key;
 } 

//散列表查找关键字
int SearchHash(HashTable H,int key,int *addr)
{
	*addr = Hash(key);
	while(H.elem[*addr] != key)
	{
		*addr = (*addr + i) % HASHSIZE;
		if(H.elem[*addr] == NULLKEY || *addr == Hash(key))
		{
			return -1;
		 } 
	}
	return 0;
 } 

 

更多推荐

GAN入门|第四篇:生成手势图像|可控制生成

🍨本文为🔗365天深度学习训练营中的学习记录博客🏡我的环境:语言环境:Python3.10.11编译器:JupyterNotebook深度学习框架:Pytorch2.0.1+cu118显卡(GPU):NVIDIAGeForceRTX4070👉考虑到大家算力有限,这里为大家提供我已经训练好生成器模型,大家可自行下

前端之webpck的优化

一、webpack的打包流程/webpack的机制/原理/webpack是怎么打包的1webpack是根据运行的指令来决定一个基本的业务流程2如果是build就是执行打包,如果是配合了devServer就是就行本地化的调试。两者其实在本质上没有太大区别,只是devServer会运行一个node服务器来进行本地化调试,打

构建工具Webpack简介

一、构建工具当我们习惯了Node中使用ES模块化编写代码以后,用原生的HTML、CSS、JS这些东西会感觉到各种不便。比如:不能放心的使用模块化规范(浏览器兼容性问题)、即使可以使用模块化规范也会面临模块过多时的加载问题。这时候我们就希望有一个工具能对代码进行打包,将多个模块打包成一个文件。这样一来即解决了兼容性问题,

pdf文件太大如何处理?教你pdf压缩简单方法

PDF文件过大,是很多人在使用PDF文件时都遇到过的一个常见问题,过大的PDF文件不仅会占用大量的存储空间,还会影响文件传输和处理效率,下面给大家总结了几个方法,帮助大家解决PDF文件过大的问题。方法一:嗨格式压缩大师这是一款专业的文件压缩工具,支持多种文件格式的压缩,包括PDF文件,它具有简单易用的界面,可以帮助用户

爬虫介绍及举例

爬虫(Webcrawler)指的是一种自动化程序,可以通过互联网上的URL,按照一定的规则,自动地抓取目标网站的数据,包括文字、图片、视频等,然后将这些数据进行处理、分析、存储或展示。举例来说,爬虫可以用于搜索引擎的抓取和索引,比如Google、百度等。当用户输入关键字进行搜索时,搜索引擎便会调用爬虫程序到网络上抓取相

Ebay易贝商品详情数据接口

易贝商品详情数据接口可以用于获取易贝商品详情信息,包括商品链接、状态、标题、简介、分类、商品图片、销量、价格等。获取易贝商品详情数据的接口是item_get,其请求参数为num_iid(EBAY商品ID),通过传入该参数可以获取商品详情数。易贝商品详情数据接口的具体使用方法如下:注册并获取API密钥。通过调用相应的AP

Docker Compose

文章目录简介compose文件一、文件简介二、version三、services1.build:2.image3.container_name4.ports5.command6.depends_on7.deploy8.networks9.volumes四、networks1.name2.driver3.attachab

加速老化测试目的是什么?

加速老化测试使用加速应力的组合来暴露产品设计和制造中的产品缺陷。这有助于提高产品可靠性并减少现场故障和保修费用。加速老化测试在环境室中进行,高温加速有效时间,通常与所有振动台结合使用,产生全轴振动。加速老化测试可分为高加速寿命测试(HALT)和高加速应力筛选(HASS)。这两种技术都使用远远超出产品正常工作条件的应力,

IT隔离电源系统在医院低压配电箱中的应用

【摘要】参考国外及国际对医疗领域的相应标准,结合我国有关的规范%标准,对手术室等处的供配电系统作出了探讨;论述了IT配电系统在医院的应用范围;分析了IT系统接地故障的特点;提出了医院手术室IT电源系统的基本配置。【关键词】手术室配电系统;故障;绝缘监视;漏电198.2138.07290引言*近,本院就北部分院的两百多个

mybatis动态sql&choose&foreach&sql 及include & sql中的特殊字符&后台分页实现& 数据版本号处理并发问题

1.动态sql简述mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑.总体说来mybatis动态SQL语句主要有以下几类:if语句(简单的条件判断)choose(when,otherwize),相当于java语言中的switch,与jstl中的choose很类似trim(对包含的

【Python】基础数据结构:列表——元组——字典——集合

文章目录一、简述二、Python中的列表详解2.1创建列表2.2访问列表元素2.3修改列表元素2.4列表切片2.5列表方法2.6列表推导式三、Python中的元组详解3.1创建元组3.2访问元组元素3.3元组是不可变的3.4元组切片3.5元组方法四、Python中的字典详解4.1创建字典4.2访问字典元素4.3修改字典

热文推荐