哈希表中的查找

基本概念

哈希表(hash table):又称散列表,其基本思路是,设要存储的元素个数是n,设置一个长度为m的连续存储单元,以每个元素的关键字作为自变量,通过哈希函数(h(k))把k映射到一个内存单元,并把该元素存在这个内存单元中,把像这样构造的线性表存储结构称为哈希表。

哈希冲突(hash collisions):在构建哈希表时,出现两个不同关键词对应相同的哈希值,这种现象称作哈希冲突。

装填因子(loading factor)设哈希表空间大小为n,填入表中元素个数为m,则$α=/frac{m}{n}$为哈希表的装填因子。

哈希查找两项基本工作:

  • 计算位置:构造哈希函数确定关键词的位置
  • 解决冲突:应用某种策略解决多个关键词位置相同的问题

这种查找的时间复杂度几乎是常量O(1),即查找时间与问题规模无关。

哈希函数的构造

一个好的哈希函数:

  • 计算简单,以便提高转换速度
  • 关键词对应地空间分布均匀,以尽量减少冲突

直接定址法

是以关键字k加上某个常量c作为哈希地址的方法,其哈希函数为:h(k)=k+c

特点:哈希函数计算简单。当关键字分布基本连续时,可以用直接定址法;否则,将造成内存单元大量浪费

除留余数法

是用关键字k除以整数p所得的余数作为哈希地址,表示为h(k)=k mod p

特点:计算比较简单,适用范围广,是最经常使用的一种哈希函数。

这种方法的关键是选好p,使得每个关键字经转换后映射到哈希表任意地址的概率相等。理论表明,p取不大于表长的素数时效果最好

数字分析法

是指提取关键字中取值较均匀的数字作为哈希地址

特点:它适用于所有关键字已知的情况,需要对关键字每一位的取值分布情况加以分析。

其它构造整数关键字的哈希函数还有平方取中法、折叠法、随机数法等。

哈希冲突的解决方法

开放定址法

线性探测法

是指从发生冲突的地方开始,依次探测下一个地址(表尾的下一个地址是表头),直到找到一个空闲的单元为止。

表示为:d0=h(k)  di=((di-1+1)) mod size

特点:操作简单。但有一个重大的缺陷是容易产生聚集现象,当一个发生冲突,后面紧接着的单元都会由于前面的堆积发生冲突。

平方探测法

是指发生冲突时以±i2 进行探测,公式为:d0=h(k)  di=((d0  ± i2)) mod size

特点:是一种较好的处理冲突的方法,其缺点是不一定能探测到哈希表上的所有单元,但至少能探测到一半单元。

理论表明,哈希表的长度为4k+3(k为整数)形式的素数,平方探测法可以探测到整个哈希表空间。

其它方法还有伪随机序列法、双哈希函数法等

拉链法

是指将所有哈希值相同的关键字用单链表链接起来。

在这种方法中,哈希表的每个单元存放的不再是元素本身,而是一个个单链表的头结点。

与开放定址法比较:

  • 处理冲突简单,无堆积现象,因此平均查找长度较短
  • 由于单链表的结点是动态申请,适合元素规模未知的情况
  • 开放地址法为了减少冲突要求装填因子较小,故当数据规模较大时浪费空间;拉链法节省空间
  • 用拉链法构造的哈希表中,删除结点比较简单

哈希表的性能分析

用平均查找长度(ASL)来度量查找表的查找效率:成功、不成功

哈希表的性能就是看比较次数,而比较次数取决于冲突的多少,影响冲突的因素:

  • 哈希函数是否均匀
  • 处理冲突的方法
  • 装填因子α

我们这里只考虑后两种因素,主要是一些理论上的结果

线性探测法

可以证明,线性探测法的期望探测次数为:

当α=0.5时,ASLu=2.5次,ASLs=1.5次。

平方探测法

可以证明,平方探测法的期望探测次数为:

当α=0.5时,ASLu=2次,ASLs=1.39次

拉链法

把所有单链表的平均长度定义成装填因子α,α有可能超过1,可以证明,其平均期望探测次数p为:

