Skip to content

散列查找


一、散列表🧀

  • 普通查找 \(O(n)\) 复杂度
  • 散列查找 \(O(1)\) 复杂度
graph LR
    K0[0] --> H
    K1[1] --> H
    K2[2] --> H
    K3[3] --> H
    K4[4] --> H
    K5[5] --> H

    H:::hash --> I0[0]
    H --> I1[1]
    H --> I2[2]
    H --> I3[3]
    H --> I4[4]
    H --> I5[5]

    class H hash

    subgraph "关键字(key)"
        direction TB
        K0
        K1
        K2
        K3
        K4
        K5
    end

    subgraph "下标(地址)"
        direction TB
        I0
        I1
        I2
        I3
        I4
        I5
    end

二、散列函数🧀

(1)恒等函数🧀

  • 会造成空间浪费

(2)直接定址法🧀

  • 关键字连续更好

  • \[ H(key)=a\times key+b \]

(3)除留余数法🧀

  • \(p\) 取小于表长的最大质数

  • \[ H(key)=key \%p \]
  • 同义词会产生冲突

  • 装填因子 \(\alpha\):表中元素数量/表长

    • 装填因子越大,越容易冲突
    • 装填因子越小,越不容易冲突

三、冲突处理 - 开放定址法🧀

(1)线性探测法🧀

  • 冲突后一次探测下一个空闲位置
  • 插值和插入时一样:先用除留余数法找到那个位置,如果不等依次向后比较,直到第一个空位置的就说明不存在

ASL

这里用 \(key\mod11\) 举例

H(key) 0 1 2 3 4 5 6 7 8 9 10 11 12
key 11 30 47 7 29 9 84 54 20
冲突次数 0 6 0 0 1 0 3 1 3
  • ASLs(成功查找):查找的元素在表中存在时的平均比较次数。

  • ASLu(不成功查找):查找的元素不在表中时,探测到表满或确认不存在所需的平均比较次数。

  • 成功查找时,每个元素查找时所需比较次数为:冲突次数 + 1

  • 对所有元素的查找次数求平均:

\(\text{ASLs} = \frac{1+7+1+1+2+1+4+2+4}{9} = \frac{23}{9} ≈ \boxed{2.56}\)

  • 不成功查找表示关键字不在表中。

  • 要统计对所有空位置的探测长度平均。

  • 对于表长取平均

\(\text{ASLu} = \frac{3+2+1+2+1+1+1+9+8+7+6+5+4}{13} = \frac{50}{13} ≈ \boxed{3.85}\)