散列表

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

1 定义

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

				存储位置 = f(关键字)

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

2 常见的散列函数

选取好的散列函数的原则:计算简单、散列地址分布均匀

  • 直接定址法:f(key)= a*key + b (a,b为常数),适用于知道关键字分布,查找表较小且连续的情况
  • 数字分析法: 抽取关键字的一部分数字来计算散列存储位置,适用于关键字位数较多的情况
  • 平方取中法: 将关键字平方后抽取中间几位数字作为散列地址,适用于不知道关键字的分布,而位数又不是很大的情况
  • 折叠法: 将关键字从左至右分割成位数相等的几部分,并将这几部分叠加求和,取后几位作为散列地址。适用于不知道关键字分布,且位数较多的情况。
  • 除留余数法: f(key) = key mod p (p<=m),对关键字直接取模作为散列地址,是最常用的构造散列函数方法
  • 随机数法: f(key) = random(key),选取一个随机数,取关键字的随机函数值为它的散列地址。适用于关键字长度不等的情况。

3 处理散列冲突

  • 开放地址法:一旦发生地址冲突,就去寻找下一个空的散列地址。
    线性探测法
    fi(key) = (f(key)+ di)MOD m (di = 1,2,3,…,m-1)
    二次探测法
    fi(key) = (f(key)+ di)MOD m (di = 12,-12,22,-22,…,q2,-q2,q<=m/2)
    随机探测法
    fi(key) = (f(key)+ di)MOD m (di 是一个随机数列)
  • 再散列函数法:对于我们的散列表,事先准备多个散列函数,发生冲突时,就换一个散列函数计算
  • 链地址法:发生冲突时,将关键字为同义词的记录存储在一个单链表中(同义词字表),在散列表中只存储所有同义词子表的头指针,在查找时,可能需要遍历单链表
  • 公共溢出区法:将所有冲突的关键词都统一存储到溢出表中,查找时,先与散列表中的值做比较,若不等再去溢出表中遍历查找。

4 示例

const maxLength = 10;    //hash表的长度
let hashTable = [];
hashTable.len = 0;

hashTable.getAddr = function(key){   //计算hash地址
	return key % maxLength;
};

hashTable.add = function(key){    //插入关键字
	if (this.len >= maxLength){
		console.log("存储失败,空间不足");
		return false;
	}

	let addr = this.getAddr(key);
	while(this[addr] !== undefined){  //开放地址法的线性探测解决地址冲突
		addr = (addr + 1) % maxLength;
	}
	this[addr] = key;
	this.len++;
	console.log("存储成功:"+key);
	return true;
};

hashTable.get = function(key){   //查找关键字地址
	let addr = this.getAddr(key);
	while(this[addr]!==key){
		addr = (addr + 1) % maxLength;
		if (addr === this.getAddr(key)){
			console.log(key+"不存在");
			return -1;
		}
	}
	console.log(key+"的存储位置为:"+addr);
	return addr;
}
哈希表与散列表的原理及C++实现 哈希表(Hash Table)是一种高效的数据结构,用于存储键值对(Key-Value Pairs)。它通过哈希函数(Hash Function)将键(Key)映射到一个固定大小的数组(称为散列表)中的某个位置,从而实现快速的插入、查找和删除操作。哈希表的核心思想是通过哈希函数将键转换为数组的索引,从而直接访问对应的值。理想情况下,哈希表的插入、查找和删除操作的时间复杂度都是O(1)。哈希表是一种高效的数据结构,通过哈希函数将键映射到数组索引,从而实现快速的插入、查找和删除操作。 阅读详情

相关推荐

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

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

守望的博客-编程珠玑 3568

数据结构之查找

(掌握散列查找的特征和性能分析,散列表的构造和冲突处理方法,查找成功和查找失败的平均查长度;折半查找的过程,构造判定树,分析平均查找长度;掌握B树的插入删除和查找,B+树的概念性质)用于在静态的线性表(顺序表or链表)中进行查找:从线性表的某一端开始,将表中的元素与关键字逐个比较。对于顺序表,通过数组下标递增的顺序扫描每个元素;对于链表,可通过指针来一次扫描每个元素把待查关键字key存入表头(哨兵、监视哨), 从而避免查找过程中每一次比较后都要判断查找位置是否越界,加快查找速度。

weixin_46516647的博客 2096

哈希表问题

设定哈希函数 H(key) = key MOD 11 ( 表长=11 ),输入一组关键字序列,根据线性探测再散列解决冲突的方法建立哈希表的存储结构,显示哈希表,任意输入关键字,判断是否在哈希表中。

【PTA】【数据结构与算法】散列冲突

这里是从PTA平台整理的【散列冲突】题目集

葑鈊丶 3万+

图像特征(一)——颜色特征(颜色直方图,颜色矩,颜色集,颜色聚合向量和颜色相关图)

