字符串与识别符双向映射的查询方法和系统与流程

文档序号:18642810发布日期:2019-09-11 23:44阅读:218来源:国知局
字符串与识别符双向映射的查询方法和系统与流程

本发明涉及数据结构领域,具体地,涉及一种字符串与识别符双向映射的查询方法和系统。



背景技术:

在如今这个高速发展的信息时代中,通常情况下,软件使用内存来对数据进行存储,相比于使用磁盘来储存数据,使用内存的方式能够提供更快的读写速度,满足用户在性能上的需求。

字典树(trie),又称单词查找树、前缀树,是一种树形结构,用于保存键与值之间的映射关系,其中的键通常为字符串(但不仅限于字符串)。与二叉查找树不同,键不直接保存在树的节点中,而是由该节点的所有祖先与他本身所决定的。字典树的优点是:利用只储存一次键的公共前缀的特点能够有效地节约存储空间;在一些与前缀有关的搜索中,字典树在查询性能上也是非常高效的数据结构。

爆炸式字典树(bursttrie),为字典树的改进版本,与字典树不同之处在于,为了解决字典树中的大量指针寻址、字符比较的问题,爆炸式字典树中的每一个叶子节点都是一个哈希结构的容器(container),该叶子结点的每个祖先(中间节点)包含叶子节点中字符串的公共前缀的某个字符。爆炸式字典树在初始化时采用一个叶子结点即一个哈希结构的容器存储所有键值对,当该容器中键值对的数量超过某个阈值后,将该叶子结点通过提取公共前缀字符的方式分裂成若干个包含公共前缀字符的中间节点和属于该中间节点的若干个叶子结点,而每个叶子节点能够在本身键值对数量再次超过阈值后,重复地执行该分裂操作。例如,利用爆炸式字典树,我们可以通过这样的方式将键值对check=12、change=18、friend=20存储在爆炸式字典树中:根节点包含空字符,并有两个子节点分别包含字符f和c,包含f字符的节点有一个叶子节点储存riend=20的映射;包含c的节点有一个包含字符h的子节点,包含字符h的节点有一个叶子节点储存eck=12与ange=18。利用该数据结构,将储存在叶子节点中各字符串的后缀连接上祖先节点所代表的字符即能获取完整的字符串键。

通常情况下,为了加快在图数据上的查询性能和优化图数据的存储空间,会在读取原始图数据(通常为字符串类型)之后,使用两个数据结构,一个数据结构将图数据中的字符串的键映射成数字类型的值,用于通过键(字符串)查询值(数字类型识别符)的功能,即正向查询;另一个数据结构储存识别符到字符串的映射,用于通过值(数字类型识别符)查询键(字符串)的功能,即反向查询功能。通过这两个数据结构提供的双向查询功能,原始的图数据能够通过数字类型识别符进行存储从而减少内存空间的使用,称为图数据的预处理。预处理的作用一方面能够将后续查询操作中的字符串比较转换为数字类型识别符的比较,在图上执行查询操作前首先将查询语句中的字符串通过查询储存字符串到数字类型识别符的映射的数据结构,从而获得其数字类型识别符的值,使用该数字类型识别符进行图查询的匹配后,最后再将符合查询要求的数字类型识别符的结果转换成字符串结果返回给用户;另一方面,将原始图数据转化为数字类型识别符存储能够有效的减少原始图数据存储所需的内存空间。

对于正向查询的存储来说,使用基于字典树的方式来储存字符串作为键、数字类型识别符作为值用于正向查询的方式由于其对相同的字符串前缀只储存一次的特性能够有效的减少内存的使用,在某些内存紧张的场景下相比于以哈希表进行存储的方式能够读取更大的数据集。且通常情况下正向查询与反向查询都处于程序的非关键执行路径(non-criticalpath)中,因此使用字典树对字符串到数字类型识别符的映射进行存储不失为一种好的方式。

对于反向查询的存储来说,重新使用另一个数据结构如哈希表对数字类型识别符的键到字符串类型的值的映射关系进行存储必然会对字符串进行二次存储,因此如何针对字典树储存数据的特征,有效的利用已储存到字典树中的键值对数据,在不引入过多的内存占用的前提下,提供用户键值对的高效双向查询,已成为图查询领域技术人员亟需解决的技术难题。

