This commit is contained in:
krahets
2023-12-28 17:18:37 +08:00
parent 8d49c46234
commit d1f1473539
67 changed files with 604 additions and 609 deletions

View File

@@ -4,7 +4,7 @@ comments: true
# 6.1   哈希表
「哈希表 hash table」又称「散列表」通过建立键 `key` 与值 `value` 之间的映射,实现高效的元素查询。具体而言,我们向哈希表输入一个键 `key` ,则可以在 $O(1)$ 时间内获取对应的值 `value`
「哈希表 hash table」又称「散列表」通过建立键 `key` 与值 `value` 之间的映射,实现高效的元素查询。具体而言,我们向哈希表输入一个键 `key` ,则可以在 $O(1)$ 时间内获取对应的值 `value`
如图 6-1 所示,给定 $n$ 个学生,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个学号,返回对应的姓名”的查询功能,则可以采用图 6-1 所示的哈希表来实现。
@@ -51,7 +51,7 @@ comments: true
hmap[10583] = "小鸭"
# 查询操作
# 向哈希表输入键 key ,得到值 value
# 向哈希表输入键 key ,得到值 value
name: str = hmap[15937]
# 删除操作
@@ -74,7 +74,7 @@ comments: true
map[10583] = "小鸭";
/* 查询操作 */
// 向哈希表输入键 key ,得到值 value
// 向哈希表输入键 key ,得到值 value
string name = map[15937];
/* 删除操作 */
@@ -97,7 +97,7 @@ comments: true
map.put(10583, "小鸭");
/* 查询操作 */
// 向哈希表输入键 key ,得到值 value
// 向哈希表输入键 key ,得到值 value
String name = map.get(15937);
/* 删除操作 */
@@ -120,7 +120,7 @@ comments: true
};
/* 查询操作 */
// 向哈希表输入键 key ,得到值 value
// 向哈希表输入键 key ,得到值 value
string name = map[15937];
/* 删除操作 */
@@ -143,7 +143,7 @@ comments: true
hmap[10583] = "小鸭"
/* 查询操作 */
// 向哈希表输入键 key ,得到值 value
// 向哈希表输入键 key ,得到值 value
name := hmap[15937]
/* 删除操作 */
@@ -166,7 +166,7 @@ comments: true
map[10583] = "小鸭"
/* 查询操作 */
// 向哈希表输入键 key ,得到值 value
// 向哈希表输入键 key ,得到值 value
let name = map[15937]!
/* 删除操作 */
@@ -188,7 +188,7 @@ comments: true
map.set(10583, '小鸭');
/* 查询操作 */
// 向哈希表输入键 key ,得到值 value
// 向哈希表输入键 key ,得到值 value
let name = map.get(15937);
/* 删除操作 */
@@ -212,7 +212,7 @@ comments: true
console.info(map);
/* 查询操作 */
// 向哈希表输入键 key ,得到值 value
// 向哈希表输入键 key ,得到值 value
let name = map.get(15937);
console.info('\n输入学号 15937 ,查询到姓名 ' + name);
@@ -238,7 +238,7 @@ comments: true
map[10583] = "小鸭";
/* 查询操作 */
// 向哈希表输入键 key ,得到值 value
// 向哈希表输入键 key ,得到值 value
String name = map[15937];
/* 删除操作 */
@@ -1658,6 +1658,6 @@ index = hash(key) % capacity
<p align="center"> 图 6-4 &nbsp; 哈希表扩容 </p>
类似于数组扩容,哈希表扩容需将所有键值对从原哈希表迁移至新哈希表,非常耗时;并且由于哈希表容量 `capacity` 改变,我们需要通过哈希函数来重新计算所有键值对的存储位置,这进一步提高了扩容过程的计算开销。为此,编程语言通常会预留足够大的哈希表容量,防止频繁扩容。
类似于数组扩容,哈希表扩容需将所有键值对从原哈希表迁移至新哈希表,非常耗时;并且由于哈希表容量 `capacity` 改变,我们需要通过哈希函数来重新计算所有键值对的存储位置,这进一步增加了扩容过程的计算开销。为此,编程语言通常会预留足够大的哈希表容量,防止频繁扩容。
「负载因子 load factor」是哈希表的一个重要概念其定义为哈希表的元素数量除以桶数量用于衡量哈希冲突的严重程度**也常作为哈希表扩容的触发条件**。例如在 Java 中,当负载因子超过 $0.75$ 时,系统会将哈希表扩容至原先的 $2$ 倍。