GC程序语言中哈希表的实现方法及装置与流程

文档序号:22323793发布日期:2020-09-23 02:12阅读:210来源:国知局
GC程序语言中哈希表的实现方法及装置与流程

本发明属于计算机数据结构技术领域,尤其涉及一种gc程序语言中哈希表的实现方法及装置。



背景技术:

在gc(garbagecollection,垃圾回收)程序语言中,对象的高频构造和销毁会由于周期性的垃圾回收引发巨大的程序执行开销。例如在golang语言中,高频构造和销毁的对象会在堆空间上占据大量的零散内存空间,并在每隔2分钟的垃圾回收发生时导致整个程序长时间锁定无法执行堆内存访问指令。

哈希表是程序设计语言中重要的数据结构,如golang的map和java的hashmap等,用于实现对象的快速查找。在gc程序语言中,哈希表中对象的高频插入和删除会导致大量堆空间上的对象被频繁创建和销毁,周期性执行的gc操作锁定整个堆空间时也会由于对象数量庞大而长时间锁定,进而导致哈希表此时的查询性能显著降低。

由于哈希表是一个非常经典的数据结构,因此其实现方式在各种语言中大同小异。简单来讲,通过一个数组h存储哈希值对应的链表表头,该数组称之为哈希桶。插入、删除、查询操作会先通过对对象的key进行哈希计算,定位到在h数组中的下标,并扫描该下标位置指向的链表判断是否存在该对象及是否需要增删该对象。

以golang为例,它使用传统的哈希表实现方法,在向哈希表插入对象时,会在堆空间上生成一个对象;删除一个对象时会从堆空间中标记该对象已不再被哈希表使用。由于堆空间中的gc会定期检查堆空间所有对象,若没有被任何代码使用则将其最终释放。

在高频插入和删除操作时,对象的申请和释放使得gc会面对一个由大量零碎对象构成的堆空间,对哈希表的频繁操作会显著影响哈希表的整体性能。



技术实现要素:

为克服上述现有的哈希表实现方法对哈希表频繁操作影响哈希表性能的问题或者至少部分地解决上述问题,本发明实施例提供一种gc程序语言中哈希表的实现方法及装置。

根据本发明实施例的第一方面,提供一种gc程序语言中哈希表的实现方法,包括:

若哈希表的矩阵中最后一个对象位于所述矩阵中对象块数组的最后位置,则创建一个新对象块数组,并将所述新对象块数组插入到所述矩阵的最后一行的下方;

获取所述新对象块数组位于所述矩阵中的行号,将所述哈希表的索引数组中与所述行号相同的下标位置指向所述新对象块数组,并将所述新对象块数组的起始位置的元素初始化为待插入对象;

若所述哈希表的矩阵中的最后一个对象不位于所述对象块数组的最后位置,则将所述最后一个对象所在位置的后一个位置的元素初始化为所述待插入对象。

具体地,若哈希表的矩阵中最后一个对象位于所述矩阵中对象块数组的最后位置,则创建一个新对象块数组的步骤之前还包括:

计算所述待插入对象的key值的哈希值,根据所述哈希值定位所述待插入对象在哈希表的哈希桶中的位置;

遍历访问所述哈希表的链表的所述位置,若所述位置不存在所述待插入对象,则判断所述哈希表的矩阵中的最后一个对象是否位于所述对象块数组的最后位置。

具体地,将所述哈希表的索引数组中与所述行号相同的下标位置指向所述新对象块数组的步骤还包括:

若所述索引数组的长度小于或等于所述新对象块数组位于所述矩阵中的行号,则创建一个新的索引数组;其中,所述新的索引数组的长度大于原来的索引数组的长度;

将原来的索引数组的内容复制到所述新的索引数组中,并将所述新的索引数组中与所述行号相同的下标位置指向所述新对象块数组。

具体地,还包括:

计算待删除对象的key值的哈希值,根据所述待删除对象的key值的哈希值定位所述待删除对象在哈希表的哈希桶中的位置;

遍历访问所述待删除对象在所述哈希表的链表的所述位置,若所述位置存在所述待删除对象,则将所述待删除对象和所述矩阵中的最后一个对象互换;

若所述待删除对象互换后的位置为所述对象块数组的起始位置,则销毁所述待删除对象互换后所在的对象块数组。

具体地,销毁所述待删除对象互换后所在的对象块数组的步骤之后还包括:

若所述索引数组的长度减去所述待删除对象互换后位于所述矩阵的行号大于预设阈值,则创建一个新的索引数组;其中,所述新的索引数组的长度小于原来的索引数组的长度;

将原来的索引数组的内容复制到所述新的索引数组中,并将所述新的索引数组中与所述待删除对象互换后位于所述矩阵的行号相同的下标位置指向空。

具体地,将所述待删除对象和所述矩阵中的最后一个对象互换的步骤之后还包括:

