18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

254 阅读1分钟

散列思想

  • 基本概念:基于数组的扩展,支持根据下标的随机访问

  • 核心思想:将原始值 通过散列函数 转换成散列值(数组下标)

  • 目标:将无规律的数据实现O(1)的特性

  • 装载因子:表示当前散列表的空闲度

    • 散列表的装载因子=填入表中的元素个数/散列表的长度

散列函数

  • 将原始数据hash(key)得到散列值

  • 散列函数的特点

    • 非负整数

    • 如果 key1 = key2,那 hash(key1) == hash(key2)\

    • 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)\

      • 无法避免散列冲突
  • 散列函数:MD5,SHA,CRC

散列冲突

开放寻址法

  • 线性探测法

    • 插入:当发生hash冲突,重新探测一个空闲位置(重新探测,直到找到具体位置)
    • 查询:找到元素,或者探测到空地址(元素不存在)
    • 删除:不能直接删除,置为delete删除位,避免查询失败
  • 二次探测法

    • 探测的下标序列就是 hash(key)+0,hash(key)+12,hash(key)+22\
  • 双重散列

    • 如果计算得到的存储位置已经被占用,再用第二个散列函数,依次类推,直到找到空闲的存储位置\

链表法

  • 更常用的hash冲突解决办法
  • 利用链表解决hash冲突
  • 查找、删除和插入时间复杂度O(1)

\

总结

  • 散列表是一种特殊的数组

  • 核心问题

    • 散列函数的选择
    • 散列冲突的解决