哈希表
- 前置知识
最好先了解数组和链表的特性: 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的结合。 发生冲突时先以方式一处理,链表达到一定长度后,不得已再做哈希扩容。 哈希扩容的迁移过程需要消耗较多性能,所以通常是留着旧桶数组,在哈希表的增删过程中逐步完成迁移。
浙公网安备 33010602011771号