一、哈希表的基本概念
哈希表(Hash Table)是一种通过哈希函数将键(Key)映射到存储位置的数据结构,支持高效的插入、删除和查找操作,平均时间复杂度为O(1)。核心组成部分包括:
- 哈希函数:将键转换为数组索引。
- 数组(桶):存储键值对的底层结构。
- 冲突处理机制:解决不同键映射到同一索引的问题。
二、哈希函数的设计
理想的哈希函数应满足:
- 均匀性:键应均匀分布在数组中,减少冲突。
- 确定性:同一键始终映射到同一索引。
- 高效性:计算速度快。
常见hash函数设计:
(1)直接定值法
(2)平方取中法
(3)折叠法
(4)求余法
求余法示例(用于整数键):
python
def hash_func(key, size):
return key % size # 取模法
三、冲突解决方法
链地址法
将冲突的键值对存储在同一个桶的链表中。查找时需要遍历链表。
python
class HashTable:
def __init__(self, size):
self.size = size
self.table = [[] for _ in range(size)] # 每个桶初始化为空列表
def insert(self, key, value):
index = hash_func(key, self.size)
for item in self.table[index]:
if item[0] == key:
item[1] = value # 更新现有键
return
self.table[index].append([key, value]) # 添加新键值对
开放寻址法
冲突时按规则(如线性探测、二次探测)寻找下一个空闲位置。
python
def linear_probing_insert(table, key, value, size):
index = hash_func(key, size)
while table[index] is not None:
if table[index][0] == key:
table[index][1] = value
return
index = (index + 1) % size # 线性探测
table[index] = [key, value]
四、常见哈希表头文件配置
typedef int DATATYPE;
typedef struct
{
DATATYPE* head;
int tlen;
}HS_TABLE;
HS_TABLE* CreateHsTable(int len);
int insertHsTable(HS_TABLE*hs,DATATYPE*data);
int SearchHsTable(HS_TABLE*hs,DATATYPE*data);
int DestroyHsTable(HS_TABLE*hs);
五、应用场景
- 字典(Python的
dict、Java的HashMap)。 - 缓存系统(如Redis)。
- 数据库索引。
六、注意事项
- 哈希函数设计不当可能导致大量冲突,退化为O(n)时间复杂度。
- 开放寻址法在删除时需特殊处理(如标记为"已删除"),避免查找链断裂。