一种通过哈希值表实现数据快速检索的方法和系统
技术领域
本发明涉及数据检索领域,特别是一种通过新型哈希值表实现数据快速检索的方法和系统。
背景技术
哈希表是一种快速的元素存取和读取数组,主要应用于数据快速检索的领域,由于其特点是根据元素的哈希值进行数组定位和访问,其效率非常高。然而当多个元素的哈希值相同时,就会出现哈希值冲突的情况,即对应的数组位置只能存放一个元素,传统的方法是在冲突时,通过链表的方式解决,但此方法在添加、查询和删除时都需要进行链表的遍历操作,特别是在数据量巨大时,哈希冲突将导致链表长度不断增加。但链表的遍历和查询过程是非常缓慢的,因此传统的链表方式并不能高效的解决哈希表的冲突情况,在大量数据存取操作时效率更加低下。
因此,需要一种新的技术方案,有效地解决使用链表时哈希值冲突的问题,这种技术方案同时也应当适用于大量数据的存取操作,应能有效地提高存取效率。
发明内容
为解决上述问题,本发明的目的在于提供一种通过新型哈希值表实现数据快速检索的方法和系统,通过构造新型映射关系,有效解决快速检索时哈希值冲突的问题,同时,对于大量数据的存取操作,避免链表操作中的长时间的遍历和查询,提升存取效率。
本发明解决其问题所采用的技术方案是:
一种通过新型哈希值表实现数据快速检索的方法,包括:
构造映射表和动态数组,动态数组中的每个元素包括数据本身和下标,映射表为具有固定长度的数组,其每个入口用于存储元素在动态数组中的位置索引;
通过下标在映射表入口与动态数组元素之间构造映射关系,完成向动态数组中添加、查询和删除元素。
当向动态数组中添加元素时,将该元素添加至动态数组的末尾,同时将该元素的哈希值与映射表长度进行取余运算,所得的余值作为该元素对应映射表入口的索引值,若当前入口未被占用,则将该元素在动态数组中的位置索引写入与该元素的索引值对应的映射表入口中,若当前入口已被占用,则将与该元素的索引值对应的映射表入口中的值写入该元素的下标,并且将该元素在动态数组中的位置索引写入该元素的索引值所对应的映射表入口中。
当向动态数组查询元素时,将该元素的哈希值与映射表长度取余,所得的余值作为该元素对应映射表入口的索引值,根据该索引值获取与该索引值对应的存储在映射表入口中的位置索引,根据此位置索引定位动态数组中的元素,将该定位出的元素与所查询的元素进行对比,若相同,则结束查询,否则,根据该定位出的元素的下标定位下一个存储在动态数组中的元素,直至找到所查询的元素或所定位的元素的下标为空时,结束查询。
当删除动态数组中的元素时:
查询该元素在动态数组中的位置,将该元素的哈希值与映射表长度取余,所得的余值作为该元素对应映射表入口的索引值,根据该索引值获取与该索引值对应的存储在映射表入口中的位置索引,根据此位置索引定位动态数组中的元素,将该定位出的元素与所查询的元素进行对比,若相同,则结束查询,否则,根据该定位出的元素的下标定位下一个存储在动态数组中的元素,直至找到或下标为空时,结束查询;
判断所查询到的元素是否为在动态数组中查找到的第一个元素,若该元素在动态数组中的位置索引与映射表入口中存储的位置索引相同,则表明该元素为第一个元素,此时,若该元素的下标为空,则将对应的映射表入口中的值清零,若该元素的下标不为空,则将对应的映射表入口中的值更改为该元素的下标值,若所查询到的元素不是第一个元素,则将上一个查询到的元素的下标赋值为该元素的下标。
所述映射表的固定长度根据动态数组中元素的个数进行调整。
一种通过新型哈希值表实现数据快速检索的系统,包括:
构造模块,用于构造映射表和动态数组,动态数组中的每个元素包括数据本身和下标,映射表为具有固定长度的数组,其每个入口用于存储元素在动态数组中的位置索引;
检索模块,用于通过下标在映射表入口与动态数组的元素之间构造映射关系,完成向动态数组中添加、查询和删除元素。
所述检索模块包括:
添加单元,用于当向动态数组中添加元素时,将该元素添加至动态数组的末尾,同时将该元素的哈希值与映射表长度进行取余运算,所得的余值作为该元素对应映射表入口的索引值,若当前入口未被占用,则将该元素在动态数组中的位置索引写入与该元素的索引值对应的映射表入口中,若当前入口已被占用,则将与该元素的索引值对应的映射表入口中的值写入该元素的下标,并且将该元素在动态数组中的位置索引写入该元素的索引值所对应的映射表入口中。
所述检索模块还包括:
查询单元,用于当向动态数组查询元素时,将该元素的哈希值与映射表长度取余,所得的余值作为该元素对应映射表入口的索引值,根据该索引值获取与该索引值对应的存储在映射表入口中的位置索引,根据此位置索引定位动态数组中的元素,将该定位出的元素与所查询的元素进行对比,若相同,则结束查询,否则,根据该定位出的元素的下标定位下一个存储在动态数组中的元素,直至找到所查询的元素或所定位的元素的下标为空时,结束查询。
所述检索模块还包括:
删除模块,用于根据查询单元定位所要删除的元素在动态数组中的位置,之后,判断所查询到的元素是否为在动态数组中查找到的第一个元素,若该元素在动态数组中的位置索引与映射表入口中存储的位置索引相同,则表明该元素为第一个元素,此时,若该元素的下标为空,则将对应的映射表入口中的值清零,若该元素的下标不为空,则将对应的映射表入口中的值更改为该元素的下标值,若所查询到的元素不是第一个元素,则将上一个查询到的元素的下标赋值为该元素的下标。
本发明的有益效果是:
本发明采用一种通过新型哈希值表实现数据快速检索的方法和系统,构造映射表和动态数组,动态数组中的元素包括数据和下标,映射表用于存储元素在动态数组中的位置索引,通过下标可以构造映射表与动态数组之间的映射关系,实现对动态数组中元素的添加、查询和删除等操作,避免了链表操作中频繁的遍历与查询,有效地节省了时间,尤其是对于大量数据的存取操作时,通过下标可以避免哈希值冲突的问题,且可以快速、准确地实现操作目的。
附图说明
下面结合附图和实例对本发明作进一步说明。
图1是构造的映射表与动态数组示意图;
图2是向动态数组添加元素时的流程示意图;
图3是查询动态数组中的元素时的流程示意图;
图4是向动态数据添加数据后的示意图;
图5是通过下标解决哈值冲突后的示意图;
图6是删除动态数组中元素后的示意图。
具体实施方式
参照图1所示构造的映射表与动态数组示意图,本发明构造了映射表与动态数组,动态数组的长度可以自动调节,动态数组中的每个元素包括数据本身和下标,每个元素在动态数组中均具有位置索引,此位置索引其实为动态数据在为元素分配位置时产生的元素的个数值,当元素的哈希值相同时,下标用于存放相邻元素的位置索引;映射表为具有固定的长度的数组,但此固定长度可以根据动态数组中元素的个数进行调整,映射表具有索引入口,每个入口用于存储元素在动态数组中的位置索引。
本发明通过下标可以构造映射表与动态数组之间的映射关系,从而实现向动态数组中添加、查询或删除元素。
参照图2所示向动态数组添加元素时的流程示意图,当向动态数据中添加元素时,将该元素添加至动态数组的末尾,同时将该元素的哈希值与映射表长度进行取余运算,所得的余值作为该元素对应映射表入口的索引值,若当前入口未被占用,则将该元素在动态数组中的位置索引写入与该元素的索引值对应的映射表入口中,若当前入口已被占用,则将与该元素的索引值对应的映射表入口中的值写入该元素的下标,并且将该元素在动态数组中的位置索引写入该元素的索引值所对应的映射表入口中。通过下标高效地解决了哈希值冲突的问题,且实现方式比较简单,省去了使用链表中的烦琐操作,有效地提高了数据操作效率。
参照图3所示查询动态数组中的元素时的流程示意图,当向动态数组查询元素时,将该元素的哈希值与映射表长度取余,所得的余值作为该元素对应映射表入口的索引值,根据该索引值获取与该索引值对应的存储在映射表入口中的位置索引,根据此位置索引定位动态数组中的元素,将该定位出的元素与所查询的元素进行对比,若相同,则结束查询,否则,根据该定位出的元素的下标定位下一个存储在动态数组中的元素,直至找到所查询的元素或所定位的元素的下标为空时,结束查询。
删除动态数组中的元素时,首先根据图3所示的流程图中的查询方法,查找出所要删除的元素在动态数组中的位置,之后,判断所查询到的元素是否为在动态数组中查找到的第一个元素,若该元素在动态数组中的位置索引与映射表入口中存储的位置索引相同,则表明该元素为第一个元素,此时,若该元素的下标为空,则将对应的映射表入口中的值清零,若该元素的下标不为空,则将对应的映射表入口中的值更改为该元素的下标值,若所查询到的元素不是第一个元素,则将上一个查询到的元素的下标赋值为该元素的下标。删除只需要通过下标改变映射表与动态数组的映射关系即可,实现比较简单,省去了以链表方法实现时的遍历与查询,节省时间,提高了效率。
参照图4所示,图中所示,映射表长度为5,依次向动态数组中添加元素5、3、4、1。当添加5时,通过5与映射表长度5取余得到0,则映射表第0个入口是数据5的入口,这时第0个入口未被占用,则将数据5添加到动态数组中,此时在数组中的位置索引为0,将此位置索引存入映射表第0个入口,完成添加操作。当添加第二个数据3时,通过3与映射表长度5取余得到3,则映射表第3个入口是数据3的入口,数据3加入动态数组后的位置索引为1,将此位置索引存入第3个入口,则完成添加操作。再次添加4和1数据之后的,映射表和动态数组的内部结构如图4所示。
在图4的基础上,当继续添加数据9时,通过9与映射表长度5取余得到4,即映射表第4个入口,此时第4个入口已被占用,存放着动态数组第2个位置索引。此时将数据9添加到动态数组之后,将其下标设置为第4个入口所存储的位置索引2,再将第4个入口更改为当前数据9的位置索引,完成添加操作。当再次添加数据7和14之后的结构如图5所示。
在图5的基础上,当需要删除数据14时,通过14与映射表长度5取余得到4,并通过第4个入口得到数据14的位置索引6,由于动态数组的第6个元素存在下标4,则将映射表第4个入口设置为此下标4,则当前映射表第4个入口指向了动态数组的第4个位置索引。当删除数据1时,通过数据1与映射表长度5取余得到1,映射表第1个入口指向了动态数组第3个元素,由于第3个元素没有下标,则直接将入口清空,完成删除操作,删除后映射表和动态数组的内部结构如图6所示。
本发明提供了一种通过新型哈希值表实现数据快速检索的系统,包括:
构造模块,用于构造映射表和动态数组,动态数组中的每个元素包括数据本身和下标,映射表为具有固定长度的数组,其每个入口用于存储元素在动态数组中的位置索引;
检索模块,用于通过下标在映射表入口与动态数组的元素之间构造映射关系,完成向动态数组中添加、查询和删除元素。
所述检索模块包括:
添加单元,用于当向动态数组中添加元素时,将该元素添加至动态数组的末尾,同时将该元素的哈希值与映射表长度进行取余运算,所得的余值作为该元素对应映射表入口的索引值,若当前入口未被占用,则将该元素在动态数组中的位置索引写入与该元素的索引值对应的映射表入口中,若当前入口已被占用,则将与该元素的索引值对应的映射表入口中的值写入该元素的下标,并且将该元素在动态数组中的位置索引写入该元素的索引值所对应的映射表入口中。
所述检索模块还包括:
查询单元,用于当向动态数组查询元素时,将该元素的哈希值与映射表长度取余,所得的余值作为该元素对应映射表入口的索引值,根据该索引值获取与该索引值对应的存储在映射表入口中的位置索引,根据此位置索引定位动态数组中的元素,将该定位出的元素与所查询的元素进行对比,若相同,则结束查询,否则,根据该定位出的元素的下标定位下一个存储在动态数组中的元素,直至找到所查询的元素或所定位的元素的下标为空时,结束查询。
所述检索模块还包括:
删除模块,用于根据查询单元定位所要删除的元素在动态数组中的位置,之后,判断所查询到的元素是否为在动态数组中查找到的第一个元素,若该元素在动态数组中的位置索引与映射表入口中存储的位置索引相同,则表明该元素为第一个元素,此时,若该元素的下标为空,则将对应的映射表入口中的值清零,若该元素的下标不为空,则将对应的映射表入口中的值更改为该元素的下标值,若所查询到的元素不是第一个元素,则将上一个查询到的元素的下标赋值为该元素的下标。
所述系统所采用的方法与以上方法中所述步骤相同,具体参见以上方法中所述内容。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。