数据结构-哈希表

news/2024/9/8 11:15:03

1.容器
容器用于容纳元素集合,并对元素集合进行管理和维护.
传统意义上的管理和维护就是:增,删,改,查.
我们分析每种类型容器时,主要分析其增,删,改,查动作实现,及复杂度.

2.哈希表
2.1.结构
2.1.1.图解
哈希表是容器类型.
其元素组织采用桶+链表的复合结构.
在这里插入图片描述
上图是一个容量为8的哈希表的桶结构.桶结构采用数组的形式,每个位置上元素是一个指向节点的指针.
上述桶结构索引0,2,4,5,6上分别存储节点指针.索引1,3,7由于下面尚无元素,分别存储了空指针.
通过节点将落在同一个桶内索引上的各个元素组织成一个单向链表.
在这里插入图片描述
上图单独列出了桶结构索引0位置上由三个节点构成的单向链表.
桶索引0上是指向链表首个节点指针.

为了可以明确容器内元素所在的桶的索引位置,哈希表为元素引入的一致性约束是:
(1). 元素的键结合哈希函数导出一个值在[0, 桶的容量)之间的哈希值,此哈希值就是元素所在的桶的索引位置.
(2). 桶的某个索引位置上存在的元素之间通过节点以单向链表组织在一起.

2.1.2.存在一致性约束容器特点
(1). 插入无需提供位置信息.
(2). 不支持直接原地修改.一般分解为移除,添加两个过程.
(3). 由于元素值决定其位置,这类容器一般插入元素时,一般以std::pair<key, value>形式插入.即元素包含键,值两部分.键用来实现一致性约束.值是此键关联的实际内容.

2.2.1.增
插入过程可描述为:
(1). 计算新元素哈希值.
(2). 为新元素分配节点,将节点插入到单向链表.
哈希表可以实现为支持重复元素插入,不支持重复元素插入.
支持重复元素插入时,先从哈希值对应到的单向链表搜索是否存在重复元素.
若不存在,插入到链表首部即可.
若存在,插入到首个重复元素之前即可.
不支持重复元素插入时,先从哈希值对应到的单向链表搜索是否存在重复元素.
若不存在,插入到链表首部即可.
若存在,释放节点,结束.

2.2.2.删
删除元素可描述为:
(1). 计算元素哈希值
(2). 在哈希值对应的单向链表搜索元素.
若找到,则删除.
若无法找到,无需处理.

允许存储重复元素的哈希表,删除时,
若通过提供元素键值进行删除,一般实现为将搜索到的匹配值全部删除.
若通过提供迭代位置进行删除,一般实现为只将位置上节点内元素删除.

2.2.3.查
查找过程可描述为:
(1). 通过键计算哈希值
(2). 在单向链表中查找匹配

2.2.4.改
对于存在一致性约束的容器,一般不会允许直接修改元素的值.
此类操作一般分解为:删除老元素,添加新元素两个过程来实现.

2.3.时间复杂度
评价容器的依据一个是其占据的线性空间,一个是操作执行的时间复杂度.
哈希表的各个操作时间复杂度为:
假设容器的桶结构容量为n,容器内元素数量为m,假设哈希结果较为理想,即哈希值近似均匀落在桶的各个索引位置.

(1). 增:Θ(m/n)
(2). 删:Θ(m/n)
(3). 查:Θ(m/n)
(4). 改:Θ(m/n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/8660.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

笔记-电感充放电过程状态记录

描述&#xff1a;电感充放电过程状态记录 为加深对电感充放电的理解&#xff0c;特做一次记录。 目录 一、准备工作二、电感状态记录1、电感刚开始充电瞬间2、电感充电期间3、电感充电完毕4、电感开始放电瞬间5、电感放电完毕6、电感充放电完整记录 一、准备工作 1、在线平台…

机器学习基础(四)非监督学习的进阶探索

导语&#xff1a;上一节我们详细探索监督学习的进阶应用&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;三&#xff09;监督学习的进阶探索-CSDN博客文章浏览阅读296次&#xff0c;点赞13次&#xff0c;收藏11次。监督学习作为机器学习的一个主要分支&#xff0c;…

网关服务gateway注册Consul时报错Consul service ids must not be empty

网关服务gateway启动时&#xff0c;初始化Consul相关配置时报错。 Consul service ids must not be empty, must start with a letter, end with a letter or digit, and have as interior characters only letters, digits, and hyphen: cbda-server-gateway:10.111.236.142:…

【机器学习基础】一元线性回归(适合初学者的保姆级文章)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…

【Python笔记-设计模式】装饰器模式

一、说明 装饰器模式是一种结构型设计模式&#xff0c;旨在动态的给一个对象添加额外的职责。 (一) 解决问题 不改变原有对象结构的情况下&#xff0c;动态地给对象添加新的功能或职责&#xff0c;实现透明地对对象进行功能的扩展。 (二) 使用场景 如果用继承来扩展对象行…

07 MyBatis之高级映射 + 懒加载(延迟加载)+缓存

1. 高级映射 例如有两张表, 分别为班级表和学生表 自然, 一个班级对应多个学生 像这种数据 , 应该如果如何映射到Java的实体类上呢? 这就是高级映射解决的问题 以班级和学生为例子 , 因为一个班级对应多个学生 , 因此学生表中必定有一个班级编号字段cid 但我们在学生的实体…