文章目录
散列查找
1. 基本思想
- 以关键字 key 为自变量,通过一个确定的函数 h(散列函数),计算出对应的函数值 h(key),作为数据对象的存储地址
- 可能不同的关键字会映射到同一个散列地址上,即 h(key i _i i) = h(key j _j j)(当 key i _i i ≠ key j _j j),称为“冲突”——需要某种冲突解决策略
2. 基本工作
- 计算位置:构造散列函数确定关键词存储位置
- 解决冲突:应用某种策略解决多个关键词位置相同的问题
时间复杂度几乎为是常数:O(1)
3. 散列函数的构造
1. 考虑因素
- 计算简单,以便提高转换速度
- 关键词对应的地址空间分布均匀,以尽量减少冲突
2. 数字关键词
1. 直接定址法
取关键词的某个线性函数值为散列地址,即:h(key) = a x key + b (a、b为常数)
2. 除留余数法
散列函数为:h(key) = key mod p (p 一般取素数)
3. 数字分析法
分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址
4. 折叠法
把关键词分割成位数相同的几个部分,然后叠加
5. 平方取中法
将关键词平方,取中间几位
3. 字符串关键字
1. ASCII码加和法
h(key) = (Σkey[i]) mod TableSize
2. 前3个字符移位法
h(key) = (key[0]×27 2 ^2 2 + key[1]×27 + key[2])mod TableSize
3. 移位法
h(key) = ( ∑ i = 0 n − 1 \sum_{i=0}^{n-1} ∑i=0n−1 key[n-i-1]×32 i ^i i) mod TableSize
例子(移位法)
h(“abcde”) = 'a’x32 4 ^4 4 + 'b’x32 3 ^3 3 +'c’x32 2 ^2 2 + 'd’x32 + ‘e’
= ((('a’x32+‘b’)x32+‘c’)x32+‘d’)x32+‘e’
Index Hash( const char *Key,int TableSize){
unsigned int h = 0; // 散列值函数,初始化为 0
while ( *Key != '\0' ) // 位移映射
h = ( h << 5) + *Key++;
return h % TableSize;
}
4. 冲突处理方法
1. 常用策略
- 换个位置:开放地址法
- 同一位置的冲突对象组织在一起:链地址法
2. 开放定址法
- 一旦产生了冲突(该地址已有其它元素),就按某种规则去寻找另一空地址
- 若发生了第 i 次冲突,试探的下一个地址将增加 d i _i i,基本公式是: h i _i i(key) = (h(key)+d i _i i) mod TableSize (1 ≤ i ≤ TableSize)
- d<

最低0.47元/天 解锁文章
3259

被折叠的 条评论
为什么被折叠?



