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

数据结构--哈希表

1、相关概念

  1.哈希算法

        将数据通过哈希算法映射成一个键值,存取都在同一位置实现数据的高效存储和查找,并通过这种方式来降低时间复杂度

  2.哈希碰撞

        多个数据通过算法后得到简直相同的现象叫哈希碰撞

  3.哈希表
  • 存储结构(桶/槽):一般是一个数组,每个元素被称为一个桶。
  • 哈希函数:将键映射到整数,再经过模运算等,得到数组下标,好的哈希函数应尽量使不同键映射到不同的桶

2、哈希表的实现

        在该板块中,我将构建一个存放0 - 100 熟知的哈希表,并以此为里说明哈希表的实现方法

  1.哈希表的插入
        思路:
  • 哈希函数:在这里我们用数据除以10得到的余数值区分哈希表的桶
  • 定义容量为10的数组指针,数组内指针分别表示每一个桶的地址
  • 在目标桶中插入链表节点,节点中存储数据
        代码实现:
typedef struct node{      //定义链表节点变量int data;              //存贮的数据struct node *pnrext;   //下一个节点的地址
}linknode;int *phashtable[10];       //定义数组指针void insert_hashtable(int tmpdata)
{linknode *ptmpnode = NULL;      //插入的节点linknode **pptmpnode = NULL;    //桶寻址变量int key = 0;                    //存储余数变量key = tmpdata % 10;             //哈希函数for(pptmpnode = &phashtable[key];*pptmpnode != NULL && (*pptmpnode)->data <tmpdata;pptmpnode = &(*pptmpnode)->pnext);    //找到要插入的位置ptmpnode = malloc(sizeof(linknode));      //创建节点if(NULL == ptmpnode)prrer("error");ptmpnode->data = tmpdata;                 //将节点插入目标位置ptmpnode->pnext = *pptmpnode->pnext;*pptmpnode = ptmpnode;
}
2.哈希表的遍历
        思路:

        利用循环语句访问哈希表每一个桶区的链表

        代码实现:
void show_hashtable(void)
{linknode *ptmpnode = NULL;int i = 0;for(i = 0;i < 10;i++){ptmpnode = phashtable[i];while(ptmpnode != NULL){printf("%d ",ptmpnode->data);ptmpnode = ptmpnode->pnext;}}
}
3.哈希表的查找与销毁

        思路:与哈希表的遍历思路相同,分别查找或删除每一个同上的链表

        代码实现:

/* 哈希表的查找 */linknode *find_hashtable(int tmpdata){   int key = 0;linknode *ptmpnode = NULL;key = tmpdata % 10;ptmpnode = phashtable[key];while (ptmpnode != NULL && ptmpnode->data <= tmpdata){if (ptmpnode->data == tmpdata){return ptmpnode;}ptmpnode = ptmpnode->pnext;}return NULL;}/* 哈希表的销毁 */int destroy_hashtable(void){int i = 0;linknode *ptmpnode = NULL;linknode *pfreenode = NULL;for(i = 0; i < INDEX; i++){ptmpnode = phashtable[i];pfreenode = phashtable[i];while (ptmpnode != NULL){ptmpnode = ptmpnode->pnext;free(pfreenode);pfreenode = ptmpnode;}phashtable[i] = NULL;}return 0;
}

http://www.dtcms.com/a/321183.html

相关文章:

  • QAGenerationChain从知识库生成大模型应用测试的问题对
  • LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串
  • 【uni-app】解决在 h5 环境下会出现双标题问题
  • 内核的调试和优化
  • Netty-Rest搭建笔记
  • 微算法科技(NASDAQ:MLGO)使用循环QSC和QKD的量子区块链架构,提高交易安全性和透明度
  • 降低程序运行时CPU和GPU峰值占用的技术方案
  • 基于深度学习的鸟类检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • ROHM推出适用于Zone-ECU的高性能智能高边开关!
  • 【unitrix数间混合计算】2.3 标准化处理系统(src/number/normalize/mod.rs)
  • Alkimi 与 Sui 合作,修复「破碎」的广告生态
  • HarmonyOS多设备资源文件管理以及resources资源引用方式
  • 交换机100G模块远距离连接踩坑记录
  • 强制用户更改WordPress密码的重要性及实现方法
  • Pinterest视觉营销自动化:亚矩阵云手机实例与多分辨率适配技术
  • 在 Elasticsearch/Kibana (ELK Stack) 中搜索包含竖线 (|)​​ 这类特殊字符的日志消息 (msg 字段) ​确实需要转义
  • proteus实现简易DS18B20温度计(stm32)
  • python学智能算法(三十五)|SVM-软边界拉格朗日方程乘子非负性理解
  • 阿里云服务linux安装单机版
  • Java 之 设计模式
  • Scratch编程:枪战游戏(附源码)
  • C++信息学奥赛一本通-第一部分-基础一-第3章-第1节
  • 【深度学习新浪潮】近三年高精度大规模三维实景重建研究进展(2022-2025)
  • Java零散知识点
  • Webpack 核心配置与最佳实践指南
  • cAdvisor 容器监控软件学习
  • 移动端app专项测试
  • 园区应急调度系统的核心功能
  • 塔罗耳语:免费在线AI塔罗牌占卜工具
  • 1-10〔 OSCP ◈ 研记 〕❘ 信息收集▸主动采集H:SNMP基础