数据结构之hash(散列)

基础概念:
哈希是一种用以常数平均时间插入,删除和查找的技术。但是一般不支持如FinMin,FinMax以及以线性时间按排序顺序将整个表打印的操作。进一步讲,哈希就是将任意长度的输入,通过散列算法,变换成固定长度的输出,该输出值就是散列值。

哈希表:利用hash技术实现,理想情况下为一个包含有关键字(key-indexed,可以为整数、字符串等)的具有固定大小的数组。输入待查找的值即关键字,即可查找到其对应的数据元素。

哈希函数:建立起数据元素的存放位置与数据元素的关键字之间的对应关系的函数。即使用哈希函数可将被查找的键转换为数组的索引。理想情况下它应该运算简单并且保证任何两个不同的关键字映射到不同的单元(索引值)。但是,这是不可能的,很多时候我们都需要处理多个键被哈希到同一个索引值的情况,即哈希碰撞冲突

哈希函数
1:直接寻址法:以关键字的某个线性函数值为哈希地址,可以表示为hash(k)=Ak+c;优点是不会产生冲突,缺点是空间复杂度较高,可能会造成空间的大量浪费,适用于元素较少的情况。
2:数字分析法:取数据元素关键字中某些取值较均匀的数字来作为哈希地址的方法。
3:除留余数法:是由数据元素关键字除以某个常数所留的余数为哈希地址,该方法的关键是常数的选取,一般要求是接近或等于哈希表本身的长度最好,该常数选取素数最好。
4:平方取中法:对关键字计算平方,然后根据可使用空间的大小取中间分布较均匀的几位,散列到相应的位置。
5:随机数法:设定哈希函数为:H(key) = Rand(Key),Rand()为伪随机函数,此法适合于对长度不等的关键字构造哈希函数。
6:相乘取整法:首先用关键字key乘上某个常数A(0 < A < 1),并抽取出key.A的小数部分,然后用m乘以该小数后取整
函数冲突处理方法:
1:开放地址法(再散列法):当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。

            Hi=(H(key)+di)%m,i=1,2,…,n

1) 线性探测法:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。 建立在两个假设基础上:(1)表格足够大(2)每个元素都能够独立

            di=1,2,3,…,m−1

2)二次探测法:冲突发生时,在表的左右进行跳跃式探测,比较灵活

            di=12,−12,22,−22,…,k2,−k2(k<=m/2)

3)伪随机探测法:

            di=伪随机数序列

2:链地址法:这种方法的基本思想是将所有的哈希地址为i的元素构成一个同义词链的单链表,并将单链表的头指针存在哈希表的第i单元中,因而查找,删除,插入主要在同义词链中进行,由于链表的特点是:寻址困难,插入和删除容易,链地址法适用于经常进行插入删除的情况。
3:公共溢出区法:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
4:再哈希表:这种方法是同时构造多个不同的哈希函数

这里写图片描述

你可能感兴趣的:(算法与数据结构,散列,hash,数据结构)