若所述待删除对象互换后的位置不为所述对象块数组的起始位置,则删除互换后的所述待删除对象。

具体地,还包括:

计算待查找对象的key值的哈希值,根据所述待查找对象的key值的哈希值定位所述待查找对象在哈希表的哈希桶中的位置;

遍历访问所述待查找对象在所述哈希表的链表的所述位置,若所述位置存在所述待查找对象,则将所述待查找对象返回。

根据本发明实施例第二方面提供一种gc程序语言中哈希表的实现装置,包括:

创建模块,用于在哈希表的矩阵中最后一个对象位于所述矩阵中对象块数组的最后位置时,创建一个新对象块数组,并将所述新对象块数组插入到所述矩阵的最后一行的下方;

插入模块,用于获取所述新对象块数组位于所述矩阵中的行号,将所述哈希表的索引数组中与所述行号相同的下标位置指向所述新对象块数组,并将所述新对象块数组的起始位置的元素初始化为待插入对象;

若所述哈希表的矩阵中的最后一个对象不位于所述对象块数组的最后位置,则将所述最后一个对象所在位置的后一个位置的元素初始化为所述待插入对象。

根据本发明实施例的第三个方面,还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器调用所述程序指令能够执行第一方面的各种可能的实现方式中任一种可能的实现方式所提供的gc程序语言中哈希表的实现方法。

根据本发明实施例的第四个方面,还提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行第一方面的各种可能的实现方式中任一种可能的实现方式所提供的gc程序语言中哈希表的实现方法。

本发明实施例提供一种gc程序语言中哈希表的实现方法及装置,该方法通过在向哈希表插入对象时,若哈希表的矩阵中最后一个对象位于矩阵中对象块数组的最后位置,则创建一个新对象块数组,将待插入对象插入新对象块数组的起始位置,通过将对象在哈希表中以对象块的方式进行存放,使得哈希表中的内存申请单元为矩阵中的一个数组,而非单个对象,从而将内存申请的频率降低至1/height(b),堆内存中对象的数量降低至1/height(b),哈希表的性能得到显著提升。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的gc程序语言中哈希表的实现方法整体流程示意图;

图2为本发明实施例提供的gc程序语言中哈希表的实现方法中哈希表的架构示意图;

图3为本发明实施例提供的gc程序语言中哈希表的实现装置整体结构示意图;

图4为本发明实施例提供的电子设备整体结构示意图。

具体实施方式

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

在本发明的一个实施例中提供一种gc程序语言中哈希表的实现方法,图1为本发明实施例提供的gc程序语言中哈希表的实现方法整体流程示意图,该方法包括:s101,若哈希表的矩阵中最后一个对象位于所述矩阵中对象块数组的最后位置,则创建一个新对象块数组,并将所述新对象块数组插入到所述矩阵的最后一行的下方;

本实施例中的哈希表包括三个部分,即哈希桶h、多个长度相同的对象块数组构成的矩阵b和一个变长索引数组i,如图2所示。其中对象块数组为由多个对象构成的对象块形成的数组。哈希表初始化时,由调用者传入h的长度lh、变长索引数组的初始长度len(i)、b中每个数组的长度,即b的高度height(b)。初始时b中的数组个数len(b)=1,b[0]数组的长度等于height(b)。b中存储的对象以对象块的方式紧挨存放,每个对象块的长度为height(b),通常height(b)可取值为[16,256]之间的整数。初始时变长索引数组的第0个位置i[0]指向b[0]。

向哈希表中插入一个待插入对象<key,object>时,获取b中的最后一个元素b[i][j]。若b[i][j]中j=height(b)-1,那么创建一个新的长度为height(b)的对象块数组b[i+1]。

s102,获取所述新对象块数组位于所述矩阵中的行号,将所述哈希表的索引数组中与所述行号相同的下标位置指向所述新对象块数组,并将所述新对象块数组的起始位置的元素初始化为待插入对象;

将i[i+1]指向b[i+1],并将b[i+1][0]初始化为待插入对象<key,object>中的object。

s103,若所述哈希表的矩阵中的最后一个对象不位于所述对象块数组的最后位置,则将所述最后一个对象所在位置的后一个位置的元素初始化为所述待插入对象。

若b[i][j]中j<height(b)-1,则直接将b[i][j+1]初始化为该object。

本实施例通过在向哈希表插入对象时,若哈希表的矩阵中最后一个对象位于矩阵中对象块数组的最后位置,则创建一个新对象块数组,将待插入对象插入新对象块数组的起始位置,通过将对象在哈希表中以对象块的方式进行存放,使得哈希表中的内存申请单元为矩阵中的一个数组,而非单个对象,从而将内存申请的频率降低至1/height(b),堆内存中对象的数量降低至1/height(b),哈希表的性能得到显著提升。

