查找之散列查找(哈希表)

本学习笔记部分内容来自网易云课堂浙江大学数据结构课程,谢谢!

1、散列表(哈希表)

已知的几种查找方法:

顺序查找  O(N)

二分查找(静态查找)  O(logN)

二叉搜索树      O(h)  h为二叉树高度   (动态查找:有插入有删除有查找)

平衡二叉树      O(logN)

查找的本质:已知对象找位置

1、有序安排对象:全序或半序;

2、直接算出对象位置:散列。

散列查找法的两项基本工作:

1、计算位置:构造散列函数确定关键词存储位置;

2、解决冲突:应用某种策略解决多个关键词位置相同的问题。

时间复杂度几乎为常量O(1),也就是说只要散列函数构造得好,查找时间与问题规模无关。

散列的基本思想:

1、以关键字key为自变量,通过一个确定的函数h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址;

2、可能不同的关键字会映射到同一个散列地址上,即h(keyi)=h(keyj),而(keyi不等于keyj),这称为冲突,需要某种冲突解决策略。

举例:

2、散列函数的构造方法

一个好的散列函数应该:1、计算简单,以提高转换速度;2、关键词对应的地址空间分布均匀,以减少冲突。

关键词为数字时:

a、直接定址法:取关键词的某个线性函数为散列地址,即h(key)=a*key+b;

b、除留余数法(常用):h(key)=key%p   一般p等于表达小,p一般要取素数;

c、数字分析法:分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址,如电话号码、身份证号码某几位会比较随机;

d、折叠法:把关键词分割成位数相同的几个部分,然后叠加;

e、平方取中法:key取平方再取中间几位;

关键词为字符时:

a、ASCII码加和法:h(key)=(求和key[i])mod TableSize;

b、前3个字符移位法:h(key)=(key[0]*27*27+key[1]*27+key[2])mod TableSize;

c、移位法:

3、散列表的冲突处理方法

两种思路:1、开放地址法:换个位置存冲突数据;2、链地址法:同一位置的冲突对象组织在一起。

a、开放地址法:一旦产生了冲突(该地址已有其它元素),就按某种规则去寻找另一空地址。

若发生了第i此冲突,试探的下一个地址将增加di,即:hi(key)=(h(key)+di)mod TableSize;

di决定了不同的解决方案:线性探测:di=i,以增量1,2,...,TableSize-1循环试探下一个存储地址。

举例:h(key)=key mod 11;

查找某个值时,用散列函数计算完后,如果那个结果位置上的数字与关键词不一样时,并不能断定关键词不存在,还应该按照冲突解决策略继续找,直到找到空位置了还没找到,才能断定该关键词不存在。

平方探测(二次探测):di=正负i*i,以增量1方,-1方,2方,-2方,...,q方,-q方且q小于等于TableSize/2下取整,循环试探下一个存储地址。

举例:h(key)=key mod 11;

双散列:di=i*h2(key),h2(key)是另一个散列函数,h2(key)=p-(key
mod p)时效果最好。

再散列:当散列元素太多时(装填因子太大)时,查找效率会下降,实用装填因子一般取0.5到0.85.

当装填因子过大时,解决的方法是加倍扩大散列表,即再散列。

b、分离链接法:将相应位置上冲突的所有关键词存储在同一个单链表中。

举例:

4、散列表的性能分析

关键词的比较次数,取决于产生冲突的多少,如下三个因素会影响冲突的多少:

散列函数是否均匀、处理冲突的方法、装填因子

总结:选择合适的散列函数h(key),散列法的查找效率期望是O(1),它几乎与关键字的空间大小无关,也适合于关键字直接比较计算量大的问题。

散列方法是以较小的装填因子为前提的,是一个以空间换时间的方法。

散列方法的存储对关键字是随机的,不便于顺序查找关键字,不适合于范围查找或最大值最小值查找。

开放地址法:好:散列表是一个数组,存储效率高,随机查找。

不好:有聚集现象。

分离链法:散列表是顺序存储和链式存储的结合,链表部分的存储效率和查找效率都比较低。

好:关键字删除时没有存储垃圾;

不好:太小的装填因子可能会导致空间浪费,太大的装填因子又将付出更多的时间代价,不均匀的链表长度导致时间效率严重下降。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 15:50:18

查找之散列查找(哈希表)的相关文章

查找 之 散列表查找(哈希表)

