数据结构与算法25-散列表查找(哈希表)

散列表查找(哈希表)

我们只需要能过某个函数f,使得存储位置=f(关键字)

那样我们可以通过查找关键字不需要比较就可获得需要的记录的存储位置。这就是一种新的存储技术-----散列技术

散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。

这里我们把这种对应关系f称为散列函数,又称为哈希(Hash)函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash  table)

散列表查找步骤

整个散列过程其实就两步:

1.    在存储时,通过散列函数计算记录的散列地址,并按此散列地址存储该记录。

2.    当查找记录时,我们通过同样的散列函数计算记录的散列地址,按此散列地址访问该记录。说起来很简单,在哪存的,上哪去找,由于存取用的是同一个散列函数,因此结果当然也是相同的

所以说散列技术既是一种存储方法,也是一种查找方法

散列技术最适合的求解问题是查找与给定值相等的记录

设计一个简单、均匀、存储利用率高的散列函数是散列技术中最关键的问题。另一个问题是冲突。在理想的情况下,每一个关键字,通过散列函数计算出来的地址都是不一样的,可现实中,这只是一个理想,我们时常会碰到

两个关键字key1≠key2,但是却有f(key1)=f(key2),这种现象我们称为冲突,并把key1和key2称为这个散列函数的同义词

散列函数的构造方法

1.    散列函数的计算时间不应该超过其通过查找技术与关键字比较的时间。

2.    散列地址分布均匀,这样就可以保证存储空间的有效利用,并减少为处理冲突而耗费的时间

直接定址法

取关键字的某个线性函数值为散列地址

f(key)=aXkey+b

这样的散列函数优点就是简单、均匀、也不会产生冲突,问题是这需要事先知道关键字的分布情况,适合查找表较小且连续的情况。由于这样的限制,在现实应用中,此方法虽然简单,但却并不常用。

数字分析法

平方取中法

折叠法

除留余数法

随机数法

猜你喜欢

转载自blog.csdn.net/lhr434348820/article/details/82901167