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

一、哈希表的基本概念

哈希表(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)时间复杂度。
  • 开放寻址法在删除时需特殊处理(如标记为"已删除"),避免查找链断裂。
相关推荐
牛油果子哥q6 小时前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
库奇噜啦呼6 小时前
【iOS】RunLoop学习
学习·ios
cici158746 小时前
彩色图像模糊增强(Fuzzy Enhancement)MATLAB 实现
开发语言·算法·matlab
AI棒棒牛6 小时前
第 03 讲《监督学习:数据、标签、Loss与训练循环》
人工智能·学习·yolo·目标检测·yolo26
你是个什么橙6 小时前
Python入门学习2:Python 基础语法全解析——从代码结构到输入输出
开发语言·python·学习
宝贝儿好6 小时前
【LLM】第二章:HuggingFace入门学习
人工智能·深度学习·神经网络·学习·算法·自然语言处理
秋波。未央7 小时前
Java Agent 开发 · Day 1 学习笔记(含作业完整标准答案)
java·笔记·学习
凌波粒7 小时前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
啵啵啵鱼7 小时前
数组---完
算法·排序算法
beethobe7 小时前
PythonQt 学习之旅(一):从零构建 C++ 与 Python 的桥梁
c++·python·学习