在上述实施例的基础上,本实施例中若哈希表的矩阵中最后一个对象位于所述矩阵中对象块数组的最后位置,则创建一个新对象块数组的步骤之前还包括:计算所述待插入对象的key值的哈希值,根据所述哈希值定位所述待插入对象在哈希表的哈希桶中的位置;遍历访问所述哈希表的链表的所述位置,若所述位置不存在所述待插入对象,则判断所述哈希表的矩阵中的最后一个对象是否位于所述对象块数组的最后位置。

具体地,为了避免待插入对象的重复插入,在将待插入对象插入哈希表之前,先判断待插入对象是否在哈希表中已经存在,若不存在才对其进行插入。

计算待插入对象的key值的哈希值hash(key),并定位其在h数组中的下标h。遍历访问h[h]对应的链表,若找到待插入对象则返回,否则将待插入对象插入哈希表。

在上述实施例的基础上,本实施例中将所述哈希表的索引数组中与所述行号相同的下标位置指向所述新对象块数组的步骤还包括:若所述索引数组的长度小于或等于所述新对象块数组位于所述矩阵中的行号,则创建一个新的索引数组;其中,所述新的索引数组的长度大于原来的索引数组的长度;将原来的索引数组的内容复制到所述新的索引数组中,并将所述新的索引数组中与所述行号相同的下标位置指向所述新对象块数组。

具体地,若i的长度小于或等于i+1,则生成一个比i长的新索引数组,如新i的长度为原来i的长度的两倍,并将原来i中的内容复制到新i中。将新i中的i[i+1]指向b[i+1],将b[i+1][0]初始化为待插入对象的object。

在上述各实施例的基础上,本实施例中还包括:计算待删除对象的key值的哈希值,根据所述待删除对象的key值的哈希值定位所述待删除对象在哈希表的哈希桶中的位置;遍历访问所述待删除对象在所述哈希表的链表的所述位置,若所述位置存在所述待删除对象,则将所述待删除对象和所述矩阵中的最后一个对象互换;若所述待删除对象互换后的位置为所述对象块数组的起始位置,则销毁所述待删除对象互换后所在的对象块数组。

具体地,从哈希表中删除一个待删除对象<key,object>时,计算key的哈希值hash(key),并定位其在h数组中的下标h。遍历访问h[h]对应的链表,若没找到待删除对象则返回空;若找到待删除对象,且待删除对象在b中的位置为b[i][j],则将它和b矩阵中的最后一个元素b[i2][j2]互换。若j2=0,则销毁b[i2]整个数组。若j2>0,则仅删除互换后的待删除对象。

本实施例通过将对象在哈希表中以对象块的方式进行存放,使得哈希表中的内存释放单元为矩阵中的一个数组,而非单个对象,从而将内存释放的频率降低至1/height(b),堆内存中对象的数量降低至1/height(b),哈希表的性能得到显著提升。

在上述实施例的基础上,本实施例中销毁所述待删除对象互换后所在的对象块数组的步骤之后还包括:若所述索引数组的长度减去所述待删除对象互换后位于所述矩阵的行号大于预设阈值,则创建一个新的索引数组;其中,所述新的索引数组的长度小于原来的索引数组的长度;将原来的索引数组的内容复制到所述新的索引数组中,并将所述新的索引数组中与所述待删除对象互换后位于所述矩阵的行号相同的下标位置指向空。

具体地,若i2远小于i数组的长度,如i2小于i数组长度的1/4,则生成一个比i短的新数组,如为原来i数组长度的1/2,并将原来i中的内容复制到新的i数组中,并将i[i2]指向空。

在上述各实施例的基础上,本实施例中还包括:计算待查找对象的key值的哈希值,根据所述待查找对象的key值的哈希值定位所述待查找对象在哈希表的哈希桶中的位置;遍历访问所述待查找对象在所述哈希表的链表的所述位置,若所述位置存在所述待查找对象,则将所述待查找对象返回。

具体地,从哈希表中查询一个待查询对象<key,object>时,计算待查找对象的key值的哈希值hash(key),并定位其在h数组中的下标h。遍历访问h[h]对应的链表,若找到待查询对象则返回。

在本发明的另一个实施例中提供一种gc程序语言中哈希表的实现装置,该装置用于实现前述各实施例中的方法。因此,在前述gc程序语言中哈希表的实现方法的各实施例中的描述和定义,可以用于本发明实施例中各个执行模块的理解。图3为本发明实施例提供的gc程序语言中哈希表的实现装置整体结构示意图,该装置包括创建模块301和插入模块302;其中:

创建模块,用于在哈希表的矩阵中最后一个对象位于所述矩阵中对象块数组的最后位置时,创建一个新对象块数组,并将所述新对象块数组插入到所述矩阵的最后一行的下方;

