This commit is contained in:
krahets
2023-02-26 19:53:26 +08:00
parent cf26cd551a
commit 9cd475d8c2
29 changed files with 180 additions and 0 deletions

View File

@@ -26,6 +26,8 @@ comments: true
![链式地址](hash_collision.assets/hash_collision_chaining.png)
<p align="center"> Fig. 链式地址 </p>
链式地址下,哈希表操作方法为:
- **查询元素**:先将 key 输入到哈希函数得到桶内索引,即可访问链表头结点,再通过遍历链表查找对应 value 。
@@ -56,6 +58,8 @@ comments: true
![线性探测](hash_collision.assets/hash_collision_linear_probing.png)
<p align="center"> Fig. 线性探测 </p>
线性探测存在以下缺陷:
- **不能直接删除元素**。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认为元素不存在(即上述第 `2.` 种情况)。因此需要借助一个标志位来标记删除元素。

View File

@@ -10,6 +10,8 @@ comments: true
![哈希表的抽象表示](hash_map.assets/hash_map.png)
<p align="center"> Fig. 哈希表的抽象表示 </p>
## 6.1.1. &nbsp; 哈希表效率
除了哈希表之外,还可以使用以下数据结构来实现上述查询功能:
@@ -408,6 +410,8 @@ $$
![简单哈希函数示例](hash_map.assets/hash_function.png)
<p align="center"> Fig. 简单哈希函数示例 </p>
=== "Java"
```java title="array_hash_map.java"
@@ -1273,6 +1277,8 @@ $$
![哈希冲突示例](hash_map.assets/hash_collision.png)
<p align="center"> Fig. 哈希冲突示例 </p>
综上所述,一个优秀的「哈希函数」应该具备以下特性:
- 尽量少地发生哈希冲突;