From 29e6617ec1a5b3eb5be4c253f265c668bccd7524 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Fri, 16 Jun 2023 21:20:57 +0800 Subject: [PATCH] Add the section of hash algorithm. Refactor the section of hash map. (#555) --- .../chapter_graph/graph_adjacency_matrix.cpp | 2 +- codes/python/chapter_hashing/built_in_hash.py | 36 ++ codes/python/chapter_hashing/simple_hash.py | 56 +++ .../hash_collision_best_worst_condition.png | Bin 0 -> 83609 bytes docs/chapter_hashing/hash_algorithm.md | 325 ++++++++++++++++++ docs/chapter_hashing/hash_collision.md | 18 +- .../hash_map.assets/hash_table_reshash.png | Bin 0 -> 84285 bytes docs/chapter_hashing/hash_map.md | 53 +-- mkdocs.yml | 5 +- 9 files changed, 459 insertions(+), 36 deletions(-) create mode 100644 codes/python/chapter_hashing/built_in_hash.py create mode 100644 codes/python/chapter_hashing/simple_hash.py create mode 100644 docs/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png create mode 100644 docs/chapter_hashing/hash_algorithm.md create mode 100644 docs/chapter_hashing/hash_map.assets/hash_table_reshash.png diff --git a/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp b/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp index 1b36bd507..a935ca889 100644 --- a/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp +++ b/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp @@ -36,7 +36,7 @@ class GraphAdjMat { // 向顶点列表中添加新顶点的值 vertices.push_back(val); // 在邻接矩阵中添加一行 - adjMat.emplace_back(n, 0); + adjMat.emplace_back(vector(n, 0)); // 在邻接矩阵中添加一列 for (vector &row : adjMat) { row.push_back(0); diff --git a/codes/python/chapter_hashing/built_in_hash.py b/codes/python/chapter_hashing/built_in_hash.py new file mode 100644 index 000000000..d17d5e3b6 --- /dev/null +++ b/codes/python/chapter_hashing/built_in_hash.py @@ -0,0 +1,36 @@ +""" +File: built_in_hash.py +Created Time: 2023-06-15 +Author: Krahets (krahets@163.com) +""" + +import sys, os.path as osp + +sys.path.append(osp.dirname(osp.dirname(osp.abspath(__file__)))) +from modules import * + +"""Driver Code""" +if __name__ == "__main__": + num = 3 + hash_num = hash(num) + print(f"整数 {num} 的哈希值为 {hash_num}") + + bol = True + hash_bol = hash(bol) + print(f"布尔量 {bol} 的哈希值为 {hash_bol}") + + dec = 3.14159 + hash_dec = hash(dec) + print(f"小数 {dec} 的哈希值为 {hash_dec}") + + str = "Hello 算法" + hash_str = hash(str) + print(f"字符串 {str} 的哈希值为 {hash_str}") + + tup = (12836, "小哈") + hash_tup = hash(tup) + print(f"元组 {tup} 的哈希值为 {hash(hash_tup)}") + + obj = ListNode(0) + hash_obj = hash(obj) + print(f"节点对象 {obj} 的哈希值为 {hash_obj}") diff --git a/codes/python/chapter_hashing/simple_hash.py b/codes/python/chapter_hashing/simple_hash.py new file mode 100644 index 000000000..d4e420532 --- /dev/null +++ b/codes/python/chapter_hashing/simple_hash.py @@ -0,0 +1,56 @@ +""" +File: simple_hash.py +Created Time: 2023-06-15 +Author: Krahets (krahets@163.com) +""" + + +def add_hash(key: str) -> int: + """加法哈希""" + hash = 0 + modulus = 1000000007 + for c in key: + hash += ord(c) + return hash % modulus + + +def mul_hash(key: str) -> int: + """乘法哈希""" + hash = 0 + modulus = 1000000007 + for c in key: + hash = 31 * hash + ord(c) + return hash % modulus + + +def xor_hash(key: str) -> int: + """异或哈希""" + hash = 0 + modulus = 1000000007 + for c in key: + hash ^= ord(c) + return hash % modulus + + +def rot_hash(key: str) -> int: + """旋转哈希""" + hash = 0 + modulus = 1000000007 + for c in key: + hash = (hash << 4) ^ (hash >> 28) ^ ord(c) + return hash % modulus + + +"""Driver Code""" +if __name__ == "__main__": + hash = add_hash("Hello 算法") + print(f"加法哈希值为 {hash}") + + hash = mul_hash("Hello 算法") + print(f"乘法哈希值为 {hash}") + + hash = xor_hash("Hello 算法") + print(f"异或哈希值为 {hash}") + + hash = rot_hash("Hello 算法") + print(f"旋转哈希值为 {hash}") diff --git a/docs/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png b/docs/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png new file mode 100644 index 0000000000000000000000000000000000000000..5d65b9270f12074e324fc8ccb6f903c1d2512c1f GIT binary patch literal 83609 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 F{|~1^K?48) literal 0 HcmV?d00001 diff --git a/docs/chapter_hashing/hash_algorithm.md b/docs/chapter_hashing/hash_algorithm.md new file mode 100644 index 000000000..df8c1676d --- /dev/null +++ b/docs/chapter_hashing/hash_algorithm.md @@ -0,0 +1,325 @@ +# 哈希算法 + +在上两节中,我们了解了哈希表的工作原理,以及哈希冲突的处理方法。然而,无论是开放寻址还是链地址法,**它们只能保证哈希表可以在发生冲突时正常工作,但无法减少哈希冲突的发生**。 + +如果哈希冲突过于频繁,哈希表的性能则会急剧劣化。例如对于链地址哈希表,理想情况下键值对平均分布在各个桶中,达到最好的查询效率;最差情况下全部键值都被存储到同一个桶中,时间复杂度退化至 $O(n)$ 。 + +![哈希冲突的最佳与最差情况](hash_algorithm.assets/hash_collision_best_worst_condition.png) + +**键值对的分布情况是由哈希函数决定的**。回忆哈希函数的计算步骤,先计算哈希值,再对数组长度取模: + +```shell +index = hash(key) % capacity +``` + +观察以上公式,当哈希表容量 `capacity` 固定时,**哈希算法 `hash()` 决定了输出值**,进而决定了键值对在哈希表中的分布。因此,为了减小哈希冲突的发生概率,我们需要将注意力集中在哈希算法 `hash()` 的设计上。 + +## 哈希算法的目标 + +为了在编程语言中实现“既快又稳”的哈希表数据结构,哈希算法应包含以下特点: + +- **确定性**:对于相同的输入,哈希算法应始终产生相同的输出。这样才能确保哈希表是可靠的。 +- **效率高**:计算哈希值的过程应该足够快。计算开销越小,哈希表的实用性越高。 +- **均匀分布**:哈希算法应使得键值对平均分布在哈希表中。分布越平均,哈希冲突的概率就越低。 + +实际上,哈希算法除了可以用于实现哈希表,还广泛应用于其他领域中,包括: + +- **密码存储**:为了保护用户密码的安全,系统通常不会直接存储用户的明文密码,而是存储密码的哈希值。当用户输入密码时,系统会对输入的密码计算哈希值,然后与存储的哈希值进行比较。如果两者匹配,那么密码就被视为正确。 +- **数据完整性检查**:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整的。 + +对于密码学的相关应用,哈希算法需要满足更高的安全标准,以防止从哈希值推导出原始密码等逆向工程,包括: + +- **抗碰撞性**:应当极其困难找到两个不同的输入,使得它们的哈希值相同。 +- **雪崩效应**:输入的微小变化应当导致输出的显著且不可预测的变化。 + +注意,**“均匀分布”与“抗碰撞性”是两个独立的概念**,满足均匀分布不一定满足抗碰撞性。例如,在随机输入 `key` 下,哈希函数 `key % 100` 可以产生均匀分布的输出。然而,该哈希算法过于简单,所有后两位相等的 `key` 的输出都相同,因此我们可以很容易地从哈希值反推出可用的 `key` ,从而破解密码。 + +## 哈希算法的设计 + +哈希算法的设计是一个复杂且需要考虑许多因素的问题。然而,对于一些简单场景,我们也能设计一些简单的哈希算法,以字符串哈希为例: + +- **加法哈希**:对输入的每个字符的 ASCII 码进行相加,将得到的总和作为哈希值。 +- **乘法哈希**:利用了乘法的不相关性,每轮乘以一个常数,将各个字符的 ASCII 码累积到哈希值中。 +- **异或哈希**:将输入数据的每个元素通过异或操作累积到一个哈希值中。 +- **旋转哈希**:将每个字符的 ASCII 码累积到一个哈希值中,每次累积之前都会对哈希值进行旋转操作。 + +=== "Java" + + ```java title="simple_hash.java" + [class]{simple_hash}-[func]{addHash} + + [class]{simple_hash}-[func]{mulHash} + + [class]{simple_hash}-[func]{xorHash} + + [class]{simple_hash}-[func]{rotHash} + ``` + +=== "C++" + + ```cpp title="simple_hash.cpp" + [class]{}-[func]{addHash} + + [class]{}-[func]{mulHash} + + [class]{}-[func]{xorHash} + + [class]{}-[func]{rotHash} + ``` + +=== "Python" + + ```python title="simple_hash.py" + [class]{}-[func]{add_hash} + + [class]{}-[func]{mul_hash} + + [class]{}-[func]{xor_hash} + + [class]{}-[func]{rot_hash} + ``` + +=== "Go" + + ```go title="simple_hash.go" + [class]{}-[func]{addHash} + + [class]{}-[func]{mulHash} + + [class]{}-[func]{xorHash} + + [class]{}-[func]{rotHash} + ``` + +=== "JavaScript" + + ```javascript title="simple_hash.js" + [class]{}-[func]{addHash} + + [class]{}-[func]{mulHash} + + [class]{}-[func]{xorHash} + + [class]{}-[func]{rotHash} + ``` + +=== "TypeScript" + + ```typescript title="simple_hash.ts" + [class]{}-[func]{addHash} + + [class]{}-[func]{mulHash} + + [class]{}-[func]{xorHash} + + [class]{}-[func]{rotHash} + ``` + +=== "C" + + ```c title="simple_hash.c" + [class]{}-[func]{addHash} + + [class]{}-[func]{mulHash} + + [class]{}-[func]{xorHash} + + [class]{}-[func]{rotHash} + ``` + +=== "C#" + + ```csharp title="simple_hash.cs" + [class]{simple_hash}-[func]{addHash} + + [class]{simple_hash}-[func]{mulHash} + + [class]{simple_hash}-[func]{xorHash} + + [class]{simple_hash}-[func]{rotHash} + ``` + +=== "Swift" + + ```swift title="simple_hash.swift" + [class]{}-[func]{addHash} + + [class]{}-[func]{mulHash} + + [class]{}-[func]{xorHash} + + [class]{}-[func]{rotHash} + ``` + +=== "Zig" + + ```zig title="simple_hash.zig" + [class]{}-[func]{addHash} + + [class]{}-[func]{mulHash} + + [class]{}-[func]{xorHash} + + [class]{}-[func]{rotHash} + ``` + +=== "Dart" + + ```dart title="simple_hash.dart" + [class]{}-[func]{add_hash} + + [class]{}-[func]{mul_hash} + + [class]{}-[func]{xor_hash} + + [class]{}-[func]{rot_hash} + ``` + +观察发现,每种哈希算法的最后一步都是对大质数 $1000000007$ 取模,以确保哈希值在合适的范围内。值得思考的是,为什么要强调对质数取模,对合数取模的弊端是什么?这是一个有趣的问题。 + +先抛出结论:**当我们使用大质数作为模数时,可以最大化地保证哈希值的均匀分布**。因为质数不会与其他数字存在公约数,可以减少因取模操作而产生的周期性模式,从而避免哈希冲突。 + +举个例子,假设我们选择合数 $9$ 作为模数,它可以被 $3$ 整除。那么所有可以被 $3$ 整除的 `key` 都会被映射到 $0$ , $3$ , $6$ 这三个哈希值。 + +$$ +\begin{aligned} +\text{modulus} & = 9 \newline +\text{key} & = \{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \cdots \} \newline +\text{hash} & = \{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\cdots \} +\end{aligned} +$$ + +如果输入 `key` 恰好满足这种等差数列的数据分布,那么哈希值就会出现聚堆,从而加重哈希冲突。现在,假设将 `modulus` 替换为质数 $13$ ,由于 `key` 和 `modulus` 之间不存在公约数,输出的哈希值的均匀性会明显提升。 + +$$ +\begin{aligned} +\text{modulus} & = 13 \newline +\text{key} & = \{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \cdots \} \newline +\text{hash} & = \{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \cdots \} +\end{aligned} +$$ + +值得强调的是,如果能够保证 `key` 是随机均匀分布的,那么选择质数或者合数作为模数都是可以的,它们都能输出均匀分布的哈希值。而当 `key` 的分布存在某种周期性时,对合数取模更容易出现聚集现象。 + +总而言之,我们通常选取质数作为模数,并且这个质数最好大一些,以提升哈希算法的稳健性。 + +## 常见哈希算法 + +不难发现,以上介绍的简单哈希算法都比较“脆弱”,远远没有达到哈希算法的设计目标。例如,由于加法和异或满足交换律,因此加法哈希和异或哈希无法区分内容相同但顺序不同的字符串,这可能会加剧哈希冲突,并引起一些安全问题。 + +在实际中,我们通常会用一些标准哈希算法,例如 MD5, SHA-1, SHA-2, SHA3 等。它们可以将任意长度的输入数据映射到恒定长度的哈希值。近一个世纪以来,哈希算法处在不断升级与优化的过程中。一部分研究人员努力提升哈希算法的性能,另一部分研究人员和黑客则致力于寻找哈希算法的安全性问题。 + +直至目前,MD5 和 SHA-1 已多次被成功攻击,因此它们被各类安全应用弃用。SHA-2 系列中的 SHA-256 是最安全的哈希算法之一,仍未出现成功的攻击案例,因此常被用在各类安全应用与协议中。SHA-3 相较 SHA-2 的实现开销更低、计算效率更高,但目前使用覆盖度不如 SHA-2 系列。 + +| | MD5 | SHA-1 | SHA-2 | SHA-3 | +| -------- | ------------------------------ | -------------------- | ---------------------------- | -------------------- | +| 推出时间 | 1992 | 1995 | 2002 | 2008 | +| 输出长度 | 128 bits | 160 bits | 256 / 512 bits | 224/256/384/512 bits | +| 哈希冲突 | 较多 | 较多 | 很少 | 很少 | +| 安全等级 | 低,已被成功攻击 | 低,已被成功攻击 | 高 | 高 | +| 应用 | 已被弃用,仍用于数据完整性检查 | 已被弃用 | 加密货币交易验证、数字签名等 | 可用于替代 SHA-2 | + +## 数据结构的哈希值 + +我们知道,哈希表的 `key` 可以是整数、小数或字符串等数据类型。编程语言通常会为这些数据类型提供内置的哈希算法 `hash()` ,用于计算哈希表中的桶索引。以 Python 为例: + +- 整数和布尔量的哈希值就是其本身。 +- 浮点数和字符串的哈希值计算较为复杂,有兴趣的同学请自行学习。 +- 元组的哈希值是对其中每一个元素进行哈希,然后将这些哈希值组合起来,得到单一的哈希值。 +- 对象的哈希值基于其内存地址生成。通过重写对象的哈希方法,可实现基于内容生成哈希值。 + +=== "Java" + + ```java title="built_in_hash.java" + + ``` + +=== "C++" + + ```cpp title="built_in_hash.cpp" + + ``` + +=== "Python" + + ```python title="built_in_hash.py" + num = 3 + hash_num = hash(num) + # 整数 3 的哈希值为 3 + + bol = True + hash_bol = hash(bol) + # 布尔量 True 的哈希值为 1 + + dec = 3.14159 + hash_dec = hash(dec) + # 小数 3.14159 的哈希值为 326484311674566659 + + str = "Hello 算法" + hash_str = hash(str) + # 字符串 Hello 算法 的哈希值为 4617003410720528961 + + tup = (12836, "小哈") + hash_tup = hash(tup) + # 元组 (12836, '小哈') 的哈希值为 1029005403108185979 + + obj = ListNode(0) + hash_obj = hash(obj) + # 节点对象 的哈希值为 274267521 + ``` + +=== "Go" + + ```go title="built_in_hash.go" + + ``` + +=== "JavaScript" + + ```javascript title="built_in_hash.js" + + ``` + +=== "TypeScript" + + ```typescript title="built_in_hash.ts" + + ``` + +=== "C" + + ```c title="built_in_hash.c" + + ``` + +=== "C#" + + ```csharp title="built_in_hash.cs" + + ``` + +=== "Swift" + + ```swift title="built_in_hash.swift" + + ``` + +=== "Zig" + + ```zig title="built_in_hash.zig" + + ``` + +=== "Dart" + + ```dart title="built_in_hash.dart" + + ``` + +在大多数编程语言中,**只有不可变对象才可作为哈希表的 `key`** 。假如我们将列表(动态数组)作为 `key` ,当列表的内容发生变化时,它的哈希值也随之改变,我们就无法在哈希表中查询到原先的 `value` 了。 + +虽然自定义对象(例如链表节点)的成员变量是可变的,但它是可哈希的,这是因为对象的哈希值默认基于内存地址生成。即使对象的内容发生了变化,但它的内存地址不变,哈希值仍然是不变的。 + +!!! tip "向哈希函数加盐" + + Python 解释器在每次启动时,都会为字符串哈希函数加入一个随机的盐(Salt)值。因此在不同的 Python 运行实例中,同一字符串的哈希值通常是不同的。此做法可以有效防止 HashDoS 攻击,提升哈希算法的安全性。 diff --git a/docs/chapter_hashing/hash_collision.md b/docs/chapter_hashing/hash_collision.md index bd2fdf559..9bee3c80d 100644 --- a/docs/chapter_hashing/hash_collision.md +++ b/docs/chapter_hashing/hash_collision.md @@ -1,17 +1,13 @@ # 哈希冲突 -在理想情况下,哈希函数为每个输入生成唯一的输出,实现 key 和数组索引的一一对应。但实际上,**哈希函数的输入空间通常远大于输出空间**,因此多个输入产生相同输出的情况是不可避免的。例如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一数组索引。 +上节提到,**通常情况下哈希函数的输入空间远大于输出空间**,因此哈希冲突是不可避免的。例如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一数组索引。 -这种多个输入对应同一输出索引的现象被称为「哈希冲突 Hash Collision」。哈希冲突会导致查询结果错误,严重影响哈希表的可用性。哈希冲突的处理方法主要有两种: +哈希冲突会导致查询结果错误,严重影响哈希表的可用性。为解决该问题,我们可以每当遇到哈希冲突时就进行哈希表扩容,直至冲突消失为止。此方法简单粗暴且有效,但效率太低,因为哈希表扩容需要进行大量的数据搬运与哈希值计算。为了提升效率,我们换一种思路: -- **扩大哈希表容量**:哈希表容量越大,键值对聚集的概率就越低。极端情况下,当输入空间和输出空间大小相等时,哈希表等同于数组,每个 key 都对应唯一的数组索引。 -- **优化哈希表结构**:常用方法包括链式地址和开放寻址。这类方法的思路是通过改良数据结构,使得哈希表可以在发生哈希冲突时仍然可以正常工作。当然,这些优化往往是以牺牲时间效率为代价的。 +1. 改良哈希表数据结构,**使得哈希表可以在存在哈希冲突时正常工作**。 +2. 仅在必要时,即当哈希冲突比较严重时,执行扩容操作。 -## 哈希表扩容 - -哈希函数的最后一步通常是对桶数量 $n$ 取余,作用是将哈希值映射到桶索引范围,从而将 key 放入对应的桶中。当哈希表容量越大(即 $n$ 越大)时,多个 key 被分配到同一个桶中的概率就越低,冲突就越少。因此,**当哈希表内的冲突总体较为严重时,编程语言通常通过扩容哈希表来缓解冲突**。类似于数组扩容,哈希表扩容需将所有键值对从原哈希表迁移至新哈希表,开销较大。 - -编程语言通常使用「负载因子 Load Factor」来衡量哈希冲突的严重程度,**定义为哈希表中元素数量除以桶数量**,常作为哈希表扩容的触发条件。在 Java 中,当负载因子超过 $0.75$ 时,系统会将 HashMap 容量扩展为原先的 $2$ 倍。 +哈希表的结构改良方法主要包括链式地址和开放寻址。 ## 链式地址 @@ -21,7 +17,7 @@ 链式地址下,哈希表的操作方法包括: -- **查询元素**:输入 key ,经过哈希函数得到数组索引,即可访问链表头节点,然后遍历链表并对比 key 以查找目标键值对。 +- **查询元素**:输入 `key` ,经过哈希函数得到数组索引,即可访问链表头节点,然后遍历链表并对比 `key` 以查找目标键值对。 - **添加元素**:先通过哈希函数访问链表头节点,然后将节点(即键值对)添加到链表中。 - **删除元素**:根据哈希函数的结果访问链表头部,接着遍历链表以查找目标节点,并将其删除。 @@ -136,7 +132,7 @@ 线性探测采用固定步长的线性查找来进行探测,对应的哈希表操作方法为: - **插入元素**:通过哈希函数计算数组索引,若发现桶内已有元素,则从冲突位置向后线性遍历(步长通常为 $1$ ),直至找到空位,将元素插入其中。 -- **查找元素**:若发现哈希冲突,则使用相同步长向后线性遍历,直到找到对应元素,返回 value 即可;或者若遇到空位,说明目标键值对不在哈希表中,返回 $\text{None}$ 。 +- **查找元素**:若发现哈希冲突,则使用相同步长向后线性遍历,直到找到对应元素,返回 `value` 即可;或者若遇到空位,说明目标键值对不在哈希表中,返回 $\text{None}$ 。 ![线性探测](hash_collision.assets/hash_table_linear_probing.png) diff --git a/docs/chapter_hashing/hash_map.assets/hash_table_reshash.png b/docs/chapter_hashing/hash_map.assets/hash_table_reshash.png new file mode 100644 index 0000000000000000000000000000000000000000..b40d4fed162086cbdb568ecbcfc1ac373e9ae33c GIT binary patch literal 84285 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

!6JhLnsA$IIR2iQe~Kn274rjzKpV=!nII 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 C8G6kC literal 0 HcmV?d00001 diff --git a/docs/chapter_hashing/hash_map.md b/docs/chapter_hashing/hash_map.md index 670cb6999..91a494300 100755 --- a/docs/chapter_hashing/hash_map.md +++ b/docs/chapter_hashing/hash_map.md @@ -2,14 +2,14 @@ 「哈希表 Hash Table」通过建立键 `key` 与值 `value` 之间的映射,实现高效的元素查询。具体而言,我们向哈希表输入一个 `key` ,则可以在 $O(1)$ 时间内获取对应的 `value` 。 -以一个包含 $n$ 个学生的数据库为例,每个学生都有“姓名 `name`”和“学号 `id`”两项数据。假如我们希望实现查询功能,例如“输入一个学号,返回对应的姓名”,则可以采用哈希表来实现。 +以一个包含 $n$ 个学生的数据库为例,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个学号,返回对应的姓名”的查询功能,则可以采用哈希表来实现。 ![哈希表的抽象表示](hash_map.assets/hash_table_lookup.png) -除哈希表外,我们还可以使用数组或链表实现元素查询,其中: +除哈希表外,我们还可以使用数组或链表实现查询功能,其中: -- 查询元素需要遍历所有元素,使用 $O(n)$ 时间; -- 添加元素仅需添加至尾部即可,使用 $O(1)$ 时间; +- 查询元素需要遍历数组(链表)中的所有元素,使用 $O(n)$ 时间; +- 添加元素仅需添加至数组(链表)的尾部即可,使用 $O(1)$ 时间; - 删除元素需要先查询再删除,使用 $O(n)$ 时间;

@@ -22,11 +22,11 @@
-观察发现,在哈希表中进行增删查改的时间复杂度都是 $O(1)$ ,非常高效。因此,哈希表常用于对查找效率要求较高的场景。 +观察发现,**在哈希表中进行增删查改的时间复杂度都是 $O(1)$** ,非常高效。因此,哈希表常用于对查找效率要求较高的场景。 ## 哈希表常用操作 -哈希表的基本操作包括 **初始化、查询操作、添加与删除键值对**。 +哈希表的常见操作包括:初始化、查询操作、添加键值对和删除键值对等。 === "Java" @@ -250,7 +250,7 @@ map.remove(10583); ``` -遍历哈希表有三种方式,即 **遍历键值对、遍历键、遍历值**。 +哈希表有三种常用遍历方式:遍历键值对、遍历键和遍历值。 === "Java" @@ -430,19 +430,19 @@ ## 哈希表简单实现 -我们先考虑最简单的情况,**仅用一个数组来实现哈希表**。在哈希表中,我们通常将数组中的每个空位称为「桶 Bucket」,每个桶可存储一个键值对。因此,查询操作就是定位输入的 `key` 对应的桶,从而得到 `value` 。 +我们先考虑最简单的情况,**仅用一个数组来实现哈希表**。在哈希表中,我们将数组中的每个空位称为「桶 Bucket」,每个桶可存储一个键值对。因此,查询操作就是找到 `key` 对应的桶,并在桶中获取 `value` 。 -那么,如何基于 `key` 来定位对应的桶呢?这是通过「哈希函数 Hash Function」实现的。哈希函数的作用是将一个较大的输入空间映射到一个较小的输出空间。在哈希表中,输入空间是所有 `key` ,输出空间是所有桶(数组索引)。换句话说,**输入一个 `key` ,我们可以通过哈希函数得到该 `key` 对应的键值对存储在数组中的位置**。 +那么,如何基于 `key` 来定位对应的桶呢?这是通过「哈希函数 Hash Function」实现的。哈希函数的作用是将一个较大的输入空间映射到一个较小的输出空间。在哈希表中,输入空间是所有 `key` ,输出空间是所有桶(数组索引)。换句话说,输入一个 `key` ,**我们可以通过哈希函数得到该 `key` 对应的键值对在数组中的存储位置**。 -哈希函数的计算过程分为两步:输入一个 `key` ,首先通过函数 `hash(key)` 计算得到哈希值,接下来将哈希值对桶数量(数组长度)取模,从而获取该 `key` 对应的数组索引 `index` 。计算公式如下 +输入一个 `key` ,哈希函数的计算过程分为两步:首先,通过哈希算法 `hash()` 计算得到哈希值;接下来,将哈希值对桶数量(数组长度)`capacity` 取模,从而获取该 `key` 对应的数组索引 `index` 。 -$$ -index = \text{hash}(key) \bmod {c} -$$ +```shell +index = hash(key) % capacity +``` -其中, $\bmod$ 表示取余运算, $c$ 为桶数量(数组长度)。随后,我们就可以利用 `index` 在哈希表中访问对应的桶,从而获取 `value` 。 +随后,我们就可以利用 `index` 在哈希表中访问对应的桶,从而获取 `value` 。 -设数组长度 $c = 100$ , $\text{hash}(key) = key$ ,易得哈希函数为 $key \bmod 100$ 。下图以 `key` 学号和 `value` 姓名为例,展示了哈希函数的工作原理。 +设数组长度 `capacity = 100` 、哈希算法 `hash(key) = key` ,易得哈希函数为 `key % 100` 。下图以 `key` 学号和 `value` 姓名为例,展示了哈希函数的工作原理。 ![哈希函数工作原理](hash_map.assets/hash_function.png) @@ -536,16 +536,25 @@ $$ [class]{ArrayHashMap}-[func]{} ``` -## 哈希冲突 +## 哈希冲突与扩容 -本质上看,哈希函数的是将一个庞大的输入空间(`key` 范围)映射到一个较小的输出空间(数组索引范围)。因此,**理论上一定存在”多个输入对应相同输出”的情况**。 +本质上看,哈希函数的作用是黄输入空间(`key` 范围)映射到输出空间(数组索引范围),而输入空间往往远大于输出空间。因此,**理论上一定存在“多个输入对应相同输出”的情况**。 -对于上述示例中的哈希函数,当输入的 `key` 后两位相同时,哈希函数的输出结果也相同。例如,查询学号为 $12836$ 和 $20336$ 的两个学生时,我们得到: +对于上述示例中的哈希函数,当输入的 `key` 后两位相同时,哈希函数的输出结果也相同。例如,查询学号为 12836 和 20336 的两个学生时,我们得到: -$$ -12836 \bmod 100 = 20336 \bmod 100 = 36 -$$ +```shell +12386 % 100 = 36 +20386 % 100 = 36 +``` -两个学号指向了同一个姓名,这显然是不对的。我们把这种情况称为“哈希冲突”。在下节中,我们将重点讨论如何解决冲突问题。 +如下图所示,两个学号指向了同一个姓名,这显然是不对的。我们将这种多个输入对应同一输出的情况称为「哈希冲突 Hash Collision」。 ![哈希冲突示例](hash_map.assets/hash_collision.png) + +容易想到,哈希表容量 $n$ 越大,多个 `key` 被分配到同一个桶中的概率就越低,冲突就越少。因此,**我们可以通过扩容哈希表来减少哈希冲突**。如下图所示,扩容前键值对 `(136, A)` 和 `(236, D)` 发生冲突,扩容后冲突消失。 + +![哈希表扩容](hash_map.assets/hash_table_reshash.png) + +类似于数组扩容,哈希表扩容需将所有键值对从原哈希表迁移至新哈希表,非常耗时。并且由于哈希表容量 `capacity` 改变,我们需要重新计算所有键值对的存储位置,进一步提高了扩容过程的计算开销。因此,编程语言通常会预留足够大的哈希表容量,防止频繁扩容。 + +在哈希表中,「负载因子 Load Factor」是一个重要概念,其定义为哈希表的元素数量除以桶数量,为了衡量哈希冲突的严重程度,**也常被作为哈希表扩容的触发条件**。例如在 Java 中,当负载因子超过 $0.75$ 时,系统会将哈希表容量扩展为原先的 $2$ 倍。 diff --git a/mkdocs.yml b/mkdocs.yml index c2932cf36..db705eaf7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -161,9 +161,10 @@ nav: - 5.4.   小结: chapter_stack_and_queue/summary.md - 6.     散列表: - chapter_hashing/index.md - - 6.1.   哈希表: chapter_hashing/hash_map.md + - 6.1.   哈希表(New): chapter_hashing/hash_map.md - 6.2.   哈希冲突(New): chapter_hashing/hash_collision.md - - 6.3.   小结: chapter_hashing/summary.md + - 6.3.   哈希算法(New): chapter_hashing/hash_algorithm.md + - 6.4.   小结: chapter_hashing/summary.md - 7.     树: - chapter_tree/index.md - 7.1.   二叉树: chapter_tree/binary_tree.md