学习过程主要依照中国MOOC课程,感谢MOOC,感谢浙大授课大佬。
散列表(哈希表)
查找对象时,静态查找可以用二分查找,动态查找可以建树,但是比对的过程是数的话可以,如果是字符串的话就比较费时,那么能否把字符串映射为数字呢?这就是散列表。
查找的本质:已知对象找位置。
- 有序安排对象:全序、半序;
- 直接”算出”对象位置:散列;
散列查找的两项基本工作:
- 计算位置:构造散列函数确定关键词存储位置;
- 解决冲突:应用某种策略解决多个关键字位置相同的问题;
“散列(Hashing)”的基本思想:
1)以关键字key为自变量,通过一个确定的函数h计算出对应的函数值h(key),作为数据对象的存储地址。
2)可能不同的关键字会映射到同一个散列地址上,称为”冲突”,需要冲突解决策略。
散列函数构造方法
考虑因素:
- 计算简单,以便提高转换效率
- 关键字对应的地址空间分布均匀,以尽量减少冲突
数字关键字
- 直接定制法
- 除留余数法
- 数字分析法
- 折叠法
- 平方取中法
字符关键字
- 简单方法-ASCII码加和法
- 简单改进法-前三个字符移位法
- 好的方法-全部字符移位法
冲突处理方法
常见思路:
- 换个位置:开放地址法
- 同一位置的冲突对象组织在一起:链地址法
开放地址法
- 线性探测法
- 平方探测法
1 | #define MAXTABLESIZE 100000 /* 允许开辟的最大散列表长度 */ |
1 | Position Find( HashTable H, ElementType Key ) |
- 双散列探测法
- 再散列
分离链接法
将相同位置上冲突的所有关键词存储在同一个单链表中。
散列表性能分析
指标:平均查找长度(ASL)用来衡量散列表的查找效率:成功、不成功
关键词的比较次数,取决于产生冲突的多少,影响产生冲突多少有以下三个因素:
- 散列函数是否均匀
- 处理冲突的方法
- 散列表的装填因子α,应在0.5-0.85之间
以上。
注:转载文章请注明出处,谢谢~