散列表

1. 散列的概念

散列(Hash):既是一种存储方式,又是一种查找方法。又称作哈希查找。

散列表/哈希表:按散列存储方式构造的查找表,称之为~。

散列基本思想:以关键码为自变量,通过一定的函数关系计算出函数值,将函数值作为结点的存储地址,将结点存入计算得到的存储单元中。其函数则为散列函数

散列搜索算法:主要由两部分组成:散列函数和冲突调节。

冲突调节:理想的情况是不同的关键字映射到同的地址,但经常会出现两个或多个关键字映射到同一个地址,即冲突。处理这种关键字的过程即为冲突调节。

 

例1-散列表:关键码序列为{2,5,8,6}存储到编号为0到4,表长为5的数组中,计算存储地址的散列函数采用模5的方法,即散列函数:H(key)=key%5 求散列表。

散列表计算过程:

2 % 5 =2 --> array[2] =2;

5 % 5 = 0 --> array[0] = 5;

% 5 = 3--> array[3] = 8;

% 5 = 1--> array[1] = 6;

即散列表的存储序列为 array[5]={5,6,2,8}

 

2.常用的散列函数

(1)直接地址法

    H(key) = a * key + b  (a,b 为常数)

(2)除留余法

    H(key) = key % p

    据理论分析和测试结果,p应取小于列表长度m的素数,或不包含小于20的质因数的合数。

(3)平方取中法

(4)数字分析法

(5)折叠法

 

3.处理冲突的方法

(1)开放地址法

    当冲突发生时,形成一个地址序列,沿关这个地址序列逐个探测,直到找到一个“空”的开放地址,将冲突发生的关键字存到该地址中去。

    其序列称为探测序列;由此生成的散列表称为闭散列表。

  A.线性探测再散列

   当冲突发生时,顺序查看表中下一个位置,直到找到一个空的位置,将关键字存入这个地址。

              Hi = ( H(key) + di ) %m    (di=1,2,3…为探测序列)  

  B.二次探测再散列

   冲突发生时,在表的左右进行跳跃性控测。比较灵活。

              Hi = ( H(key) + di ) %m   

 (di=1平方,-1平方,2平方,-2平方…q平方,-q平方,且q<=m/2)

(2)链地址法

    把具有相同散列地址的关键码存入同一个单链表中。散列表中的每个单元存储的不是元素,而是相应单链表的头指针。

    优点:能较好的解决溢出问题;缺点:存储空间增加,空闲存储单元增加。

 

例2-冲突调节:关键码集合为{47,7,29,11,16,92,22,8,3},散列表表长为11,散列函数为

H(key) = key % 11.写出分别使用线性探测再散列、二次探测再散列和链地址法的所得到的散列表。

(1)线性探性测再散列:Hi = ( H(key) + di ) % m

   散列表

    如当计算 3 % 11 = 3时,发生冲突,采用冲突处理:

   ((3 % 11)+ 1 )% 11 = 4, 冲突!再探测一下个,

   ((3 % 11)+ 2 )% 11 = 5, 冲突,再下一个,

   ((3 % 11)+ 3 )% 11 = 6, OK!

(2)二次探测再散列

    散列表

    如当计算 3 % 11 = 3 时,发生冲突, 采用冲突处理:

   ((3 % 11)+ 1 )% 11 = 4,再次冲突,探测下一个 ,

   ((3 % 11)- 1 )% 11 = 2, OK!

(3)链地址法

   散列表

   如计算3 % 11 = 3 ,将3插入到已存在的单链表中,插入到结点47的前面。

 

参考:《数据结构》.王玉.2008.山东出版社


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值