哈希表

来源:互联网 发布:故宫淘宝营销策略分析 编辑:程序博客网 时间:2024/06/06 05:44
  • 概述
  • 哈希函数的基本构造方法
  • 处理冲突的常用方法
  • 哈希表的建立、查找及其ASL分析

概念

哈希表的基本思想

在记录的存储地址与它的关键词之间建立一个确定的对应关系,这样理想状态下不经过比较,一次存储就能得到所查元素。

哈希表

一个有限的连续的地址空间,用以容纳用哈希地址存储的记录。

哈希函数

记录的存储位置与它的关键词之间存在的一种对应关系

冲突

对不同的关键字可能得到同一哈希地址,即key1key2,而H(key1)=H(key2)

同义词

具有相同函数值的关键字对该哈希函数来说称做同义词。

哈希散列地址

根据设定的哈希函数H(key)和处理冲突的方法确定的记录的存储位置。

装填因子

表中填入的记录数n和哈希表表长m之比。
α=n/m


哈希函数的基本构造方法

若是非数字关键字,则需先对其进行数字化处理。

直接定址法
H(key)=akey+b,a,b
此法仅适合于:地址集合的大小 = 关键字集合的大小
例:
有一个1岁到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。(即H(key)=key)

地址 01 02 03 … 100 年龄 1 2 3 … 100 人数 3000 2000 2500 … … …

若有一个解放后出生的人口调查表,关键字是年份,哈希函数取关键字加一常数:H(key)=+(1948) 表格略

数字分析法
取关键字的若干数位作为哈希地址。

假设关键字集合中的每个关键字都是由 s 位数字组成 (u1, u2, …, us),分析关键字集中的全体,并从中提取分布均匀的若干位或它们的组合作为地址。
此方法仅适合于:能预先估计出全体关键字的每一位上各种数字出现的频度。

平方取中法
取关键字平方后的中间几位作为哈希地址。

求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。
此方法适合于: 关键字中的每一位都有某些数字重复出现频度很高的现象。

折叠法
将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几个部分的叠加和(舍去进位)作为哈希地址。

此方法适合于: 关键字的数字位数特别多。
两种叠加方法

除留余数法
H(key)=key MOD p (p<=m)
m:哈希表的表长
p:最好为素数,有助于哈希表的散列

为什么要对 p 加限制?

给定一组关键字为: 12, 39, 18, 24, 33, 21, 若取 p=9, 则对应的哈希函数值将为: 3, 3, 0, 6, 6, 3
可见,若 p 中含质因子 3, 则所有含质因子 3 的关键字均映射到“3 的倍数”的地址上,从而增加了“冲突”的可能。

随机数法
H(key)=random(key)
此方法适合于:关键字长度不等时的情况。


处理冲突的常用方法

开放定址法 (空缺编址法)
(为产生冲突的地址寻找下一个哈希地址)
Hi = ( H(key)+di ) MOD m
i=1,2, …, k (k<=m-1)
m:哈希表的表长; di:增量序列

1)线性探测再散列 di= 1,2, …, m-1
缺陷:有聚集(堆积)现象—非同义词地址冲突。

若冲突,则依次位置+1,直到找到空闲位置,插入

2)二次探测再散列 di= 12, -12, 22, -22, 32,…,+-k2
k <=m/2

若冲突,则以冲突位置为基准,依次看+12,12,+22,22,+32,32,...的位置上是否空闲,若空闲则插入,以此类推。

3)伪随机探测再散列 di = 伪随机数序列

4) 双重散列函数探查法 di= i*h1(key)
0< i <=m- 1
要求:h1(key)的值与m互素。
m为素数时, h1(key)可取1到m-1之间的任何数,建议h1(key)=key mod (m-2) +1
m为2的方幂时, h1(key)可取1到m-1之间的任何奇数

再哈希法
Hi = RHi(key) i=1,2, … , k RHi为不同的散列函数

链地址法
为每个哈希地址建立一个单链表,存储所有具有同义词的记录。

建立一个公共溢出区


哈希表的建立、查找及其ASL分析

0 0
原创粉丝点击