数据结构(十七)散列查找

散列查找

1. 基本思想

  1. 以关键字 key 为自变量,通过一个确定的函数 h(散列函数),计算出对应的函数值 h(key),作为数据对象的存储地址
  2. 可能不同的关键字会映射到同一个散列地址上,即 h(key i _i i) = h(key j _j j)(当 key i _i i ≠ key j _j j),称为“冲突”——需要某种冲突解决策略

2. 基本工作

  • 计算位置:构造散列函数确定关键词存储位置
  • 解决冲突:应用某种策略解决多个关键词位置相同的问题

时间复杂度几乎为是常数:O(1)

3. 散列函数的构造

1. 考虑因素
  1. 计算简单,以便提高转换速度
  2. 关键词对应的地址空间分布均匀,以尽量减少冲突
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=0n1 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<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值