0%

4.哈希表

哈希表的核心

  • 计算位置:构造散列函数确定关键词存储位置;

  • 解决冲突:应用某种策略解决多个关键词位置相同的问题

计算位置

  • 数字关键词

    • 直接定址法:取关键词的线性函数值为散列地址,即 key + b a = h(key) (a、b为常数)

    • 除留余数法:散列函数为:h(key) = key mod p;p 取素数

    • 数字分析法:分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址

    • 折叠法:把关键词分割成位数相同的几个部分,然后叠加

    • 平方取中法

  • 字符关键词

    • 核心思想:将字符串编码为数字,然后在调用数字关键字的构造方法

    • 编码方法:ASCII码*32的字节次方,累加

解决冲突

开放定址法(Open Addressing)

  • 线性探测:往后找空位填

    • 平方探测 :两侧平方增量找空位填(当表大小为4k+3平方探测可探查整个空间)

    • 双散列:
      di 为i*h2 (key),h2 (key)是另一个散列函数,h2 (key) ≠ 0
      为了所有的散列存储单元都能够被探测。选择以下形式有 h2 (key) = p - (key mod p) p < TabeSize,p、TabeSize都是素数。

    • 再散列

      • 当散列表元素太多(即装填因子 α太大)时,查找效率会下降;
      • 实用最大装填因子一般取 0.5 <= α<= 0.85

      • 当装填因子过大时,加倍扩大散列表,这个过程叫做“再散列”

    • 链地址法:将相应位置上冲突的所有关键词存储在同一个单链表中

性能分析

衡量标准

  • 平均查找长度(ASL)用来度量散列表查找效率:成功、不成功

  • 关键词的比较次数,取决于产生冲突的多少,影响产生冲突有以下三个因素

    • 散列函数是否均匀;

    • 处理冲突的方法;

    • 散列表的装填因子α

结论

  • 哈希表的优缺点

    • 选择合适的 h(key),散列法的查找效率期望是常数O(1),它几乎与关键字的空间的大小 *无关!也适合于关键字直接比较计算量大的问题

    • 它是以较小的α为前提。因此,散列方法是一个以空间换时间

    • 散列方法的存储对关键字是随机的,不便于顺序查找关键字,也不适合于范围查找,或最大值最小值查找

  • 开放地址法

    • 散列表是一个数组,存储效率高,随机查找

    • 散列表有“聚集”现象

  • 分离链法:

    • 散列表是顺序存储和链式存储的结合,链表部分的存储效率和查找效率都比较低。

    • 关键字删除不需要“懒惰删除”法,从而没有存储“垃圾”。

    • 太小的α可能导致空间浪费,大的α又将付出更多的时间代价。 不均匀的链表长度导致时间效率的严重下降。