散列查找
散列查找就像用字典一样,以最快的方式去定位到需要寻找的位置(通过关键字定位),定位的方式就是散列函数,如果定位有冲突,那么就用解决冲突的方法去解决!
这里不需要过于关心这个散列函数
如何快速搜索到需要的关键词?如果关键词不方便比较怎么办?
散列查找法的两项基本工作:
计算位置:构造散列函数确定关键词存储位置;
解决冲突:应用某种策略解决多个关键词位置相同的问题
查找的本质: 已知对象找位置。
直接“算出”对象位置:散列
时间复杂度几乎是常量:O(1),即查找时间与问题规模无关!
散列的一些操作
散列函数
“好”的散列函数一般应考虑下列两个因素:
- 计算简单,以便提高转换速度;
- 关键词对应的地址空间分布均匀,以尽量减少冲突。
函数有如下几个方法
数字关键字
1.直接定址法
取关键词的某个线性函数值为散列地址,即
h(key) = a * key + b
2.除留余数法 (最常用)
散列函数为:h(key) = key mod p
3.数字分析法
取11位手机号码key的后4位作为地址:散列函数为:h(key) = atoi(key+7)
atoi函数是把字符串转换成整数
字符串关键字
这里不懂的话,可以去看看视频的例子
解决冲突
开放定址法**
1.线性
每次冲突以线性的增长去寻找空间
2.平方探测
每次冲突以正负i增量去寻找空间
平方探测的代码示例
理论证明,当tablesize的大小是以4K+3的形式的素数时(k是正整数),这个方法可以探测全表
3.双散列探测
顾名思义,需要在一个hash函数中再计算另一个hash函数
4.再散列探测
在开放地址法中,不能进行删除操作,否则会找不到关键词。因此,需要增加删除标记。
分离链接表
每一行的单链表链接的都是同一个位置有冲突的值。