哈希表

  • 前置知识
    最好先了解数组和链表的特性: https://www.cnblogs.com/CJTARRR/p/19060980
  • 基本功能
    通过key计算定位到key,value存储位置
  • 基本实现
    取一个数组,每个空位用于存储key和value,空位也叫桶。
    key经过哈希计算再与数组长度取模,得到的数值就是存储key、value的空位索引。
    通过这个索引结合数组的特性,可以计算得到空位(即桶)的内存地址,从而快速找到key,value值。
  • 哈希冲突
    不同的key经过哈希计算再与数组长度取模,可能得到相同的值,即指向了同一个桶,也就是发生了哈希冲突。
  • 处理哈希冲突
    - 方式1: 桶内链表
        冲突的元素可以存到同一个桶,它们在桶内通过链表链接起来。通过key定位到桶之后,再做一次链表遍历从而找到key,value值。
        链表需通过遍历比对的方式查值,效率比较低。
    
    - 方式2: 哈希扩容
        发生冲突时,扩大桶数组的长度。之前冲突的key用新的长度做取模运算可能就不再冲突。
        这种方式需要重新创建数组,且几乎所有key经过哈希加取模计算得到的值发生变化。所以要将所有key,value重新计算定位并存储。
        key,value重新定位并存储叫迁移,影响范围大,比较消耗性能。
    
    - 说明:
        不同场景下,哈希表会有不同的哈希冲突的处理方案。通常是方式1和方式2的结合。
        发生冲突时先以方式一处理,链表达到一定长度后,不得已再做哈希扩容。
        哈希扩容的迁移过程需要消耗较多性能,所以通常是留着旧桶数组,在哈希表的增删过程中逐步完成迁移。

     

posted @ 2025-08-27 15:31  CJTARRR  阅读(6)  评论(0)    收藏  举报