与本申请相关的现有技术是专利文献cn106156103a,公开了一种搜索处理方法及装置,所述方法包括,根据接收的检索字符串,生成若干与所述检索字符串具有预定编辑距离的备选字符串;分别利用备选词库的字典树查找所述备选字符串;如果查找到所述备选字符串,则作为推荐检索字符串提供给用户。根据预设的编辑距离生成数量可控的备选字符串,因此算法计算量较为恒定,不会随备选词库的字符串数量的增加而增长;并且生成的备选字符串无需与备选词库中的字符串逐一计算编辑距离,而是利用搜索速度较快的字典树对备选字符串进行进一步筛选后获得推荐检索字符串,提高了检索处理速度。



技术实现要素:

针对现有技术中的缺陷,本发明的目的是提供一种字符串与识别符双向映射的查询方法和系统。

根据本发明提供的一种字符串与识别符双向映射的查询方法,包括以下步骤:

构造映射步骤:构造字典树,同时在数据结构哈希表中建立映射关系,所述映射关系反映数字类型的识别符与字符串在字典树中位置信息的一一对应关系;

分类查询步骤:接收查询请求,判定查询请求的类型,若所述类型是正向查询请求,则执行正向查询,若所述类型是反向查询请求,则执行反向查询。

优选地,所述正向查询是使用传统字典树查询的方式执行,得到正向查询结果返回给用户,结束本次查询,所述反向查询是根据识别符对对应的字符串进行查询。

优选地,所述分类查询步骤包括:

反向查询步骤:判定查询请求的类型是反向查询,则从哈希表中获取查询请求的识别符对应的字符串在字典树中的位置信息,若查询不存在位置信息,则返回空字符串作为查询结果,并提示查询失败,结束本次查询;若查询存在位置信息,则记录位置信息;

前后缀查询步骤:根据位置信息分别获取字符串的后缀、前缀,得到前缀字符串、后缀字符串,将前缀字符串拼接上后缀字符串后,作为反向查询的查询结果返回给用户,结束本次查询。

优选地,所述位置信息包括字符串所在字典树中的叶子节点地址、用于定位该叶子节点中后缀字符串的定位信息,利用所述定位信息能够获取存储在叶子节点中字符串的后缀字符串。

优选地,所述前后缀查询步骤包括:

初始步骤:将当前节点的值设为位置信息中目标的叶子节点地址,并将当前前缀的值设为空;

查询步骤:判断当前节点是否存在非根父节点,若存在,则将父节点所包含的字符拼接到当前前缀的头部,将当前节点的值更新为当前节点的父节点。

优选地,所述传统字典树查询是通过从字典树的根节点往叶子结点方向遍历的方式查询符合传入的字符串参数所对应的识别符的值,即字典树普遍使用的查询方式。

根据本发明提供的一种字符串与识别符双向映射的查询系统,包括以下模块:

构造映射模块:构造字典树,同时在数据结构哈希表中建立映射关系,所述映射关系反映数字类型的识别符与字符串在字典树中位置信息的一一对应关系;

分类查询模块:接收查询请求,判定查询请求的类型,若所述类型是正向查询请求,则执行正向查询,若所述类型是反向查询请求,则执行反向查询。

优选地,所述分类查询模块包括:

反向查询模块:判定查询请求的类型是反向查询,则从哈希表中获取查询请求的识别符对应的字符串在字典树中的位置信息,若查询不存在位置信息,则返回空字符串作为查询结果,并提示查询失败,结束本次查询;若查询存在位置信息,则记录位置信息;

前后缀查询模块:根据位置信息分别获取字符串的后缀、前缀,得到前缀字符串、后缀字符串,将前缀字符串拼接上后缀字符串后,作为反向查询的查询结果返回给用户,结束本次查询。

优选地,所述前后缀查询步骤包括:

初始步骤:将当前节点的值设为位置信息中目标的叶子节点地址,并将当前前缀的值设为空;