本文主要是为了更好地理解图像特征,理解各方法的原理。转载请注明出处https://mp.csdn.net/console/editor/html/105090183 图像模式识别的一般步骤为:输入图像--图像预处理--特征提取--特征选择--图像分类--输出结果。 图像特征主要有:颜色特征、形状特征、纹理特征和空间关系特征。 本文主要介绍颜色特征,并给出matlab上实现的demo。 颜...

gloria_iris的博客 3万+

睿尔曼超轻量仿人机械臂--机械臂接口介绍

本文介绍了睿尔曼超轻量仿人机械臂的控制器接口及末端接口。

realman_Rop的博客 3438

给定散列表大小为11,散列函数为H(Key)=Key mod 11。按照线性探测冲突解决策略连续插入散列值相同的4个元素。问:此时该散列表的平均不成功查找次数是多少?

给定散列表大小为11,散列函数为H(Key)=Key%11。按照线性探测冲突解决策略连续插入散列值相同的4个元素。问:此时该散列表的平均不成功查找次数是多少? A.1 B.4/11 C.21/11 D.不确定 答案:C 分析: 区别概念平均成功查找次数和平均不成功查找次数。 平均成功查找次数=每个关键词比较次数之和÷关键词的个数 平均不成功查找次数=每个位置不成功时的比较次数之和÷表长(所谓每个位...

weixin_46678290的博客 2万+

记一次完整的RPG Maker MV游戏逆向过程(思路一)

了解RPG Maker MV的文件建构 上一篇文章,我们已经成功在PC上运行了游戏,那我们如何对游戏进行逆向呢? 首先要了解正常的RPG Maker MV制作的游戏应该具有哪些文件,以及他的结构 那如何了解他的结构呢,很简单,我们只需要用RPG Maker MV创建一个默认工程,来看看一个游戏的最简结构是怎么样的 创建新项目 项目创建完成 查看项目目录结构 是不是和之前解包出来的很像呢? 通...

Ciiiiiing的博客 1万+

散列表:散列表的查找

散列表的查找

qq_46785243的博客 734

(一篇即成功)Ubuntu下搭建qt环境和安装Qt Creator

只需一篇就成功搭建Ubuntu下的QT环境 你还在等什么

m0_73450461的博客 1万+

STC51单片机串口多字节数据接收的优化策略

本文深入探讨了STC51单片机串口多字节数据接收的优化策略。针对数据丢包、粘包等常见痛点,核心思路是采用“缓冲队列+定时器超时”模式,将实时处理转变为“先收纳,后处理”。文章详细讲解了硬件初始化、中断服务程序优化(快速入队与激活超时裁判)以及主循环的非阻塞设计,并进阶介绍了环形缓冲区实现与错误处理,旨在构建稳定可靠的串口通信系统。

weixin_29264201的博客 374

链地址法作为解决冲突

设散列表的长度为10,散列函数H(n)=n mod 7,初始关键字序列为 (33,24,8,17,21,10),用链地址法作为解决冲突的方法,平均查找长度是 1.5 33%7 = 5 24%7 = 3 //第一次出现3 8%7 = 1 17%7 = 3 //第二次出现3,所以找17会先找24 21%7 = 0 10%7 = 3 //第三次出现3,找10要先找17,24 (1+1+1+2+1+3)/6 = 1.5 哈希查找: 地址见: 添加链接描述 ...

世上再无张显宗 3365

获取抖音中x-secsdk-csrf-token的方法

获取抖音中x-secsdk-csrf-token的方法

sh_moranliunian的博客 2019

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

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

Ycy的博客 1万+

OSPF规划两大模型:双塔奇兵、犬牙交错

大家好,今天给大家带来的是OSPF规划两大模型:双塔奇兵、犬牙交错,让我们直接开始吧! OSPF规划之双塔奇兵 说明: OSPF 如果某个区域存在两个 ABR,并且在两个 ABR 上都对 area n 内的路由做了聚合操作。 最佳配置: 两台ABR之间的红线应该使用以太网的子接口技术,一个子接口属于area0,另一个属于 area n;或者该链路规划为 area n,同时配置虚连接; ABR 的 loopback0 规划入 area 0 OSPF 规划之犬牙交错 说明: 有时接入层的设备会以乱序的

网络技术联盟站 2423

数学建模学习(5):最全概率分析之图表绘制详解,内容比较多,建议收藏

(1) 绘制正整数频率使用 tabulate(X) (2)

全栈川川 4592

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

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

m0_61705102的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

哈希表(散列表)详解

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

不能再留遗憾了的博客 2304

老版QQ原生表情gif动态

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

Philosophy7的博客 2405

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

哈希表知识总结

m0_57105290的博客 6515

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

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

ROBOT_a的博客 2704

散列表(哈希表)

散列表(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”,简称“

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

哈希表(散列表)

除留余数法用关键字除以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
上一篇: 动态规划 剪绳子 (JS 实现)
下一篇: 平衡二叉树AVL(JS实现)
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值