前言
每日一题伴随的可能不会的知识点分享 今日知识点:哈希表
一、哈希表是什么?
哈希表(Hash Table,又称散列表)是一种高效的数据结构,用于快速存储和查找键值对。它的核心思想是通过哈希函数将键(Key)映射到数组中的特定位置,从而实现平均 O(1) 时间复杂度的插入、删除和查找操作。
1、🧠 哈希表的核心组成
哈希函数(Hash Function)
将任意大小的键(如字符串、数字、对象)转换为固定范围的整数(通常是数组的索引)。
例如:hash(key) = key % 24(将键映射到 0-23 的索引)。
数组(存储桶)
存储实际数据的容器,每个位置称为一个“桶”(Bucket)。
冲突解决机制
当不同键映射到同一个索引时(称为哈希冲突),需要通过以下方法解决:
开放寻址法:寻找下一个空桶(如线性探测、二次探测)。
链地址法:每个桶存储一个链表或数组,存放所有冲突的键值对。
2、🔄 哈希表的工作流程
插入键值对:
用哈希函数计算键的索引。
若该位置为空,直接存储;若冲突,按冲突解决策略处理。
查找值:
用哈希函数计算键的索引。
检查该位置的键是否匹配;若冲突,继续按冲突解决策略搜索。
二、🌰 以【两数之和】题目为例
在计算“两数之和是24的倍数”时,可以用哈希表记录余数的出现次数:
JavaScript
const count = {}; // 哈希表:键是余数(0-23),值是该余数出现的次数
遍历数组时,计算当前数的余数 rem = num % 24。
寻找互补余数 comp = (24 - rem) % 24。
如果哈希表中已有 comp 的记录,则结果累加该次数。
最后将当前余数存入哈希表。
整个过程利用哈希表以 O(1) 时间快速查找互补余数,【避免】暴力枚举所有数对(O(n²))。
三、✅ 哈希表的优点
高效操作:平均 O(1) 的插入、删除、查找。
灵活键类型:支持字符串、对象等复杂键(数组索引只能是数字)。
广泛用途:如数据库索引、缓存(如Redis)、字典(JS对象、Python字典)。
四、❌ 哈希表的缺点
哈希冲突:设计不良的哈希函数会导致冲突频繁,降低性能。
空间浪费:数组需要预留空间以减少冲突。
无序性:传统哈希表不记录插入顺序(JS的Map可以)。
五、📊 哈希表在JavaScript中的实现
对象字面量 {}:
键会被自动转换为字符串,可能导致意外行为(如 1 和 "1" 视为相同键)。
const hashMap = {};
hashMap["key"] = value; // 插入
const value = hashMap["key"]; // 查找
Map 对象(ES6+):支持任意类型的键(对象、函数等),保留插入顺序,更安全。
const hashMap = new Map();
hashMap.set("key", value); // 插入
const value = hashMap.get("key"); // 查找
总结
哈希表通过“空间换时间”策略,将时间复杂度从 O(n) 优化到 O(1),是算法和工程中不可或缺的工具。理解它的核心原理(哈希函数、冲突解决)和实际应用场景,能帮助你高效解决计数、去重、映射类问题。