当α=1时,ASLu=1.37次,ASLs=1.5次

总结

  • 选取合适的哈希函数h(key),查找效率的期望是O(1)
  • 以较小的α为前提,实质是以空间换时间
  • 哈希表对关键词是随机存储的,不便顺序查找
  • 不适合范围查找、最大最小值查找

参考链接:中国大学mooc  陈越、何钦铭 数据结构

原文地址:https://www.cnblogs.com/lfri/p/10134429.html

时间: 2024-10-14 17:40:01

哈希表中的查找的相关文章

[转]如何在注册表中进行查找

1 2 3 4 5 6 7 分步阅读 经常碰到网友提问,电脑一开机,就会弹出一些提示,说某个文件找不到,可是,找又找不到,不知如何是好. 其实,这都是某些软件被卸载后,留下的残余,一般是保留在注册表中某一个项中,象这样的问题,可以到注册表去找,因为注册表很庞大,要找一个项目非常难,必须采用查找的方法,如何在注册表中进行“查找”.本文就介绍查找方法 工具/原料 电脑 方法/步骤 在注册表中进行查找的步骤: 1,要搜索注册表,必须先进入注册表,进入方法,在开始菜单中打开“运行”,也可以直接按Win+

Linux内核哈希表中的bucket桶

哈希表 哈希表(Hashtable)又称为“散列”,Hashtable是会根据索引键的哈希程序代码组织成的索引键(Key)和值(Value)配对的集合.Hashtable 对象是由包含集合中元素的哈希桶(Bucket)所组成的.而Bucket是Hashtable内元素的虚拟子群组,可以让大部分集合中的搜寻和获取工作更容易.更快速. 哈希函数(Hash Function)为根据索引键来返回数值哈希程序代码的算法.索引键(Key)是被存储对象的某些属性值(Value).当对象加入至 Hashtabl

Redis Hlen 命令用于获取哈希表中字段的数量

http://www.runoob.com/redis/hashes-hlen.html

【算法与数据结构】哈希表-链地址法

哈希表的链地址法来解决冲突问题 将所有关键字为同义词的记录存储在同一个线性链表中,假设某哈希函数产生的哈希地址在区间[0, m - 1]上,则设立一个至振兴向量 Chain  ChainHash[m]; 数据结构 //链表结点 typedef struct _tagNode { int data; //元素值(关键字) struct _tagNode* next; //下一个结点 }Node, *PNode; //哈希表结点 typedef struct _tagHashTable { //这里

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

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

Linux内核中的哈希表

Author:tiger-john Time:2012-12-20mail:[email protected]Blog:http://blog.csdn.net/tigerjb/article/details/8450995 转载请注明出处. 前言: 1.基本概念: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表.

哈希表之四查找及分析

哈希表查找和哈希表的构造过程基本一致,见下图 哈希表插入和查询的例子(先省略) (1)哈希表虽然建立了关键字和记录的存储位置之间的映射关系,但是由于冲突,导致是一个多对一的映射, 所以,哈希表的查找效率是平均查找长度: (2)查找过程中徐鹤给定值进行比较的关键字的个数取决于三个因素:哈希函数,处理冲突的方法和装填因子 (3)一般情况下,处理冲突方法相同的哈希表,其平均查找长度依赖于哈希表的装填因子. 哈希表装填因子的定义: 表示哈希表的装填程度,越小,发生冲突的可能性就越小:反之越大,表示已填入

java中哈希表及其应用详解

哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺序(如顺序查找或二分查找)与各个元素进行比较,当数组或向量中的元素数量很多时,查找的效率会明显的降低. 一种有效的存储方式,是不与其他元素进行比较,一次存取便能得到所需要的记录.这就需要在对象的存储位置和对象的关键属性(设为 k)之间建立一个特定的对应关系(设为 f),使每个对象与一个唯一的存储位置

上古时代 Objective-C 中哈希表的实现

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性能分析 NXHashTable 的作用 NXHashTable 的实现有着将近 30 年的历史,不过仍然作为重要的底层数据结构存储整个应用中的类. 文中