散列查找
- 【前言】此文知识点均读自《大话数据结构》和《算法导论》后总结而成。若同仁们有兴趣强烈向大家推荐这俩本书。图中截图取自网易云课堂的数据结构在线视频。
- 今天圣诞节前夜,女票考研,好基友们要么陪对象,要么在帮导师干活,我只能孤苦地学习啦!
(一).散列查找的一些概念
1.查找的本质:已知对象找位置。
1.有序安排对象:顺序表查找,二分法查找,二叉搜索树查找,平衡二叉树查找等
2.直接“算出”对象位置:散列查找
2.散列查找法的两项基本工作:
1.计算位置:构造散列函数确定关键字所在位置。
2.解决冲突:应用某种策略解决多个关键字位置相同的问题。
3.散列表或哈希表(Hash table):采用散列技术将记录存储在一块连续的存储空间,这块连续存储空间称为散列表或哈希表。
4.散列函数:将关键字和该关键字相关的记录的存储位置之间建立一个确定的对应关系f,对应关系f为散列函数。
5.“散列(Hashing)”的基本思想 是:
1.以关键字key为自变量,通过一个确定的函数h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。
2.可能不同的关键字会映射到同一个散列地址上,即h(keyi) = h(keyj)(当keyi!=keyj),称为(Collision)。
6.装填因子(Loading Factor):设散列表空间大小为m,填入表中元素个数是n,则称a=n/m为散列表的填装因子。
(二).散列函数的构造方法
一个好的散列函数一般应该考虑下列因素:
1.计算简单,以便提高转换速度。
2.关键词对应的地址空间分布均匀,以尽量减少冲突。
1.直接定址法:
2.除留余数法:
3.数字分析法(取比较随机的位数):
4.折叠法:
5.平方取中法:
(三).处理散列冲突的方法
常用处理冲突的思路:
1.换个位置:开发地址法
2.将同一位置冲突对象组织在一起:链地址法
开放地址法:
一旦产生冲突(该地址已有其他元素),就按照某种规则去寻找另一个空地址。
1. 线性探测法:以增量序列1,2,…..(TableSize-1)循环试探下一个存储地址。需要注意的是线性探测法容易出现“聚集”现象。
2.平方探测法–(二次探测法):
【注意】是否存储空间还有空间平方探测法就能找到剩余空间呢?答案是否定的,但是有定理显示:如果散列表的长度TableSize是4*k+3(k是正整数)形式的素数时,平方探测法就可以探测到整个散列表空间。
3.双散列探测法:
4.再散列:
链地址法:
将相应位置上冲突的所有关键字存储在同一个单链表中
(四).散列表的性能分析:
平均查找长度(ASL)用来度量散列表查找效率:成功、不成功.关键词的比较次数取决于产生冲突的多少,影响产生冲突多少有以下三个因素:
1.散列函数是否均匀
2.处理冲突的方法
3.散列表的装填因子a
总结: