数据结构 哈希表

逻辑追月客
• 阅读 1103

数据结构 哈希表

什么是哈希表

Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构。
它基于数组,通过把关键字映射到数组的某个下表来加快查找速度,但是又和数组、链表、树等数据结构不同,在这些数据结构中查找某个关键字,通常要遍历整个数据结构,也就是O(N)的时间级,但是对于哈希表来说,只是O(1)的时间级。
注意,这里有个重要的问题就是如何把关键字转换为数组的下标,这个转换的函数称为哈希函数(也称散列函数),转换的过程称为哈希化。
一般哈希表都是用来快速判断一个元素是否出现在集合中。
图片
哈希函数
它把一个大范围的数字哈希(转化)成一个小范围的数字,这个小范围的数对应着数组的下标。使用哈希函数向数组插入数据后,这个数组就是哈希表。
哈希冲突
链地址法 --(拉链法)
这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
线性探测法
优点:易于实施;总是找到一个位置(如果有);当表不是很满时,平均情况 下的性能非常好。
缺点:表的相邻插槽中会形成“集群”或“集群”键;当这些簇填满整个阵列的大部 分时,性能会严重下降,因为探针序列执行的工作实际上是对大部分阵列的穷举搜索。
哈希表的优点
可以像数组一样通过下标随机访问。
弥补了数组只能通过整数索引访问的缺陷。
哈希表的缺点
每次存取数据之前要通过散列函数计算对应的散列值,消耗了更多内存。
装载因子 是散列表性能的衡量标准之一。因为散列表实际上还是数组,所以能承载的数据是有限的,当哈希表存储的数据超过数组索引的长度时则必然会出现散列冲突。

常见的三种哈希结构
当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。
数组
set(集合)
map(映射)
在C++语言中,实现在C++中,set 和 map 分别提供了以下三种数据结构,其底层实现以及优劣如下表所示:
图片
红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。

图片

std::map 和std::multimap的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。
当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。
那么再来看一下map ,在map 是一个key value 的数据结构,map中,对key是有限制,对value没有限制的,因为key的存储方式使用红黑树实现的。
总结
总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

本文由博客一文多发平台 OpenWrite 发布!
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java容器之HashMap
HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。解决哈希冲突的三个方法:a.开放定址法  又被称为再散列法,包括线性探测再散列、二次探测再散列、伪随机探测再散列b.再哈希法  地址冲突后,对哈希结果再次进行哈希,直到
Stella981 Stella981
3年前
HashMap中神奇的h & (length
众所周知,HashMap是基于Hash表的Map接口实现,HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。但是知道了Hash值之后,又是怎么确定出key在数组中的索引呢?根据源码得知如下方法static
Wesley13 Wesley13
3年前
15.链地址法
同样是为了解决哈希表中索引重复问题的算法,基本思路为将哈希表中维护的数组改成存储链表的数组,将数据存在链表中。也可以用数组但是数组的插入和删除的效率较低,故采用链表。实现:链表的实现:/链结点,相当于是车厢/publicclassNode{//数据域publi
Stella981 Stella981
3年前
Nginx数据结构之散列表
1\.散列表(即哈希表概念)散列表是根据元素的关键码值而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找速度。这个映射函数f叫做散列方法,存放记录的数组叫做散列表。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需要比较便可直接取得所
Wesley13 Wesley13
3年前
Java中常见数据结构:List与Map
1:集合Collection(单列集合)List(有序,可重复)ArrayList底层数据结构是数组,查询快,增删慢线程不安全,效率高Vector底层数据结构是数组,查询快,增删慢线程安全,效率低LinkedList底层数据结构是链表,查询慢,增删快线程不安全,效率高Set(无序,唯一)HashSet底层数据结构是哈希表(实际上是
Wesley13 Wesley13
3年前
Java HashSet集合的子类LinkedHashSet集合
说明HashSet保证元素的唯一性,可是元素存放进去是没有顺序的。在HashSet下面有一个子类java.util.LinkedHashSet,它是链表哈希表(数组链表或者数组红黑树)组合的一个数据结构。即相对HashSet而言,多了一个链表结构。多了的那条链表,用来记录元素的存储顺序,保证元素有序举例Hash
Wesley13 Wesley13
3年前
Java数据结构和算法(四)——栈
前面我们讲解了数组,数组更多的是用来进行数据的存储,纯粹用来存储数据的数据结构,我们期望的是插入、删除和查找性能都比较好。对于无序数组,插入快,但是删除和查找都很慢,为了解决这些问题,后面我们会讲解比如二叉树、哈希表的数据结构。  而本篇博客讲解的数据结构和算法更多是用作程序员的工具,它们作为构思算法的辅助工具,而不是完全的数据存储工具。这些数据结构的生
Wesley13 Wesley13
3年前
Java学习系列——第3课Java 高级教程
java数据结构  1)【概述】  Java的工具包提供了强大的数据结构在的Java中的数据结构主要包括以下几种接口和类:枚举(枚举)位集合(位集合)向量(矢量)栈(栈)字典(词典)哈希表(哈希表)属性(属性)
Wesley13 Wesley13
3年前
MySQL索引初探
一、什么是索引?帮助数据库系统实现高效获取数据的数据结构索引可以帮助我们快速地定位到数据而不需要每次搜索的时候都遍历数据库中的每一行。二、常见实现方式有哪些?常见索引模型有三种:哈希表、有序数组、搜索树1.哈希表(1)使用哈希表实现的索引称为哈希索引。!(https://os
贾蔷 贾蔷
2个月前
哈希表实现指南:从原理到C++实践
一、简介和应用哈希表(HashTable)是一种高效的数据结构,通过键值对(keyvalue)存储数据,提供快速的插入、删除和查找操作。它使用哈希函数将键映射到表中的位置,使得平均时间复杂度可以达到O(1)。‌应用场景‌:数据库索引、缓存实现(如Redis
贾蔷 贾蔷
2个月前
手把手教你实现哈希表:从代码到原理的新手友好指南
一、简介和应用哈希表(HashTable)是一种高效的数据结构,通过哈希函数将键(Key)映射到存储位置,实现O(1)时间复杂度的查找、插入和删除操作。它广泛应用于缓存系统、数据库索引、字典查询等场景。例如,在编程中需要快速根据用户ID查找信息时,哈希表能
逻辑追月客
逻辑追月客
Lv1
晚霞真好,日出日落在我眼里都很美。
文章
2
粉丝
0
获赞
0