基础概念 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).这里对应关系f称为散列函数,又称为哈希(Hash)函数. 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table). 散列技术既是一种存储方法,也是一种查找方法. 散列技术最适合的求解问题是查找与给定值相等的记录.不适合一对多的查找,也不适合范围查找. 散列技术中的两个关键问题: 设计一个简单.均匀.存储利用率高的散列函数

散列查找的查找插入及冲突处理方法

处理冲突的方法 1.换个位置:开放地址法 2.同一位置的冲突对象组织在一起:链地址法 开放地址法(Open Addressing): 一旦产生了冲突(该地址已有其他元素),就按某种规则去寻找另一空地址 若发生了第i次冲突,试探的下一个地址将增加di, 基本公式: hi(key) = (h(key)+di) mod TableSize (1≤i<TableSize) di决定了不同解决冲突方案:线性探测.平方探测.双散列 线性探测:di = i +1 +2 +3 平方探测:di = ±i^2 +1

散列查找

编译处理时,涉及变量及属性的管理 :插入(新变量的定义),查找(变量的引用). 顺序查找  O(N)    二分查找 O(logN)    二叉树查找O(H)     平衡二叉树 O(logN) 如何快速查找? 查找的本质:已知对象找位置 有序的安排对象-> 全序:顺序查找  半序:二叉树 直接算出位置-> 散列查找 散列查找:1.计算位置.2.解决冲突. 1计算位置 构造散列函数.  要求:计算简单:地址分布均匀. 数字关键词:1 直接定值.2 除留余数 h(key)= key mod p,

SDUT 3379 数据结构实验之查找七:线性之哈希表

数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 根据给定的一系列整数关键字和素数p,用除留余数法定义hash函数H(Key)=Key%p,将关键字映射到长度为p的哈希表中,用线性探测法解决冲突.重复关键字放在hash表中的同一位置. Input 连续输入多组数据,每组输入数据第一行为两个正整数N(N <= 1000)和p(p >= N的最小素数),N是

SDUT 3377 数据结构实验之查找五:平方之哈希表

数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=±i^2,i=1,2,3,...,m-1 Input 输入一组测试数据,数据的第1行给出两个正整数N(N <= 500)和P(P >=

数据结构学习笔记07散列查找

1.散列表(Hash) 查找的本质: 已知对象找位置. 有序安排对象:全序.半序 直接“算出”对象位置:散列 时间复杂度几乎是常量:O(1),即查找时间与问题规模无关 散列查找法的两项基本工作: 计算位置:构造散列函数确定关键词存储位置: 解决冲突:应用某种策略解决多个关键词位置相同的问题 散列(Hashing) 的基本思想是: ①以关键字key为自变量,通过一个确定的函数 h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址. ②可能不同的关键字会映射到同一个散列地址上,即h

[数据结构] 散列表(哈希表)

散列表(哈希表) 比较难理解的官方定义:散列表/哈希表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 举个例子,我们在查找中文字典时.假设我们要查找"翁weng",我们根据weng找到了对应的页码233,这个过程就是根据关键码值映射得到了表中的位置.然后我们在字典这个散列表中,根据我们刚才得到的位置 233页,直接访问了"

数据结构基础温故-6.查找(下):哈希表

哈希(散列)技术既是一种存储方法,也是一种查找方法.然而它与线性表.树.图等结构不同的是,前面几种结构,数据元素之间都存在某种逻辑关系,可以用连线图示表示出来,而哈希技术的记录之间不存在什么逻辑关系,它只与关键字有关联.因此,哈希主要是面向查找的存储结构.哈希技术最适合的求解问题是查找与给定值相等的记录. 一.基本概念及原理 1.1 哈希定义的引入 这里首先看一个场景:在大多数情况下,数组中的索引并不具有实际的意义,它仅仅表示一个元素在数组中的位置而已,当需要查找某个元素时,往往会使用有实际意义

数据结构-散列查找

判断题 1.将M个元素存入用长度为S的数组表示的散列表,则该表的装填因子为M/S. T      F 2.在散列中,函数"插入"和"查找"具有同样的时间复杂度. T      F 3.在散列表中,所谓同义词就是被不同散列函数映射到同一地址的两个元素. T      F 4.采用平方探测冲突解决策略(hi(k)=(H(k)+i2)%11, 注意:不是±i2),将一批散列值均等于2的对象连续插入一个大小为11的散列表中,那么第4个对象一定位于下标为0的位置. T