查询步骤:判断当前节点是否存在非根父节点,若存在,则将父节点所包含的字符拼接到当前前缀的头部,将当前节点的值更新为当前节点的父节点。

与现有技术相比,本发明具有如下的有益效果:

1、该方法能在保证双向查询功能的情况下,有效降低图数据的预处理所需内存使用,有利于程序在内存紧张的场景下,能够允许程序读取更大的图数据集。

2、该查询功能不处于程序的关键执行路径中,因此使用该方法不会降低程序执行关键路径的性能。

3、键值对中的字符串部分不需要被重复存储,采用存储位置信息的方式代替重复存储原始字符串的传统方式,大大降低了内存开销,从而降低运行程序的内存门槛。

附图说明

通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1为字符串与识别符双向映射的存储结构和查询方法的流程图;

图2为实施例的字典树与哈希表的图形化表示图。

具体实施方式

下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。

针对现有技术中的缺陷,本发明的目的是提供一种字符串与识别符双向映射的存储结构和查询方法,其充分利用到已储存于字典树中的字符串信息,在保证较好的反向查询性能的同时,降低对内存的需求。

根据本发明提供的一种字符串与识别符双向映射的查询方法,包括以下步骤:

构造映射步骤:构造字典树,同时在数据结构哈希表中建立映射关系,所述映射关系反映数字类型的识别符与字符串在字典树中位置信息的一一对应关系;

分类查询步骤:接收查询请求,判定查询请求的类型,若所述类型是正向查询请求,则执行正向查询,若所述类型是反向查询请求,则执行反向查询。

具体地,所述正向查询是使用传统字典树查询的方式执行,得到正向查询结果返回给用户,结束本次查询,所述反向查询是根据识别符对对应的字符串进行查询。

具体地,所述分类查询步骤包括:

反向查询步骤:判定查询请求的类型是反向查询,则从哈希表中获取查询请求的识别符对应的字符串在字典树中的位置信息,若查询不存在位置信息,则返回空字符串作为查询结果,并提示查询失败,结束本次查询;若查询存在位置信息,则记录位置信息;

前后缀查询步骤:根据位置信息分别获取字符串的后缀、前缀,得到前缀字符串、后缀字符串,将前缀字符串拼接上后缀字符串后,作为反向查询的查询结果返回给用户,结束本次查询。

具体地,所述位置信息包括字符串所在字典树中的叶子节点地址、用于定位该叶子节点中后缀字符串的定位信息,利用所述定位信息能够获取存储在叶子节点中字符串的后缀字符串。

具体地,所述前后缀查询步骤包括:

初始步骤:将当前节点的值设为位置信息中目标的叶子节点地址,并将当前前缀的值设为空;

查询步骤:判断当前节点是否存在非根父节点,若存在,则将父节点所包含的字符拼接到当前前缀的头部,将当前节点的值更新为当前节点的父节点。

具体地,所述传统字典树查询是通过从字典树的根节点往叶子结点方向遍历的方式查询符合传入的字符串参数所对应的识别符的值,即字典树普遍使用的查询方式。

根据本发明提供的一种字符串与识别符双向映射的查询系统,包括以下模块:

构造映射模块:构造字典树,同时在数据结构哈希表中建立映射关系,所述映射关系反映数字类型的识别符与字符串在字典树中位置信息的一一对应关系;

分类查询模块:接收查询请求,判定查询请求的类型,若所述类型是正向查询请求,则执行正向查询,若所述类型是反向查询请求,则执行反向查询。

具体地,所述分类查询模块包括:

反向查询模块:判定查询请求的类型是反向查询,则从哈希表中获取查询请求的识别符对应的字符串在字典树中的位置信息,若查询不存在位置信息,则返回空字符串作为查询结果,并提示查询失败,结束本次查询;若查询存在位置信息,则记录位置信息;

前后缀查询模块:根据位置信息分别获取字符串的后缀、前缀,得到前缀字符串、后缀字符串,将前缀字符串拼接上后缀字符串后,作为反向查询的查询结果返回给用户,结束本次查询。

具体地,所述前后缀查询步骤包括:

