Hash(哈希/散列)

来源:互联网 发布:网页数据统计 编辑:程序博客网 时间:2024/05/14 10:28

Hash:一种用于查找的数据结构

散列查找的前提是已经一定的规则方法建好了哈希表。基本思想是:”关键字-地址转换法“->以数据对象的关键字为自变量,通过一个确定的函数关系h,计算出对应的函数值h(key),把这个值解释为数据对象的存储地址,并按此存放,即存储位置=h(key)

关键:

1.构造好的散列函数

2.制定解决冲突(经过散列变换,可能将不同的关键字映射到同一散列地址上)的方案

散列函数构造方法:

1.直接定址法

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

2.除留余数法(重点)

假设散列表的表长为TableSize,选择一个正整数p,p<=TableSize,构造散列函数:h(key) = key mod p。一般选p为小于等于散列表表长TableSize的某个最大素数为好。用素数求余数作为散列地址,比较均匀的分布在整个地址空间的可能性比较大。(如果p<TableSize,则地址p~TableSize-1是不能通过散列函数直接映射到的,不过不用担心浪费,处理冲突时可能会用到

处理冲突的方法:

常用开放地址法:发生冲突后,寻找空的散列地址,基本公式:一般来说,发生了第i次冲突,试探的下一个地址将增加di,hi(key)=(h(key)+di) mod TableSize

1.线性探测法(重点):

di选为i,就为线性探测。即线性探测法以增量序列1,2,3,......,TableSize-1循环试探下一个存储地址,做插入操作时,要找到一个空位置,或者知道散列表已满为止。做查找操作的时候,探测一个比较一次关键词,直到找到特定的数据对象或者探测到一个空位置表示查找失败为止。

成功查找的平均查找长度:成功查找序列每个数据的次数和/序列数的个数

查找失败的平均查找长度:把查找失败的数据分为TableSize类,即0~TableSize-1(就像人再多,可分为男人女人),每类数据查找失败的次数和/TableSize

2.平方探测法:

di=i^2和-i^2,即增量序列为1^2,-1^2,2^2,-2^2,......,q^2,-q^2

有一个定理:如果散列表长度TableSize是某个4*k+3(k是正整数)形式的素数时,平方探测法就可以探查到整个散列表空间


1 0
原创粉丝点击