插入模块,用于获取所述新对象块数组位于所述矩阵中的行号,将所述哈希表的索引数组中与所述行号相同的下标位置指向所述新对象块数组,并将所述新对象块数组的起始位置的元素初始化为待插入对象;

若所述哈希表的矩阵中的最后一个对象不位于所述对象块数组的最后位置,则将所述最后一个对象所在位置的后一个位置的元素初始化为所述待插入对象。

本实施例通过在向哈希表插入对象时,若哈希表的矩阵中最后一个对象位于矩阵中对象块数组的最后位置,则创建一个新对象块数组,将待插入对象插入新对象块数组的起始位置,通过将对象在哈希表中以对象块的方式进行存放,使得哈希表中的内存申请单元为矩阵中的一个数组,而非单个对象,从而将内存申请的频率降低至1/height(b),堆内存中对象的数量降低至1/height(b),哈希表的性能得到显著提升。

在上述实施例的基础上,本实施例中还包括判断模块,用于计算所述待插入对象的key值的哈希值,根据所述哈希值定位所述待插入对象在哈希表的哈希桶中的位置;遍历访问所述哈希表的链表的所述位置,若所述位置不存在所述待插入对象,则判断所述哈希表的矩阵中的最后一个对象是否位于所述对象块数组的最后位置。

在上述实施例的基础上,本实施例中插入模块还用于:若所述索引数组的长度小于或等于所述新对象块数组位于所述矩阵中的行号,则创建一个新的索引数组;其中,所述新的索引数组的长度大于原来的索引数组的长度;将原来的索引数组的内容复制到所述新的索引数组中,并将所述新的索引数组中与所述行号相同的下标位置指向所述新对象块数组。

在上述实施例的基础上,本实施例中还包括删除模块,用于计算待删除对象的key值的哈希值,根据所述待删除对象的key值的哈希值定位所述待删除对象在哈希表的哈希桶中的位置;遍历访问所述待删除对象在所述哈希表的链表的所述位置,若所述位置存在所述待删除对象,则将所述待删除对象和所述矩阵中的最后一个对象互换;若所述待删除对象互换后的位置为所述对象块数组的起始位置,则销毁所述待删除对象互换后所在的对象块数组。

在上述实施例的基础上,本实施例中删除模块还用于:若所述索引数组的长度减去所述待删除对象互换后位于所述矩阵的行号大于预设阈值,则创建一个新的索引数组;其中,所述新的索引数组的长度小于原来的索引数组的长度;将原来的索引数组的内容复制到所述新的索引数组中,并将所述新的索引数组中与所述待删除对象互换后位于所述矩阵的行号相同的下标位置指向空。

在上述实施例的基础上,本实施例中删除模块还用于:若所述待删除对象互换后的位置不为所述对象块数组的起始位置,则删除互换后的所述待删除对象。

在上述实施例的基础上,本实施例中还包括查找模块,用于计算待查找对象的key值的哈希值,根据所述待查找对象的key值的哈希值定位所述待查找对象在哈希表的哈希桶中的位置;遍历访问所述待查找对象在所述哈希表的链表的所述位置,若所述位置存在所述待查找对象,则将所述待查找对象返回。

图4示例了一种电子设备的实体结构示意图,如图4所示,该电子设备可以包括:处理器(processor)401、通信接口(communicationsinterface)402、存储器(memory)403和通信总线404,其中,处理器401,通信接口402,存储器403通过通信总线404完成相互间的通信。处理器401可以调用存储器403中的逻辑指令,以执行如下方法:若哈希表的矩阵中最后一个对象位于矩阵中对象块数组的最后位置,则创建一个新对象块数组,并将新对象块数组插入到所述矩阵的最后一行的下方;获取新对象块数组位于矩阵中的行号,将哈希表的索引数组中与行号相同的下标位置指向新对象块数组,并将新对象块数组的起始位置的元素初始化为待插入对象;若哈希表的矩阵中的最后一个对象不位于对象块数组的最后位置,则将最后一个对象所在位置的后一个位置的元素初始化为所述待插入对象。

此外,上述的存储器403中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

本实施例提供一种非暂态计算机可读存储介质,非暂态计算机可读存储介质存储计算机指令,计算机指令使计算机执行上述各方法实施例所提供的方法,例如包括:若哈希表的矩阵中最后一个对象位于矩阵中对象块数组的最后位置,则创建一个新对象块数组,并将新对象块数组插入到所述矩阵的最后一行的下方;获取新对象块数组位于矩阵中的行号,将哈希表的索引数组中与行号相同的下标位置指向新对象块数组,并将新对象块数组的起始位置的元素初始化为待插入对象;若哈希表的矩阵中的最后一个对象不位于对象块数组的最后位置,则将最后一个对象所在位置的后一个位置的元素初始化为所述待插入对象。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1