数据结构——哈希表

一、基本概念

  1. 哈希:算法思想,将数据根据哈希算法映射成键值,根据键值来写入或是查找数据,以实现查找数据

优势:O(1)时间复杂度

  1. 哈希碰撞(哈希冲突):多个数据通过哈希算法映射成同样的键值,说明产生哈希冲突

  2. 链地址法:数据产生哈希冲突通过在同一键值位置用链表实现多个数据的存储

二、代码实现

1.插入

用静态数组 pHashTable 作为哈希桶,每个桶是一个按 Data 升序排列的链表。

循环初始化:ppTmpNode = &pHashTableIndex;ppTmpNode指向「哈希表的第 Index 个桶项(pHashTable[Index]);但是*ppTmpNode是指向第一个节点的

循环条件:

  • *ppTmpNode != NULL:当前遍历的节点存在,还没到链表末尾。
  • TmpData > (*ppTmpNode)->Data:待插入的数据比当前节点的 Data 大,需要继续往后找。

循环迭代:ppTmpNode = &(*ppTmpNode)->pNext

插入新节点的逻辑:循环结束后,ppTmpNode 指向了插入位置的后继节点指针的地址

  • pNewNode->pNext = *ppTmpNode:新节点的 pNext 指向后继节点(或 NULL)。
  • *ppTmpNode = pNewNode:把新节点挂到 ppTmpNode 指向的指针位置。
  • 无需额外维护前驱节点(因为前驱动点的位置是指向*ppTmpNode的)

2、显示

每次从第i个哈希桶的第一个节点开始打印。

3.查找

根据索引确定在哈希表的哪一个位置,再再从该位置往下遍历链表。

当出现pTmoNode->Data > TmpData时,就可提前结束。

4.销毁

先把第i个哈希表后的链表节点依次消除后,再令pHashTablei= NULL;(为了避免出现「野指针」)

注:栈区内存释放:唯一的方式是让变量超出作用域,由系统自动回收,无需手动编码。

  • 全局变量、静态变量(无论局部 / 全局)存在数据区,程序启动时分配、退出时释放,生命周期贯穿整个程序。
  • 局部变量存在栈区,进入作用域时分配、超出作用域时自动释放,仅作用域内有效。
相关推荐
延凡科技8 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
皓月斯语13 小时前
B3842 [GESP202306 三级] 春游 题解
数据结构·c++·算法·题解
春日见14 小时前
算法与数据结构----哈希表
数据结构·人工智能·算法·机器学习·自动驾驶·哈希算法·散列表
萌动的小火苗14 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
叩码以求索15 小时前
统计按位或能得到最大值的子集数目(一)
数据结构·算法
tachibana215 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
星恒随风15 小时前
C++ STL 栈详解:stack 的使用、经典题目与简单模拟实现
开发语言·数据结构·c++·笔记·学习
txzrxz15 小时前
单调队列讲解
数据结构·c++·算法·单调队列
Keven_1116 小时前
算法札记:树状数组的用途
数据结构·算法
cpp_250117 小时前
P1540 [NOIP 2010 提高组] 机器翻译
数据结构·c++·算法·队列·noip·洛谷题解