公司新闻/News

  1. 新葡京新闻
  • 哈希表是什么?为什么需要使用哈希表

  • 作者:旭星棋牌-星月棋牌官网-761棋牌游戏-金帝棋牌下载    发布时间:2020-04-20 04:13:51    来源:旭星棋牌-星月棋牌官网-761棋牌游戏-金帝棋牌下载    浏览:37
  •   我们在这篇文章将要学习最有用的数据结构之一—哈希表,哈希表的英文叫 Hash Table,也可以称为散列表或者 Hash 表。

      哈希表用的是数组支持按照下标随机访问数据的特性,所以哈希表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。

      哈希表存储的是由键(key)和值(value)组成的数据。 例如,我们将每个人的性别作为数据进行存储,键为人名,值为对应的性别,其中 M 表示性别为男,F 表示性别为女。

      此处准备了6个箱子(即长度为6的数组)来存储数据,假设我们需要查询 Ally 的性别,由于不知道 Ally 的数据存储在哪个箱子里,所以只能从头开始查询,这个操作便叫作线性查找。一般来说,我们可以把键当成数据的标识符,把值当成数据的内容。

      从 0 号箱子开始查找,发现 0 号箱子中存储的键是 Joe 而不是 Ally,因此接着查找 1 号箱子。

      功夫不负有心人,当我们查找到 4 号箱子的时候,发现其中数据的键为 Ally,把键对应的值取出,我们就知道 Ally 的性别为女(F)。

      通过上面的查找过程,我们发现数据量越多,线性查找耗费的时间就越长。由此可知:由于数据的查询较为耗时,所以此处并不适合使用数组来存储数据。

      但使用哈希表便可以解决这个问题,首先准备好数组,这次我们用 5 个箱子的数组来存储数据。

      尝试把 Joe 存进去,使用哈希函数(Hash)计算 Joe 的键,也就是字符串 Joe 的哈希值,比如得到的结果为4928。

      将得到的哈希值除以数组的长度 5,求得其余数,这样的求余运算叫作mod运算,此处mod运算的结果为3。

      因此,我们将 Joe 的数据存进数组的 3 号箱子中,重复前面的操作,将其他数据也存进数组中。

      Nell 键的哈希值为 6276, mod 5 的结果为 1,本应将其存进数组的 1 号箱中,但此时 1 号箱中已经存储了 Sue 的数据,这种存储位置重复了的情况便叫作冲突。

      Ally 键的哈希值为 9143, mod 5 的结果为 3,本应将其存储在数组的 3 号箱中,但 3 号箱中已经有了 Joe 的数据,所以使用链表,在其后面存储 Ally 的数据。

      Bob 键的哈希值为 5278, mod 5 的结果为 3,本应将其存储在数组的 3 号箱中,但 3 号箱中已经有了 Joe 和 Ally 的数据,所以使用链表,在 Ally 的后面继续存储 Bob 的数据。

      为了知道 Dan 存储在哪个箱子里,首先需要算出 Dan 键的哈希值,然后对其进行 mod 运算,最后得到的结果为 4,于是我们知道了它存储在 4 号箱中。

      查看 4 号箱可知,其中的数据的键与 Dan 一致,于是取出对应的值,由此我们便知道了 Dan 的性别为男(M)。

      那么,想要查询 Ally 的性别时该怎么做呢?为了找到它的存储位置,先要算出 Ally 键的哈希值,再对其进行 mod 运算,最终得到的结果为 3。

      然而 3 号箱中数据的键是 Joe 而不是 Ally,此时便需要对 Joe 所在的链表进行线性查找。

      于是我们找到了键为 Ally 的数据,取出其对应的值,便知道了 Ally 的性别为女(F)。

      在哈希表中,我们可以利用哈希函数快速访问到数组中的目标数据。如果发生哈希冲突,就使用链表进行存储,这样一来,不管数据量为多少,我们都能够灵活应对。

      如果数组的空间太小,使用哈希表的时候就容易发生冲突,线性查找的使用频率也会更高;反过来,如果数组的空间太大,就会出现很多空箱子,造成内存的浪费。因此,给数组设定合适的空间非常重要。

      在存储数据的过程中,如果发生冲突,可以利用链表在已有数据的后面插入新数据来解决冲突,这种方法被称为链表法,也被称为链地址法。

      其中在Java集合类的 HashMap 中解决冲突的方法就是采用的链表法,建议阅读 HashMap 源码。

      除了链地址法以外,还有几种解决冲突的方法。其中,应用较为广泛的是开放地址法,或称为开放寻址法。这种方法是指当冲突发生时,立刻计算出一个候补地址(数组上的位置)并将数据存进去。如果仍然有冲突,便继续计算下一个候补地址,直到有空地址为止,可以通过多次使用哈希函数或线性探测法等方法计算候补地址。

      这篇文章主要讲了一些比较基础的哈希表知识,包括哈希表的由来、哈希冲突的解决方法。

      哈希表也叫散列表,来源于数组,它借助哈希函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性,是存储 Key-Value 映射的集合。

      哈希表两个核心问题是哈希函数设计和哈希冲突解决。对于某一个 Key,哈希表可以在接近 O(1) 的时间内进行读写操作。哈希表通过哈希函数实现 Key 和数组下标的转换,通过开放寻址法和链表法来解决哈希冲突。哈希函数设计的好坏决定了哈希冲突的概率,也就决定哈希表的性能。

      有兴趣的可以在 JDK 中阅读 HashMap 的源码,在 JDK 8 和之前的版本的实现还有许多不多,比如在 JDK 8 中,引入红黑树,当链表长度太长(默认超过 8)时,链表就转换为红黑树,就可以利用红黑树快速增删改查的特点,提高 HashMap 的性能。

      随着企业以数据为中心的文化,以做出决策和规划,数据科学家对全球企业的重要性日益增加。但是企业无法足....

      如果表示一幅 100×100 大小的灰度图像,取值 [0, 255] 区间内的整数,是图像在 (x,....

      换句话说,当一个神经元不停地触发另一个神经元时,第一个神经元的轴突/连接就会形成突触小结,如果它们已....

      大多数介绍神经网络的文章在描述它们时会涉及到大脑类比,在不深入研究大脑类比的情况下,将神经网络简单描....

      由于目前谷歌等大型网络公司对神经网络的深入研究。现在卷积神经网络已经能对文字和图片的进行识别高效而准....

      定义前向传播函数def multilayer_perceptron(_X, _weights, _b....

      图5.1所示的简单模型就是沿用至今的“M-P神经元模型”。在这个模型中,神经元接收到来自n个其他神经....

      这是一种很灵活的数据结构,它囊括了很多其他的数据结构。例如,如果没有边,那么它就会变成一个集合;如果....

      例如,你有一个神经网络,通过该网络可以获取一些与房屋有关的数据并预测其价格。在这种情况下,你可以使用....

      创建1个TCP任务+3个UDP任务时,最后一个任务不能成功创建。程序是在探索者附带的LWIP_网络实验NETCONN_UDP例...

      但是不去调用他处于低优先级的任务又不能得到机会执行,这该怎么办?...

      原子哥NVIC_Configuration();这个函数的配置 是我们自己定义的还是库函数直接定义呢...

      定义一个函数 void test(IDINT8U TpmNum, IDINT8U ChVal, IDINT16U ChalNum); 并在程序中进行调用。结...

      如果你认为现在的网盘可以缓解手机内存小,那么你就大错特错了。我们平时手机中存储最多的是什么类型的文件....

      流程函数是一类很常用的函数,我们可以通过流程函数在SQL语句中实现条件选择,能实现我们想要的条件判断....

      [tr]学习例程的时候,为什么看不到TL6748.h里每个函数的具体实现呢。 [/tr][table] [/table]...

      具有 8 路差 分或 16 路单端 18 位高速(最高速率 1M)模拟信号采集功能。 它具有模拟采集....

      在一般情况下,用来训练的训练集的标签都是由业务方来标记,在工作中,最常见的其实就是数据分类了,通过已....

      梯度L/w是损失函数递增方向上的向量。L/w是L递减方向上的向量。由于η大于0,因此是正值,所以-η....

      随着互联网科技的不断发展,今天的我们对于网络的依赖性正在逐渐的提高,有很多时候没有网络甚至无法做任何....

      我尝试使用soizof函数并得到一个错误:Get error:error:sizeof对不完整类型“char[]”的无效应用。所以,改为:Nogeterror:err...

      各位大牛,请教一个问题,这个函数有一项是输入f(x,t),一般是函数表达式,但是如果是用户自定义的输入,也就是f(x,t)只有对...

      您好: 我尝试对video.c里面的params结构体进行扩展,只扩展了一个参数,但是在调用_create函数的时候返回了错误。不知道是什么...

      在这几天,看到了一篇解释了函数返回类型设计的一些问题的文章,我觉得说的很透彻,这里分享给大家! 不知从什么时候起,对函数返...

      了解周期序列的傅里叶级数及性质,掌握周期卷积过程 理解离散傅里叶变换及性质,掌握圆周移位、共轭对称....

      如果地球上每个人都不得不依赖闪存(一种用于存储卡和U盘的数据存储系统),那么到2040年,全球预计将....

      硬盘是我们储存大量数据的储存器,俗话说:“数据无价”。请保护好我们的数据,更要保护好我们的硬盘。

      [tr]我自己在网上也试过改变heap的大小,但是也还是会出现这个错误,请各位指教下,谢谢 [/tr][table] [/table]...

      无论是笔记本电脑的固态硬盘、物联网/汽车硬件、基于边缘的人工智能还是嵌入式非易失性内存(eNVM),....

      如果您可以将存储更像是自动驾驶汽车而不是动手,劳动密集型的必需品,该怎么办?如果像自动驾驶汽车一样,....

      众所周知,Java中强调“一切皆对象”,但是Python中的面向对象比Java更加彻底,因为Pyth....

      数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。数据结构在计算....

      在分享每个Python新手应该知道的4个常见错误之前,请确保您熟悉以下文章中的一些Python内置功....

      存储器就是用来存放数据的地方。它是利用电平的高低来存放数据的,也就是说,它存放的实际上是电平的高、低....

      本文档的主要内容详细介绍的是西门子PLC教程之数据块中的数据存储详细资料说明

      本书采用演绎法建立的公理化体系,即根据演绎推理的方法,按一般到特殊的顺序组织教材内容。 本书覆盖了电....

      现在很多企业的业务处在一个地理位置更加分散的状态,越来越多的事情可以在本地处理,决策可以即时发生。

      为什么要用QKFile存储大量数据?QKFile最吸引人的特点是什么?哪些地方是大家担心的?

      在云存储越来越重要的时代,如何能够更改好地利用云存储保护企业数据信息,对于缺乏专业化IT部门的中小企....

      说起移动硬盘,大家脑海里那个固有形象,大概都是机械式的——它主要依靠磁头对磁片上指定位置进行数据....

      众所周知,实际上诸多的控制系统都是非线性系统 特别是机器人控制系统 飞行控制系统 直升机飞控系统等 ....

      注意:这本手册是一个自助培训课程。我们建议您在使用WinDev的同时参阅在线帮助。自助培训课程手册的....

      数据是新的生产力,而AI是新的生产工具。当前,虽然各行各业对AI都抱有极高的热情,但大部分仍停留在P....

      固态硬盘是目前使用人数较多的一种电脑硬盘存储设备,主要用于电脑硬盘数据的存储相对较多。

      到目前为止,为了完成任务,我们共调用了三个系统预定义的函数:printf()、scanf()和sqr....

      提出一种基于滑模观测器与分数阶锁相环(FO-PLL)的无传感器永磁同步电机(permanent m....

      Nasuni的系统还具有其他优势。可以将最常用的数据本地存储在Nasuni的设备上。这样,与将数据存....

      在使用LabVIEW编程过程中,已有的数据类型不能满足我们进一步处理的需要,常常需要对数据类型进行转....

      1. C语言学习中的痛点:针对当前工程师在C语言学习中的痛点,如指针函数与函数指针,如何灵活应用结构....

      1.approach.m文件用于拟合正弦函数 % 说明:正弦函数的自变量作为网络的输入 % 正弦函数....

      企业对于将数据移动到公共云设施的主要担忧是安全性。然而,具有讽刺意味的是, 公有云相较于现场服务器和....

      原子级潜在数据存储设备的图形动画:数据存储元件 - 仅由六个氙原子构成 - 使用电压脉冲液化。

      您的计算机如果携带病毒,那么在你将文件同步到云服务器的时候,带病毒的文件可能覆盖云服务器中的文件,从....

      本文档的主要内容详细介绍的是C语言教程之函数的详细资料说明包括了:1 函数概述 ,2 函 数 定....

      本文档的主要内容详细介绍的是连续系统的时域分析详细教程说明包括了:线性常系数微分方程的建立与求解,起....

      在本文中,笔者想对模型漂移下定义,并讨论如何去识别和跟踪模型漂移。然后,我将描述如何重新训练模型,来....