news 2026/7/14 21:39:59

算法-哈希查找

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法-哈希查找

哈希查找 (Hash Search)

像“查字典”一样,不需要从头到尾挨个翻找。而是根据关键字(Key)直接套用一个“公式”(哈希函数),瞬间算出它应该在哪一页(存储地址)。如果算出来的位置刚好是你要找的词,就成功了;如果那个位置被别的词占了(哈希冲突),就按照既定规则往后顺延或者顺着链表找,直到找到为止。

核心代码

#include <stdio.h> #include <stdlib.h> #define TABLE_SIZE 10 // 哈希表节点结构(链地址法) typedef struct Node { int key; struct Node *next; } Node; // 哈希表结构 typedef struct HashTable { Node *buckets[TABLE_SIZE]; } HashTable; // 初始化哈希表 void initHashTable(HashTable *table) { for (int i = 0; i < TABLE_SIZE; i++) { table->buckets[i] = NULL; } } // 插入元素 void insert(HashTable *table, int key) { int index = key % TABLE_SIZE; // 使用除留余数法计算哈希地址 Node *newNode = (Node *)malloc(sizeof(Node)); newNode->key = key; newNode->next = table->buckets[index]; // 头插法 table->buckets[index] = newNode; } // 哈希查找函数 int search(HashTable *table, int key) { int index = key % TABLE_SIZE; // 1. 计算哈希地址 Node *current = table->buckets[index]; // 2. 定位到对应的桶(链表) // 3. 遍历链表查找目标 while (current != NULL) { if (current->key == key) { return 1; // 查找成功 } current = current->next; } return 0; // 遍历结束未找到,查找失败 } int main() { HashTable table; initHashTable(&table); int keys[] = {12, 22, 34, 44, 55}; for (int i = 0; i < 5; i++) { insert(&table, keys[i]); } int target = 34; if (search(&table, target)) { printf("成功找到目标值 %d\n", target); } else { printf("未找到目标值 %d\n", target); } return 0; }

示例演示

将 {12, 22, 34, 44, 55} 存入哈希表(哈希函数为 key % 10),然后查找目标值 34。

第 1 步:计算哈希地址
目标:通过公式瞬间定位目标所在的“桶”。
取出目标关键字:34。
套用哈希函数:34 % 10 = 4。
定位:直接访问哈希表下标为 4 的桶(链表)。

第 2 步:处理冲突与遍历查找
目标:在目标桶的链表中确认元素是否存在。
访问下标为 4 的桶,发现里面挂载了两个元素(因为 44 % 10 也等于 4,发生了哈希冲突)。
链表内容为:44 -> 34 -> NULL。
开始遍历链表:第一个节点是 44,44 != 34,继续往下找。
第二个节点是 34,34 == 34,匹配成功!
查找结束:返回查找成功。

复杂度

时间复杂度:平均情况是\(O(1)\)(理想状态下无冲突,一次定位即可找到);最坏情况是\(O(n)\)(所有元素都发生冲突挤在同一条链表里,退化为顺序查找)。
空间复杂度是\(O(n)\)(需要额外的空间来存储哈希表及链表节点)。
要不要我出几道软考风格的哈希查找代码填空题,帮你巩固一下?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 21:35:25

STM32F103串口控制A7680C实现4G语音呼叫与应答

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;基于STM32F103&#xff08;如C8T6、RBT6&#xff09;的嵌入式工程&#xff0c;通过标准USART串口与A7680C 4G模块通信&#xff0c;完整支持AT指令驱动语音功能&#xff1a;主动拨号、振铃检测、自动/手动接听、…

作者头像 李华
网站建设 2026/7/14 21:34:26

Qt QML与C++交互中对象生命周期管理:避免悬垂指针与程序崩溃

1. 项目概述&#xff1a;QML与C交互中的“幽灵”问题在Qt的混合开发项目中&#xff0c;QML负责构建灵动、现代的界面&#xff0c;C则承载着核心的业务逻辑与数据处理。这种分工协作的模式极大地提升了开发效率和应用性能。然而&#xff0c;当你在QML中愉快地调用一个C对象的方法…

作者头像 李华
网站建设 2026/7/14 21:31:48

Python时间序列分析实战:从业务问题到生产部署的完整框架

1. 项目概述&#xff1a;这不是“学Python做时间序列”&#xff0c;而是用Python解决真实业务中的时序难题“Time Series Data Analysis In Python”——这个标题乍看像教科书章节名&#xff0c;但在我过去十年带团队落地的87个工业、金融、零售和IoT项目里&#xff0c;它从来不…

作者头像 李华
网站建设 2026/7/14 21:31:35

基于实测统计的电动汽车集群充电负荷MATLAB仿真工具包

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;这个MATLAB工具包专为模拟大规模电动汽车充电行为设计&#xff0c;用蒙特卡洛方法生成真实感强的负荷曲线。它内置四个核心参数的概率模型&#xff1a;日行驶里程、电池剩余电量&#xff08;SOC&#xff09;、开…

作者头像 李华
网站建设 2026/7/14 21:28:34

Claude自动化脚本编写终极清单(2024Q3更新版):涵盖AWS CLI、K8s YAML、SQL迁移脚本——仅限前500名订阅者获取完整Prompt库

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Claude自动化脚本编写的核心范式与能力边界 Claude 自动化脚本并非传统意义上的可执行程序&#xff0c;而是基于其 API 接口与提示工程&#xff08;Prompt Engineering&#xff09;协同构建的智能交互范式。其…

作者头像 李华