文章目录
前言
哈希表的使用没什么好说的,就是Python里面dict的使用。
但本博客我们不关心dict的使用,我们主要聚焦与哈希表在计算机底层是怎么实现的。
哈希冲突、哈希算法、链式地址、开发寻址这些解决哈希冲突的手段。
另外,上面还简单模拟了字典怎么用数组实现的、已经各种改进实现,个人觉得是练习代码的好案例。当练习材料来用即可了。
直接看 hello算法哈希表,这个已经讲的很好了,再写篇博客没这个写的好。
下面我们就来介绍一下最简单的哈希表底层原理吧!
一、哈希表
哈希表(hash table),又称散列表,它通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表中输入一个键 key ,则可以在 O ( 1 ) O(1) O(1)时间内获取对应的值 value 。
如图所示,给定n个学生,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个学号,返回对应的姓名”的查询功能,则可以采用图中所示的哈希表来实现。
没错,就是一个字典,存储的是一种映射关系。
哈希表的增删查改的时间复杂度都是 O ( 1 ) O(1) O(1),非常高效。我们本节的目的就是弄清楚这种数据结构底层是怎么实现的。
二、哈希表的简单实现
哈希表的底层最基础的就是用数组来实现,基本上所有数据结构都可以用数组和链表这两种最基本数据结构实现。
我们先考虑最简单的情况,仅用一个数组来实现哈希表。在哈希表中,我们将数组中的每个空位称为桶(bucket),每个桶可存储一个键值对。因此,查询操作就是找到 key 对应的桶,并在桶中获取 value 。
那么,如何基于 key 定位对应的桶呢?这是通过哈希函数(hash function)实现的。哈希函数的作用是将一个较大的输入空间映射到一个较小的输出空间。在哈希表中,输入空间是所有 key ,输出空间是所有桶(数组索引)。换句话说,输入一个 key ,我们可以通过哈希函数得到该 key 对应的键值对在数组中的存储位置。
输入一个 key ,哈希函数的计算过程分为以下两步。
- 通过某种哈希算法 hash() 计算得到哈希值。
- 将哈希值对桶数量(数组长度)capacity 取模,从而获取该 key 对应的数组索引 index 。
i n d e x = h a s h ( k e y ) % c a p a c i t y index = hash(ke