初始步骤:将当前节点的值设为位置信息中目标的叶子节点地址,并将当前前缀的值设为空;

查询步骤:判断当前节点是否存在非根父节点,若存在,则将父节点所包含的字符拼接到当前前缀的头部,将当前节点的值更新为当前节点的父节点。

本发明提供的字符串与识别符双向映射的查询系统,可以通过字符串与识别符双向映射的查询方法的步骤流程实现。本领域技术人员可以将字符串与识别符双向映射的查询方法理解为所述字符串与识别符双向映射的查询系统的优选例。

本发明构造字典树建立数字类型识别符与字符串名称储存于字典树中的位置信息的一一映射关系;判断接收到的查询请求为正向查询请求或者反向查询请求;若为正向查询请求,通过传统字典树查询方式进行查询,并将识别符查询结果返回给用户;若为反向查询请求,查询该识别符所对应的字符串名称被储存在字典树中的位置信息;根据位置信息从字典树中还原完整的字符串信息,将完整字符串查询结果返回给用户。通过储存字符串位置信息的方式,能够在增加较少的内存的情况下,提供原有的字典树数据结构字符串与识别符双向映射的查询功能,反之,不需要使用重新存储识别符、字符串键值对的方式提供反向查询功能,能够在保证一定反向查询的性能的前提下,减少内存的开销。

在具体实施中,本发明主要包括如下步骤:

步骤1,在构造字典树的同时,在数据结构哈希表中建立数字类型的识别符与字符串在字典树中的位置信息的一一映射关系,然后进入步骤2继续执行。在构造的字典树中,键为字符串类型的名称,值为数字类型的识别符

步骤2,程序接收到查询请求,若查询请求为正向查询请求,则进入步骤8继续执行;若查询请求为反向查询请求,则进入步骤3继续执行。其中正向查询请求是指通过字符串查询对应识别符,反向查询请求是指通过识别符查询对应字符串

步骤3,程序从哈希表中获取查询请求的识别符对应的字符串在字典树中的位置信息:用户查询哈希表中是否存在该识别符对应的字符串在字典树中的位置信息,若存在,则进入步骤5继续执行;若不存在,则进入步骤4继续执行。

步骤4,返回一个空的字符串作为查询失败的结果,结束本次查询。

步骤5,通过位置信息获取字符串的后缀,进入步骤6继续执行。

步骤6,通过位置信息获取字符串的前缀,进入步骤7继续执行。

步骤7,将前缀字符串拼接上后缀字符串作为返回值返回给用户,结束本次查询。

步骤8,使用传统字典树查询方式执行正向查询,将正向查询结果返回给用户,结束本次查询。

具体地,所述步骤1包括:在数据结构哈希表中建立数字类型的识别符与字符串类型的名称在字典树的位置信息的一一映射关系,所述位置信息包括该字符串所在字典树中的叶子节点地址、用于定位该叶子结点中字符串后缀的定位信息。该位置信息将在后续的步骤中用于构建完整的字符串信息。其中,所述字符串后缀的定位信息可以根据该叶子节点所使用的数据结构有所不同,只需满足:利用该定位信息能够获取储存在当前叶子结点中字符串的后缀即可。

具体地,所述步骤2包括:查询请求为正向查询请求,具体为:程序接收到含有一个字符串类型的参数的请求,请求返回与该字符串对应的识别符,其中,所述正向查询,是指:假设我们有字符串到识别符的映射关系,根据字符串对对应的识别符进行查询;查询请求为反向查询请求,具体为:程序接收到含有一个数字类型的识别符参数的请求,请求返回与该数字类型的识别符对应的字符串,其中,所述反向查询,是指:假设我们有字符串到识别符的映射关系,根据识别符对对应的字符串进行查询。

具体地,所述步骤5包括:通过位置信息获取字符串的后缀,具体为:利用位置信息中的叶子结点地址信息定位到储存了该字符串后缀的叶子结点,并通过位置信息中该字符串后缀的定位信息获取该字符串储存在叶子节点中的后缀。

具体地,所述步骤6包括:

