Update hash_map and hash_collision.

This commit is contained in:
krahets
2023-03-15 03:06:52 +08:00
parent ec0856ccfa
commit 9bb8e94a2c
7 changed files with 16 additions and 12 deletions

View File

@@ -390,14 +390,16 @@
## 哈希函数
哈希表中存储元素的数据结构被称为「桶 Bucket」底层实现可能是数组链表、二叉树(红黑树),或是它们的组合
哈希表底层实现是数组,并且可能包含链表、二叉树(红黑树)等数据结构,以提升查询性能(下节会讨论)
最简单地,**我们可以仅用一个「数组」来实现哈希表**。首先,将所有 value 放入数组中,那么每个 value 在数组中都有唯一的「索引」。显然,访问 value 需要给定索引,而为了 **建立 key 和索引之间的映射关系**,我们需要使用「哈希函数 Hash Function」
首先考虑最简单的情况,**即仅用一个「数组」来实现哈希表**。根据习惯,我们将数组中的每个空位称为「桶 Bucket」用于存储键值对
设数组为 `bucket` ,哈希函数为 `f(x)` ,输入键为 `key` 。那么获取 value 的步骤为:
我们将键值对 key, value 包装成一个类 `Entry` ,并将所有 `Entry` 都放入数组中,那么每个 `Entry` 在数组中都有唯一的索引。显然,访问 `Entry` 需要给定索引,而为了 **建立 key 和索引之间的映射关系**,我们需要使用「哈希函数 Hash Function」。
具体地,设数组为 `buckets` ,哈希函数为 `f(x)` ,输入键为 `key` 。那么获取 value 的步骤为:
1. 通过哈希函数计算出索引,即 `index = f(key)`
2. 通过索引在数组中获取,即 `value = bucket[index]`
2. 通过索引在数组中获取键值对,即 `Entry = buckets[index]`
以上述学生数据 `key 学号 -> value 姓名` 为例,我们可以将「哈希函数」设计为
@@ -405,6 +407,8 @@ $$
f(x) = x \% 100
$$
如下图所示,输入一个学号 key ,经过哈希函数计算就能访问到对应的姓名 value 。
![简单哈希函数示例](hash_map.assets/hash_function.png)
=== "Java"