嵌入式第三十篇——数据结构——哈希表

一、哈希表的基本概念

哈希表(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)时间复杂度。
  • 开放寻址法在删除时需特殊处理(如标记为"已删除"),避免查找链断裂。
相关推荐
撩得Android一次心动9 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
罗西的思考10 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer10 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
dadaobusi10 小时前
学习:灵犀指令集
学习
xhyu6111 小时前
【学习笔记】图像质量评估方法 (5.生成图像是否符合用户要求)
笔记·学习·计算机视觉
高晶12 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy12 小时前
大数计算思路
算法
高晶12 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
学电子她就能回来吗12 小时前
LeetCode Hot 100|普通数组专题学习笔记(零基础版)
笔记·算法·leetcode
用户老李12 小时前
反向传播计算梯度举例
算法