步骤6.1:将当前节点的值设为位置信息中目标的叶子结点地址,并将当前前缀的值设为空。

步骤6.2:判断当前节点是否存在非根父节点,若存在,则进入步骤6.3继续执行;若不存在,则进入步骤7继续执行。

步骤6.3:将父节点所包含的字符拼接到当前前缀的头部,并将当前节点的值更新为当前节点的父节点,然后执行步骤6.2。

具体地,所述步骤8包括:使用传统字典树查询方式执行正向查询,所述的传统字典树查询方式,是指:通过从字典树的根节点往叶子结点方向遍历的方式查询符合传入的字符串参数所对应的识别符的值,即字典树普遍使用的查询方式。

如图1所示,为本发明如何复用字典树中的字符串数据,从而以少量内存实现字符串与识别符双向映射的存储结构和查询方法的具体流程。实施例中,将以键的类型为字符串类型string、识别符值的类型为数字类型int的爆炸式字典树(bursttrie)为例(爆炸式字典树中已存储了3对键值对,分别为:check=12、change=18、friend=20),如图2所示,以下将分为正向查询与反向查询对如何实现字符串与识别符双向映射的存储结构和查询方法进行详细描述:

正向查询(查询字符串check所对应的识别符):在本实施例中,步骤1在初始化中所建立的数据结构爆炸式字典树、哈希表如图2所示,哈希表中由识别符作为键,对应的字符串的位置信息(由字符串储存在字典树中的叶子结点地址和叶子结点中该字符串后缀的索引编号组成)作为值,完成初始化后执行步骤2。步骤2中接收到的正向查询请求所查询的是字符串check所对应的识别符,进入步骤8。步骤8中,使用字典树普遍使用的查询方法,首先从字典树的根节点的子节点中查找到符合的第一个字符c的中间节点0x3,继续从该中间节点0x3中查找到符合的第二个字符h的中间节点0x2,且该子节点0x2包含一个叶子节点0x1,从该叶子结点中所储存的哈希结构中查找到剩余字符串eck对应的识别符为12,并将该识别符12返回给用户。

反向查询(查询识别符18所对应的字符串):在本实施例中,步骤1在初始化中所建立的数据结构爆炸式字典树、哈希表如图2所示,哈希表中由识别符作为键,对应的字符串的位置信息(由字符串储存在字典树中的叶子结点地址和叶子结点中该字符串后缀在哈希结构中的索引编号组成)作为值,完成初始化后执行步骤2。步骤2中接收到的反向查询请求所查询的是识别符18所对应的完整字符串,进入步骤3。步骤3中,如图2所示,哈希表表格中存在识别符为18的对应字符串的位置信息(叶子节点地址为0x1,索引编号为1),获取到该位置信息后进入步骤5继续执行。步骤5中,程序由位置信息中的叶子节点地址将存储目标字符串后缀的叶子结点定位于字典树的0x1叶子节点上,并通过索引编号1获取0x1叶子节点中目标字符串的后缀为ange,进入步骤6继续执行。步骤6中,首先将当前节点的值设为位置信息中的叶子结点地址0x1,当当前节点的值为0x1时,当前节点存在包含字符h的非根父节点0x2,将前缀的值更新为父节点所包含的字符h,并将当前节点的值更新为非根父节点地址0x2,继续执行步骤6.2。当当前节点的值为0x2时,当前节点存在包含字符c的非根父节点0x3,将前缀的值h拼接上父节点所包含的字符c,即将前缀的值更新为ch,并将当前节点的值更新为非根父节点地址0x3,继续执行步骤6.2。当当前节点的值为0x3时,由于当前节点不存在非根父节点,则进入步骤7继续执行。步骤7中,程序将前缀ch与后缀ange拼接为结果change返回给用户,并结束本次查询。

综上所述,本发明通过储存字符串位置信息的方式,能够在增加较少的内存的情况下,提供原有的字典树数据结构字符串与识别符双向映射的查询功能,反之,不需要使用重新存储识别符、字符串键值对的方式提供反向查询功能,能够在保证一定反向查询的性能的前提下,减少内存的开销。

本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。

以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。

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