当前位置: 首页 > news >正文

算法-哈希查找

哈希查找 (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)\)(需要额外的空间来存储哈希表及链表节点)。
要不要我出几道软考风格的哈希查找代码填空题,帮你巩固一下?

http://www.cnnetsun.cn/news/3381476.html

相关文章:

  • STM32F103串口控制A7680C实现4G语音呼叫与应答
  • Qt QML与C++交互中对象生命周期管理:避免悬垂指针与程序崩溃
  • Python时间序列分析实战:从业务问题到生产部署的完整框架
  • 基于实测统计的电动汽车集群充电负荷MATLAB仿真工具包
  • MATLAB版CLIQUE高维聚类核心函数:基于网格密度与k-clique连通性的轻量实现
  • Claude自动化脚本编写终极清单(2024Q3更新版):涵盖AWS CLI、K8s YAML、SQL迁移脚本——仅限前500名订阅者获取完整Prompt库
  • 工地临边防护栏智能识别包:YOLOv8轻量模型+可视化操作界面+完整训练数据与部署方案
  • 高中生真实项目驱动编程教育实践方法
  • 初识Function Calling:让AI学会“调用工具”
  • 抖音批量下载神器:douyin-downloader 完全指南,5分钟搞定无水印批量下载
  • MATLAB一键生成涡旋光束:调节拓扑荷数l实现高斯光束相位螺旋化与OAM可视化
  • 技术演进|生成式文本隐写:从马尔可夫模型到大型语言模型
  • 技术文档写作规范:为何缺失元信息导致内容不可生成
  • 从MMD到Unity:使用Cats插件一键优化并导入Pmx模型(附避坑指南)
  • 基于PLC的钢板横切机控制系统设计321(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 多维聚合实战:Pandas+DuckDB构建可验证的N维分析流水线
  • 高可用架构的故障检测与自动切换
  • 《汇编语言》王爽(第四版) 实验10:从屏幕显示到数值转换——构建可复用子程序库
  • AI空间认知缺陷解析与协作场景优化方案
  • 边缘AI实战:从PyTorch到STM32的部署全链路
  • Java高性能架构设计方法
  • “不该让AI决定主键”?资深架构师紧急叫停团队Claude部署(附数据库设计辅助安全红线白皮书)
  • 你的设备数据,经得起查吗?JVS物联网平台聊聊工业合规的“可信数据底座“
  • Maven多模块项目构建:从‘parent.relativePath’报错解析到IDE兼容性实战
  • 风电运维新选择 管线探测仪 LY-1000 让地下管线一目了然
  • 从井下信号波动看 鼎讯HM-G2500 如何守护煤矿传输命脉
  • ASC1T34S 1位双电源单向总线收发器——数据手册深度解读与参数分析
  • Python构建安全升级:告别setup.py直接调用,拥抱PEP 517
  • 计算机毕业设计之基于SpringBoot教工绩效管理系统
  • Linux日志系统:systemd-journald与rsyslog配置详解