CN107862026A - 数据存储方法及装置、数据查询方法及装置、电子设备 - Google Patents
数据存储方法及装置、数据查询方法及装置、电子设备 Download PDFInfo
- Publication number
- CN107862026A CN107862026A CN201711053709.8A CN201711053709A CN107862026A CN 107862026 A CN107862026 A CN 107862026A CN 201711053709 A CN201711053709 A CN 201711053709A CN 107862026 A CN107862026 A CN 107862026A
- Authority
- CN
- China
- Prior art keywords
- node
- bit
- character
- child node
- storage organization
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9027—Trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开实施例公开了数据存储方法及装置、数据查询方法及装置、电子设备。所述数据存储方法包括:获取待存储数据;根据待存储数据构建并存储字典树;其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符。本公开实施例在不增加字典树节点内存消耗与字典树查找时间复杂度的前提下,有效降低了维护子节点的内存冗余,提高了数据匹配速度。
Description
技术领域
本公开涉及计算机技术领域,具体涉及一种数据存储方法及装置、数据查询方法及装置、电子设备及计算机可读存储介质。
背景技术
Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。与二叉查找树不同,Trie树的键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
事先将已知的一些字符串的有关信息保存到字典树树里,查找另外一些未知字符串是否出现过或者出现频率。例如,数据查询系统中,将查询关键词集合中的所有关键词构建成一个字典树,并将该构建成的字典树按照预设结构存储起来;在用户查询时,通过匹配用户输入的查询词与字典树存储结构里的内容确定用户当前要查询的关键词,进而为用户输出关键词相关的结果。例如,如图1所示的字典树结构中,从字典树根节点开始,参考用户的部分输入,寻找查找路径。部分输入完成匹配后,从当时的节点向下深度优先遍历,即可获取部分输入对应的完整字符串。对于数字字典树和字符字典树来说,每个节点的字符可以是0-9这10个数字和a-z这26个字母。例如用户输入的字符串为“mo”,在图1所示的字典树中最左侧第三层节点“o”处完成上述字符串“mo”的匹配,深度优先遍历该第三层节点“o”下的子节点,可以获取字符串“mop”和“moth”两个完整字符串,作为用户待查询的关键词。如果输入字符串为“moa”,则无匹路径,不能获取任何数据。字典树中,每个节点维护了自己的子节点。当前节点可以根据字符获取对应的子节点。例如图1中最左侧第三层节点“o”,维护了标记为“p”和“t”的两个子节点。
发明内容
本公开实施例提供一种数据存储方法及装置、数据查询方法及装置、电子设备及计算机可读存储介质。
第一方面,本公开实施例中提供了一种数据存储方法。
具体的,所述数据存储方法,包括:
获取待存储数据;
根据待存储数据构建并存储字典树;
其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符。
结合第一方面,本公开在第一方面的第一种实现方式中,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述待存储数据由所述预设字符集中的字符构成。
结合第一方面的第一种实现方式,本公开在第一方面的第二种实现方式中,所述比特映射结构中与所述子节点的字符对应的比特位的值为M,其他比特位的值为N,N和M不同,且N和M的取值范围为0或1。
结合第一方面的第一种实现方式,本公开在第一方面的第三种实现方式中,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。
第二方面,本公开实施例中提供了一种数据查询方法。
具体的,所述数据查询方法,包括:
获取字典树的当前节点的存储结构;所述字典树由预设词组集合构建而成,所述当前节点的存储结构包括当前节点对应的字符、比特映射结构和单链表;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符;
利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配;
在匹配成功后,利用当前节点的存储结构获取匹配成功的子节点的存储结构,并与待查询数据的下一字符进行匹配,直至完成待查询数据的匹配。
结合第二方面,本公开在第二方面的第一种实现方式中,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述预设词组集合中的词组由所述预设字符集中的字符构成。
结合第二方面的第一种实现方式中,本公开在第二方面的第二种实现方式中,利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配,包括:
根据所述比特映射结构中值为M的比特位确定所述当前节点是否存在与所述待查询数据的当前字符相匹配的子节点,其中M为0或1。
结合第二方面的第一种实现方式中,本公开在第二方面的第三种实现方式中,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。
结合第二方面的第一种实现方式中,本公开在第二方面的第四种实现方式中,利用当前节点的存储结构获取匹配成功的子节点的存储结构,包括:
根据所述比特映射结构确定与匹配成功的子节点对应的所述单链表的结点;
从匹配成功的所述子节点对应的所述单链表的结点获取匹配成功的所述子节点的存储结构的存储地址。
第三方面,本公开实施例提供了一种数据存储装置,包括:
第一获取模块,被配置为获取待存储数据;
存储模块,被配置为根据待存储数据构建并存储字典树;
其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符。
结合第三方面,本公开在第三方面的第一种实现方式中,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述待存储数据由所述预设字符集中的字符构成。
结合第三方面的第一种实现方式,本公开在第三方面的第二种实现方式中,所述比特映射结构中与所述子节点的字符对应的比特位的值为M,其他比特位的值为N,N和M不同,且N和M的取值范围为0或1。
结合第三方面的第一种实现方式,本公开在第三方面的第三种实现方式中,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。
所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。
在一个可能的设计中,数据存储装置的结构中包括存储器和处理器,所述存储器用于存储一条或多条支持数据存储装置执行上述第一方面中数据存储方法的计算机指令,所述处理器被配置为用于执行所述存储器中存储的计算机指令。所述数据存储装置还可以包括通信接口,用于数据存储装置与其他设备或通信网络通信。
第四方面,本公开实施例中提供了一种数据查询装置,包括:
第二获取模块,被配置为获取字典树的当前节点的存储结构;所述字典树由预设词组集合构建而成,所述当前节点的存储结构包括当前节点对应的字符、比特映射结构和单链表;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符;
匹配模块,被配置为利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配;
第三获取模块,被配置为在匹配成功后,利用当前节点的存储结构获取匹配成功的子节点的存储结构,并与待查询数据的下一字符进行匹配,直至完成待查询数据的匹配。
结合第四方面,本公开在第四方面的第一种实现方式中,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述预设词组集合中的词组由所述预设字符集中的字符构成。
结合第四方面的第一种实现方式中,本公开在第四方面的第二种实现方式中,所述匹配模块包括:
第一确定子模块,被配置为根据所述比特映射结构中值为M的比特位确定所述当前节点是否存在与所述待查询数据的当前字符相匹配的子节点,其中M为0或1。
结合第四方面的第一种实现方式中,本公开在第四方面的第三种实现方式中,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。
结合第四方面的第一种实现方式中,本公开在第四方面的第四种实现方式中,第三获取模块包括:
第二确定子模块,被配置为根据所述比特映射结构确定与匹配成功的子节点对应的所述单链表的结点;
获取子模块,被配置为从匹配成功的所述子节点对应的所述单链表的结点获取匹配成功的所述子节点的存储结构的存储地址。
所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。
在一个可能的设计中,数据查询装置的结构中包括存储器和处理器,所述存储器用于存储一条或多条支持数据查询装置执行上述第一方面中数据查询方法的计算机指令,所述处理器被配置为用于执行所述存储器中存储的计算机指令。所述数据查询装置还可以包括通信接口,用于数据查询装置与其他设备或通信网络通信。
第五方面,本公开实施例提供了一种电子设备,包括存储器和处理器;其中,所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现第一方面所述的方法步骤。
第六方面,本公开实施例提供了一种电子设备,包括存储器和处理器;其中,所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现第二方面所述的方法步骤。
第七方面,本公开实施例提供了一种计算机可读存储介质,用于存储数据存储装置所用的计算机指令,其包含用于执行上述第一方面中数据存储方法所涉及的计算机指令。
第八方面,本公开实施例提供了一种计算机可读存储介质,用于存储数据查询装置所用的计算机指令,其包含用于执行上述第二方面中数据查询方法所涉及的计算机指令。
本公开实施例提供的技术方案可以包括以下有益效果:
通过本实施例的这种数据存储和查询方法,可以将待存储数据或者预设词组集合以字典树的形式进行存储,而且字典树的存储结构采用了上述比特映射结构和单链表相结合的方式,使得在保存字典树节点时,仅仅增加了一个单链表的指针,使得存储数据时节省了存储空间,查询数据时缩短了查询时间。采用本公开实施例中的比特映射结合单链表结构替换已有技术中STL的map结构后,没有增加字典树节点的内存占用,没有增加查询的时间复杂度,同时将节点维护子节点时所需要的内存冗余降低到原来的1/6。可见,本公开实施例通过比特映射结构,合理的利用了比特位的有序特性,完成特定的映射结构。并且比特映射结构与单链表的结合,在不增加字典树节点内存消耗与字典树查找时间复杂度的前提下,有效降低了维护子节点的内存冗余,提高了数据匹配速度。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
结合附图,通过以下非限制性实施方式的详细描述,本公开的其它特征、目的和优点将变得更加明显。在附图中:
图1示出了字典树结构的示意性结构;
图2示出了已有技术中存储字典树结构的STL的容器map结构示意图;
图3示出了已有技术中STL的容器map维护子节点的存储结构示意图;
图4示出根据本公开第一实施方式的数据存储方法的流程图;
图5示出了根据本公开第一实施方式中的数字“0-9”对应的比特映射结构示意图;
图6示出了根据本公开第一实施方式中的字母“a-z”对应的比特映射结构示意图;
图7示出了根据本公开第一实施方式中的单链表的结构示意图;
图8示出了图1所示字典树中节点“o”采用本公开第一实施方式形成的存储结构示意图;
图9示出根据本公开第二实施方式的数据查询方法的流程图;
图10示出根据图9所示实施方式的步骤S903的流程图;
图11示出根据本公开第三实施方式的数据存储装置的结构框图;
图12示出根据本公开第四实施方式的数据查询装置的结构框图;
图13示出根据图12所示实施方式的第三获取模块1203的结构框图;
图14是适于用来实现根据本公开一实施方式的数据存储方法的电子设备的结构示意图。
图15是适于用来实现根据本公开一实施方式的数据查询方法的电子设备的结构示意图。
具体实施方式
下文中,将参考附图详细描述本公开的示例性实施方式,以使本领域技术人员可容易地实现它们。此外,为了清楚起见,在附图中省略了与描述示例性实施方式无关的部分。
在本公开中,应理解,诸如“包括”或“具有”等的术语旨在指示本说明书中所公开的特征、数字、步骤、行为、部件、部分或其组合的存在,并且不欲排除一个或多个其他特征、数字、步骤、行为、部件、部分或其组合存在或被添加的可能性。
另外还需要说明的是,在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本公开。
已有技术中,维护字典树任一节点的子节点有多种方案。例如可以通过哈希表或者STL的容器map来维护节点与子节点之间的关系等。STL的容器map可以便捷高效的维护当前节点的子节点。map是STL的一个关联容器,它提供一对一的数据处理能力。
例如,图1所示的字典树结构中,最左侧第三层节点“o”的维护子节点的结构如图2所示,“子节点map”是STL的容器map结构,用于指向节点“o”的子节点存储结构。而采用STL的容器map结构维护字典树结构时,节点的存储结构如图3所示,即图2中“子节点map”指向图3所示的存储结构。其中,“parent:8字节”是指使用8字节存储该节点的父节点的存储地址,而“color:8字节”是指使用8字节存储该节点的颜色(STL的map容器采用红黑树,每个节点都有自己的颜色),“left:8字节”和“right:8字节”分别指各使用8字节存储左右子节点的存储结构的地址信息,“key_field:8字节”指使用8字节存储当前节点对应的字符“o”,“value_field:8字节”指使用8字节存储key_field对应的实际字典树节点的地址信息;“Vptr:8字节”指使用8字节存储虚函数指针,虚函数指针指向虚函数表,是C++实现多态的基础;而这个结构中最终目标是保存其中的“Value_field”,该值实际仅仅耗费8字节,但是整个节点结构占用的内存达到了是56字节。多余消耗的内存高达48字节,内存冗余过大,达到600%。因此,采用STL的容器map维护字典树节点的子节点会消耗大量的内存,使得数据存储空间较大,且查询速度也会较慢。
图4示出根据本公开第一实施方式的数据存储方法的流程图。如图4所示,所述数据存储方法包括以下步骤S401-S402:
在步骤S401中,获取待存储数据;
在步骤S402中,根据待存储数据构建并存储字典树;
其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点映射存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符以及所述子节点与所述单链表的结点之间的对应关系。
本实施例中,待存储数据可以是多个词组构成的集合,即包括要采用字典树结构存储的多个词组,例如在检索系统中的已有关键词集合。采用字典树结构存储待存储数据的目的可以是为了在使用时,基于用户输入的部分内容与字典树结构进行匹配,进而获得与该部分内容相匹配的所有词组。例如,在外卖点餐系统中,利用商户的名称、菜品名称等构成的词组集合,构建字典树,并采用本公开的存储结构形式进行存储,用户在外卖点餐系统中输入商户名称或菜品的部分内容时,就可以通过该输入的部分内容与字典树中的词组进行匹配,最终获得用户查询的商户或者菜品,如用户在外卖点餐系统的搜索框中输入“KF”,则系统会在输出结果中显示“KFC肯德基”相关的店铺。
字典树包括根节点、中间节点和叶节点。根节点对应的字符为空,中间节点和叶节点对应构建字典树的词组中的字符。从根节点到某一叶节点的路径上的节点对应的字符按顺序形成一个词组。例如,构建字典树的词组是由0-9十个数组和a-z 26个字母构成的,那么根节点的子节点包括36个,分别为0-9、a-z这36个字符对应的子节点,而每个中间节点也最多会有0-9、a-z这36个字符对应的子节点。
本实施例中,在获得待存储数据后,对于待存储数据中的任一词组,其首个字符作为字典树根节点的子节点,而其后续的字符依次作为前一字符的子节点。对于构建成的字典树而言,其存储结构中,每个节点存储有当前节点对应的字符以及子节点的信息,最终得到字典树结构。例如,图1所示的字典树结构就是由词组集合{mop,moth,pop,star,stop,9op}构建而成。
本实施例中,从字典树根节点开始,当前节点的存储结构中存储有当前节点对应的字符,如图1中最左侧路径上第一个中间节点对应的字符为“m”,其是存储数据“mop”的首个字符。当前节点除了存储所对应的字符之外,还存储子节点信息。子节点信息可以包括子节点对应的字符以及子节点的存储结构的地址信息。当然,当前节点为叶节点,即没有子节点时,子节点信息为空。
在本实施例中,当前节点的存储结构以比特映射结构和单链表相结合的方式存储子节点信息。单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。单链表包括多个结点,每个结点包括元素(数据元素的映象)和指向后续结点的指针(即后续结点的元素存储位置)。本实施例中,单链表的结点存储对应子节点的存储结构的地址信息。通过单链表相应结点的元素就能准确获取字典树当前节点的子节点的存储结构。
在本实施例中,比特映射结构包括多个字节,多个字节中的比特位映射存储子节点对应的字符。通过比特映射结构可以确定字典树当前节点的子节点对应的字符,进而在查询匹配时,可以结合比特映射结构和单链表就能确定待匹配字符是否与当前节点的子节点对应的字符相同,并且在相匹配时还可以获取相匹配字节的存储结构。
通过本实施例的这种数据存储方法,可以将待存储数据以字典树的形式进行存储,而且字典树的存储结构采用了上述比特映射结构和单链表相结合的方式,使得在保存字典树节点时,仅仅增加了一个单链表的指针。而在64位机器上,指针占用8字节,保存的字典树节点也是一个指针,单链表的结点指向下一个单链表结点也是通过一个指针,所以内存冗余已有技术中采用STL的map结构存储时的600%降低为100%,大大降低了内存冗余。在64位机器上,默认内存对齐的单位是8字节。采用本公开实施例的这种存储方式,字典树的每个节点的内存占用是16个字节。而图2所示的字典树节点内存占用也是16字节(节点字符采用8字节存储,子节点map采用8字节存储子节点的存储结构)。遍历单链表的时间复杂度是O(N),红黑树的查找时间复杂度是O(logN)。由于字典树节点仅仅维护常数(如36)个字符,所以单链表遍历与红黑树查找的时间复杂度都是常数C。综上所述,采用本公开实施例中的比特映射结合单链表结构替换已有技术中STL的map结构后,没有增加字典树节点的内存占用,没有增加查询的时间复杂度,同时将节点维护子节点时所需要的内存冗余降低到原来的1/6(STL的map结构采用图4所示的存储结构维护子节点,需要56个字节,而本实施例中仅需要)。可见,本公开实施例通过比特映射结构,合理的利用了比特位的有序特性,完成特定的映射结构。并且比特映射结构与单链表的结合,在不增加字典树节点内存消耗与字典树查找时间复杂度的前提下,有效降低了维护子节点的内存冗余。
在本实施例的一个可选实现方式中,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述待存储数据由所述预设字符集中的字符构成。该可选的实现方式中,待存储数据可以是字符串构成词组,如英文单词、中文拼音或其他由数字和字母构成的词组等,当然待存储数据还可以由其他特殊字符构成,如中文文字、日文文字、韩文文字、希腊字母等等。预设字符集合包括构成待存储数据的所有字符,如0-9和a-z构成的字符集合。比特映射结构采用多个字节,将比特位与预设字符集合中的每个字符对应起来,比特位的数量大于或等于预设字符集合中的字符数量,由于机器存储时,需要字节对齐,因此比特映射结构通常以字节为单位,而预设字符集合中的字符数量不是一个字节的比特数量即8的整数倍时,比特映射结构中多于预设字符集合中的字符数量的比特位始终为空,不存储数据。例如,预设字符集合包括0-9和a-z这36个字符时,可以分别为0-9和a-z建立比特映射结构,0-9对应两个字节的第一比特映射结构,而a-z对应4个字节的比特映射结构,第一比特映射结构中从第1个比特位至第10个比特位,分别对应0-9这10个字符,其余6个比特位始终为空;而第二比特映射结构中从第1个至第26个比特位,分别对应a-z这26个字符,其余6个比特位始终为空。通过这种方式,可以采用比特映射结构映射存储当前节点对应子节点的字符,并且还可以通过比特映射结构确定子节点的数量。
在本实施例的一个可选实现方式中,所述比特映射结构中与所述子节点的字符对应的比特位的值为M,其他比特位的值为N,N和M不同,且N和M的取值范围为0或1。在计算机中比特位取值范围是0或1,那么采用比特映射结构存储子节点对应的字符时,由于比特位与字符之间是一一对应的关系,因此可以将子节点的字符对应的比特位置为1(或0),而其他比特位置为0(或1),就可以从比特映射结构中确定当前节点的子节点对应的字符是什么以及子节点的个数是多少。
下面通过具体实例说明比特映射结构。
在C++变量中,每个变量是由若干个字节组成,每个字节包含8个比特位(bit),每个bit可以取0或者1。例如整型int是由4个字节,32个比特位构成,短整型short是由2个字节,16个比特位构成。
字典树节点可以用于保存0-9这10个数字字符和a-z这26个字母字符,所以字典树一共可以保存的字符为36个。
因此,可以用一个短整型的10个比特位表示10个数字对应的映射是否存在。例如,当前节点包括两个子节点,而两个子节点对应的字符分别为“4”和“6”时,比特映射结构如图5所示。图5中,上一行为比特位的值,下一行为比特位的序号,第0个比特位至第9个比特位分别对应字符“0-9”,而字符“4”和“6”对应的比特位的值为1,其他比特位的值为0,因此图5所示的比特映射结构表示“4”和“6”这两个数字字符对应的映射存在,其余映射不存在。
同理,可以用整型即4个字节的26个比特位表示26个字母对应的映射是否存在,例如,当前节点包括四个子节点,分别对应字符“e、g、u、w”,比特映射结构如图6所示。与图5类似,图6中上一行表示比特位的值,下一行为比特位的序号,第0个比特位至第25个比特位分别对应字符“a-z”,而字符“e”、“g”、“u”和“w”对应的比特位的值为1,其他比特位的值为0,因此图6所示的比特映射结构表示“e”、“g”、“u”和“w”这四个字符对应的映射存在,其余映射不存在。
当然,在其他实施例中,也可以将存在映射的比特位置为0,而其余比特位置为1,具体根据实际情况设置,在此不做限定。
在本实施例的一个可选实现方式中,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。为了维护当前节点的子节点信息,本实施例中采用单链表存储子节点的存储结构的地址信息。单链表可以包括一个或多个结点,每个结点对应存储当前节点的一个子节点的存储结构的地址信息。单链表的多个结点是有顺序关系的,前一结点保存有指向后一结点的指针,且单链表的结点的顺序与字典树当前节点各个子节点对应的字符在比特映射结构中对应比特位的顺序相同。例如,字典树的当前节点有三个子节点,且第一个子节点、第二个子节点和第三个子节点对应的字符分别在比特映射结构中对应的比特位为第1、3、4个字节,则第一个子节点对应单链表的第一个结点,第二个子节点对应单链表的第二个结点,第三个子节点对应单链表的第三个结点。因此,通过这种方式,可以基于比特映射结构和单链表维护子节点的地址信息,能够减少维护子节点的内存消耗。
下面通过具体实例说明单链表结构。
对于图5和6所示的比特映射表,假如图5和图6对应的比特映射表为同一节点的比特映射表,则其对应的单链表如图7所示。从图7可以看出,单链表包括6个结点,分别对应子节点“4”、“6”、“e”、“g”、“u”和“w”。每个结点存储对应子节点的存储结构的存储地址。
图8示出了图1所示字典树中最左侧第三层节点“o”的比特映射结构和单链表结构。该节点中存储有节点字符“o”,两个比特映射表,一个是数字“0-9”对应的比特映射表,由于其子节点中不包括数字“0-9”的字符,因此这个比特映射表的比特位的值均为0;而另一个比特映射表是字母“a-z”对应的比特映射表,由于其子节点为“p”和“t”,因此该比特映射表中第15个和19个比特位的值为1,其余均为0。而单链表包括两个结点,第0个结点对应子节点“p”,第1个结点对应子节点“t”,分别存储两个子节点的存储结构的地址。
图9示出根据本公开第二实施方式的数据存储方法的流程图。如图9所示,所述数据存储方法包括以下步骤S901-S902:
在步骤S901中,获取字典树的当前节点的存储结构;
其中,所述字典树由预设词组集合构建而成,所述当前节点的存储结构包括当前节点对应的字符、比特映射结构和单链表;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符;
在步骤S902中,利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配;
在步骤S903中,在匹配成功后,利用当前节点的存储结构获取匹配成功的子节点的存储结构,并与待查询数据的下一字符进行匹配,直至完成待查询数据的匹配。
在本实施例中,预设词组集合包括采用字典树结构存储的多个词组,词组可以由字符串构成。例如在检索系统中的已有关键词集合。采用字典树结构存储预设词组集合,可以在使用时,基于用户输入的部分内容与字典树结构进行匹配,进而获得与该部分内容相匹配的所有词组。例如,在外卖点餐系统中,利用商户的名称、菜品名称等构成的词组集合,构建字典树,并采用本公开的存储结构形式进行存储,用户在外卖点餐系统中输入商户名称或菜品的部分内容时,就可以通过该输入的部分内容与字典树中的词组进行匹配,最终获得用户查询的商户或者菜品,如用户在外卖点餐系统的搜索框中输入“KF”,则系统会在输出结果中显示“KFC肯德基”相关的店铺。
字典树包括根节点、中间节点和叶节点。根节点对应的字符为空,中间节点和叶节点对应构建字典树的词组中的字符。从根节点到某一叶节点的路径上的节点对应的字符按顺序形成一个词组。例如,构建字典树的词组是由0-9十个数组和a-z 26个字母构成的,那么根节点的子节点包括36个,分别为0-9、a-z这36个字符对应的子节点,而每个中间节点也最多会有0-9、a-z这36个字符对应的子节点。
本实施例中,预设词组集合中的任一词组,其首个字符作为字典树根节点的子节点,而其后续的字符依次作为前一字符的子节点。对于构建成的字典树而言,其存储结构中,每个节点存储有当前节点对应的字符以及子节点的信息,最终得到字典树结构。例如,图1所示的字典树结构就是由词组集合{mop,moth,pop,star,stop,9op}构建而成。
本实施例中,从字典树根节点开始,当前节点的存储结构中存储有当前节点对应的字符,如图1中最左侧路径上第一个中间节点对应的字符为“m”,其是存储数据“mop”的首个字符。当前节点除了存储所对应的字符之外,还存储子节点信息。子节点信息可以包括子节点对应的字符以及子节点的存储结构的地址信息。当然,当前节点为叶节点,即没有子节点时,子节点信息为空。
在本实施例中,当前节点的存储结构以比特映射结构和单链表相结合的方式存储子节点信息。单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。单链表包括多个结点,每个结点包括元素(数据元素的映象)和指向后续结点的指针(即后续结点的元素存储位置)。本实施例中,单链表的结点存储对应子节点的存储结构的地址信息。通过单链表相应节点的元素就能准确获取当前节点的子节点的存储结构。
在本实施例中,比特映射结构包括多个字节,多个字节中的比特位映射存储子节点对应的字符。通过比特映射结构可以确定当前节点的子节点对应的字符,进而在查询匹配时,可以结合比特映射结构和单链表就能确定待匹配字符是否与当前节点的子节点对应的字符相同,并且在相匹配时还可以获取相匹配字节的存储结构。
本实施例中,在将待查询数据与字典树结构进行匹配时,可以从字典树的根节点开始,获取根节点的存储结构,并基于根节点的存储结构匹配获得与待查询数据的首个字符相匹配的根节点的子节点,如果根节点的任何一个子节点都与待查询数据的首个字符不匹配,则结束查询;否则再根据根节点的存储结构获取相匹配的子节点的存储结构,进而利用该子节点的存储结构与待查询数据的下一字符进行匹配,匹配过程与首个字符与根节点的存储结构的匹配过程一致。在匹配过程中,字典树中每个节点与待查询数据的当前字符的匹配过程是一致的,即首先获取当前节点的存储结构,当前节点为根节点时,根节点的存储结构地址已知,可以直接根据地址获取,而非根节点时,从其父节点的存储结构获取;获得当前节点的存储结构后,利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配,如果匹配成功,则将匹配成功的该子节点作为当前节点进行处理,否则匹配失败。在待查询数据的所有字符都匹配成功后,可以根据匹配成功的路径获取从根节点到叶节点所对应的各个字符按顺序组成的词组。例如,图1所示的字典树中,用户输入的待查询数据是“mo”,则可以从图1所示的字典树匹配获取字符串“mop”和“moth”两个完整字符串。如果输入字符串为“mot”,则无匹路径,不能获取任何数据。
本实施例通过图4所示的第一实施例中数据存储方法将预设词组集合存储为字典树形式,而且字典树的存储结构采用了上述比特映射结构和单链表相结合的方式,使得在保存字典树节点时,仅仅增加了一个单链表的指针。而在64位机器上,指针占用8字节,保存的字典树节点也是一个指针,单链表的结点指向下一个单链表结点也是通过一个指针,所以内存冗余已有技术中采用STL的map结构存储时的600%降低为100%,大大降低了内存冗余。在64位机器上,默认内存对齐的单位是8字节。采用本公开实施例的这种存储方式,字典树的每个节点的内存占用是16个字节。而图2所示的字典树节点内存占用也是16字节(节点字符采用8字节存储,子节点map采用8字节存储子节点的存储结构)。遍历单链表的时间复杂度是O(N),红黑树的查找时间复杂度是O(logN)。由于字典树节点仅仅维护常数(如36)个字符,所以单链表遍历与红黑树查找的时间复杂度都是常数C。综上所述,采用第一实施例中的比特映射结合单链表结构替换已有技术中STL的map结构后,没有增加字典树节点的内存占用,没有增加查询的时间复杂度,同时将节点维护子节点时所需要的内存冗余降低到原来的1/6(STL的map结构采用图3所示的存储结构维护子节点,需要56个字节,而本实施例中仅需要)。可见,本公开实施例中利用采用了比特映射结构和单链表相结合的字典树的存储结构进行数据匹配,使得在不增加字典树查找时间复杂度的前提下,有效降低了维护子节点的内存冗余,且由于维护子节点的内存空间得到大大降低,使得数据查询时间进一步缩短。
在本实施例的一个可选实现方式中,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述预设词组集合中的词组由所述预设字符集中的字符构成。
该可选的实现方式中,待查询数据可以是字符串构成词组,如英文单词、中文拼音或其他由数字和字母构成的词组等。当然,待查询数据还可以由其他特殊字符构成,如中文文字、日文文字、韩文文字、希腊字母等等。预设字符集合包括构成待查询数据的所有字符,如0-9和a-z构成的字符集合。比特映射结构采用多个字节,将比特位与预设字符集合中的每个字符对应起来,比特位的数量大于或等于预设字符集合中的字符数量,由于机器存储时,需要字节对齐,因此比特映射结构通常以字节为单位,而预设字符集合中的字符数量不是一个字节比特数量即8的整数倍时,比特映射结构中多于预设字符集合中的字符数量的比特位始终为空,不存储数据。例如,预设字符集合包括0-9和a-z这36个字符时,可以分别为0-9和a-z建立比特映射结构,0-9对应两个字节的第一比特映射结构,而a-z对应4个字节的比特映射结构,第一比特映射结构中从第1个比特位至第10个比特位,分别对应0-9这10个字符,其余6个比特位始终为空;而第二比特映射结构中从第1个至第26个比特位,分别对应a-z这26个字符,其余6个比特位始终为空。通过这种方式,可以采用比特映射结构映射存储当前节点对应子节点的字符,并且还可以通过比特映射结构确定子节点的数量。
在本实施例的一个可选实现方式中,所述步骤S902,即利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配的步骤,进一步包括以下步骤:
根据所述比特映射结构中值为M的比特位确定所述当前节点是否存在与所述待查询数据的当前字符相匹配的子节点,其中M为0或1。
在计算机中比特位取值范围是0或1,那么采用比特映射结构存储子节点对应的字符时,由于比特位与字符之间是一一对应的关系,因此可以将子节点的字符对应的比特位置为1(或0),而其他比特位置为0(或1),就可以从比特映射结构中确定当前节点的子节点对应的字符是什么以及子节点的个数是多少。
下面通过具体实例说明比特映射结构。
在C++变量中,每个变量是由若干个字节组成,每个字节包含8个比特位(bit),每个bit可以取0或者1。例如整型int是由4个字节,32个比特位构成,短整型short是由2个字节,16个比特位构成。
字典树节点可以用于保存0-9这10个数字字符和a-z这26个字母字符,所以字典树一共可以保存的字符为36个。
因此,可以用一个短整型的10个比特位表示10个数字对应的映射是否存在。例如,当前节点包括两个子节点,而两个子节点对应的字符分别为“4”和“6”时,比特映射结构如图5所示。图5中,上一行为比特位的值,下一行为比特位的序号,第0个比特位至第9个比特位分别对应字符“0-9”,而字符“4”和“6”对应的比特位的值为1,其他比特位的值为0,因此图5所示的比特映射结构表示“4”和“6”这两个数字字符对应的映射存在,其余映射不存在。
同理,可以用整型即4个字节的26个比特位表示26个字母对应的映射是否存在,例如,当前节点包括四个子节点,分别对应字符“e、g、u、w”,比特映射结构如图6所示。与图5类似,图6中上一行表示比特位的值,下一行为比特位的序号,第0个比特位至第25个比特位分别对应字符“a-z”,而字符“e”、“g”、“u”和“w”对应的比特位的值为1,其他比特位的值为0,因此图6所示的比特映射结构表示“e”、“g”、“u”和“w”这四个字符对应的映射存在,其余映射不存在。
当然,在其他实施例中,也可以将存在映射的比特位置为0,而其余比特位置为1,具体根据实际情况设置,在此不做限定。
在本实施例的一个可选实现方式中,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。
为了维护当前节点的子节点信息,本实施例中采用单链表存储子节点的存储结构的地址信息。单链表可以包括一个或多个结点,每个结点对应存储当前节点的一个子节点的存储结构的地址信息。单链表的多个结点是有顺序关系的,前一结点保存有指向后一结点的指针,且单链表的结点的顺序与当前节点各个子节点对应的字符在比特映射结构中对应比特位的顺序相同。例如,当前节点有三个子节点,且第一个子节点、第二个子节点和第三个子节点对应的字符分别在比特映射结构中对应的比特位为第1、3、4个字节,则第一个子节点对应单链表的第一个结点,第二个子节点对应单链表的第二个结点,第三个子节点对应单链表的第三个结点。因此,通过这种方式,可以基于比特映射结构和单链表维护子节点的地址信息,能够减少维护子节点的内存消耗。
下面通过具体实例说明单链表结构。
对于图5和6所示的比特映射表,假如图5和图6对应的比特映射表为同一节点的比特映射表,则其对应的单链表如图7所示。从图7可以看出,单链表包括6个结点,分别对应子节点“4”、“6”、“e”、“g”、“u”和“w”。每个结点存储对应子节点的存储结构的存储地址。
图8示出了图1所示字典树中最左侧第三层节点“o”的比特映射结构和单链表结构。该节点中存储有节点字符“o”,两个比特映射表,一个是数字“0-9”对应的比特映射表,由于其子节点中不包括数字“0-9”的字符,因此这个比特映射表的比特位的值均为0;而另一个比特映射表是字母“a-z”对应的比特映射表,由于其子节点为“p”和“t”,因此该比特映射表中第15个和19个比特位的值为1,其余均为0。而单链表包括两个结点,第0个结点对应子节点“p”,第1个结点对应子节点“t”,分别存储两个子节点的存储结构的地址。
在本实施例的一个可选实现方式中,如图10所示,步骤S903中的利用当前节点的存储结构获取匹配成功的子节点的存储结构的步骤,进一步包括以下步骤:
在步骤S1001中,根据所述比特映射结构确定与匹配成功的子节点对应的所述单链表的结点;
在步骤S1002中,从匹配成功的所述子节点对应的所述单链表的结点获取匹配成功的所述子节点的存储结构的存储地址。
该可选的实现方式中,比特映射结构中子节点对应的比特位的顺序与单链表中结点的顺序相同,因此可以基于比特映射结构中比特位的顺序确定子节点对应的单链表结点的顺序。根据该顺序可以从单链表中获取匹配成功的子节点对应的单链表结点地址,进而获取单链表结点中存储的该子节点的存储结构的存储地址。在获得存储地址以后,就可以获得子节点的存储结构,进而执行下一步操作。通过这种方式,可以快速获取子节点的存储结构,使得匹配速度较已有技术有了大大提高。
下述为本公开装置实施例,可以用于执行本公开方法实施例。
图11示出根据本公开第一实施方式的数据存储装置的结构框图,该装置可以通过软件、硬件或者两者的结合实现成为电子设备的部分或者全部。如图11所示,所述数据存储装置包括第一获取模块1101和存储模块1102:
第一获取模块1101,被配置为获取待存储数据;
存储模块1102,被配置为根据待存储数据构建并存储字典树;
其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符。
本实施例中,待存储数据可以是多个词组构成的集合,即包括要采用字典树结构存储的多个词组,例如在检索系统中的已有关键词集合。采用字典树结构存储待存储数据的目的可以是为了在使用时,基于用户输入的部分内容与字典树结构进行匹配,进而获得与该部分内容相匹配的所有词组。例如,在外卖点餐系统中,利用商户的名称、菜品名称等构成的词组集合,构建字典树,并采用本公开的存储结构形式进行存储,用户在外卖点餐系统中输入商户名称或菜品的部分内容时,就可以通过该输入的部分内容与字典树中的词组进行匹配,最终获得用户查询的商户或者菜品,如用户在外卖点餐系统的搜索框中输入“KF”,则系统会在输出结果中显示“KFC肯德基”相关的店铺。
字典树包括根节点、中间节点和叶节点。根节点对应的字符为空,中间节点和叶节点对应构建字典树的词组中的字符。从根节点到某一叶节点的路径上的节点对应的字符按顺序形成一个词组。例如,构建字典树的词组是由0-9十个数组和a-z 26个字母构成的,那么根节点的子节点包括36个,分别为0-9、a-z这36个字符对应的子节点,而每个中间节点也最多会有0-9、a-z这36个字符对应的子节点。
本实施例中,在获得待存储数据后,对于待存储数据中的任一词组,其首个字符作为字典树根节点的子节点,而其后续的字符依次作为前一字符的子节点。对于构建成的字典树而言,其存储结构中,每个节点存储有当前节点对应的字符以及子节点的信息,最终得到字典树结构。例如,图1所示的字典树结构就是由词组集合{mop,moth,pop,star,stop,9op}构建而成。
本实施例中,从字典树根节点开始,当前节点的存储结构中存储有当前节点对应的字符,如图1中最左侧路径上第一个中间节点对应的字符为“m”,其是存储数据“mop”的首个字符。当前节点除了存储所对应的字符之外,还存储子节点信息。子节点信息可以包括子节点对应的字符以及子节点的存储结构的地址信息。当然,当前节点为叶节点,即没有子节点时,子节点信息为空。
在本实施例中,当前节点的存储结构以比特映射结构和单链表相结合的方式存储子节点信息。单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。单链表包括多个结点,每个结点包括元素(数据元素的映象)和指向后续结点的指针(即后续结点的元素存储位置)。本实施例中,单链表的结点存储对应子节点的存储结构的地址信息。通过单链表相应结点的元素就能准确获取字典树当前节点的子节点的存储结构。
在本实施例中,比特映射结构包括多个字节,多个字节中的比特位映射存储子节点对应的字符。通过比特映射结构可以确定字典树当前节点的子节点对应的字符,进而在查询匹配时,可以结合比特映射结构和单链表就能确定待匹配字符是否与当前节点的子节点对应的字符相同,并且在相匹配时还可以获取相匹配字节的存储结构。
通过本实施例的这种数据存储方法,可以将待存储数据以字典树的形式进行存储,而且字典树的存储结构采用了上述比特映射结构和单链表相结合的方式,使得在保存字典树节点时,仅仅增加了一个单链表的指针。而在64位机器上,指针占用8字节,保存的字典树节点也是一个指针,单链表的结点指向下一个单链表结点也是通过一个指针,所以内存冗余已有技术中采用STL的map结构存储时的600%降低为100%,大大降低了内存冗余。在64位机器上,默认内存对齐的单位是8字节。采用本公开实施例的这种存储方式,字典树的每个节点的内存占用是16个字节。而图2所示的字典树节点内存占用也是16字节(节点字符采用8字节存储,子节点map采用8字节存储子节点的存储结构)。遍历单链表的时间复杂度是O(N),红黑树的查找时间复杂度是O(logN)。由于字典树节点仅仅维护常数(如36)个字符,所以单链表遍历与红黑树查找的时间复杂度都是常数C。综上所述,采用本公开实施例中的比特映射结合单链表结构替换已有技术中STL的map结构后,没有增加字典树节点的内存占用,没有增加查询的时间复杂度,同时将节点维护子节点时所需要的内存冗余降低到原来的1/6(STL的map结构采用图4所示的存储结构维护子节点,需要56个字节,而本实施例中仅需要)。可见,本公开实施例通过比特映射结构,合理的利用了比特位的有序特性,完成特定的映射结构。并且比特映射结构与单链表的结合,在不增加字典树节点内存消耗与字典树查找时间复杂度的前提下,有效降低了维护子节点的内存冗余。
在本实施例的一个可选实现方式中,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述待存储数据由所述预设字符集中的字符构成。该可选的实现方式中,待存储数据可以是字符串构成词组,如英文单词、中文拼音或其他由数字和字母构成的词组等,当然待存储数据还可以由其他特殊字符构成,如中文文字、日文文字、韩文文字、希腊字母等等。预设字符集合包括构成待存储数据的所有字符,如0-9和a-z构成的字符集合。比特映射结构采用多个字节,将比特位与预设字符集合中的每个字符对应起来,比特位的数量大于或等于预设字符集合中的字符数量,由于机器存储时,需要字节对齐,因此比特映射结构通常以字节为单位,而预设字符集合中的字符数量不是一个字节的比特数量即8的整数倍时,比特映射结构中多于预设字符集合中的字符数量的比特位始终为空,不存储数据。例如,预设字符集合包括0-9和a-z这36个字符时,可以分别为0-9和a-z建立比特映射结构,0-9对应两个字节的第一比特映射结构,而a-z对应4个字节的比特映射结构,第一比特映射结构中从第1个比特位至第10个比特位,分别对应0-9这10个字符,其余6个比特位始终为空;而第二比特映射结构中从第1个至第26个比特位,分别对应a-z这26个字符,其余6个比特位始终为空。通过这种方式,可以采用比特映射结构映射存储当前节点对应子节点的字符,并且还可以通过比特映射结构确定子节点的数量。
在本实施例的一个可选实现方式中,所述比特映射结构中与所述子节点的字符对应的比特位的值为M,其他比特位的值为N,N和M不同,且N和M的取值范围为0或1。在计算机中比特位取值范围是0或1,那么采用比特映射结构存储子节点对应的字符时,由于比特位与字符之间是一一对应的关系,因此可以将子节点的字符对应的比特位置为1(或0),而其他比特位置为0(或1),就可以从比特映射结构中确定当前节点的子节点对应的字符是什么以及子节点的个数是多少。
下面通过具体实例说明比特映射结构。
在C++变量中,每个变量是由若干个字节组成,每个字节包含8个比特位(bit),每个bit可以取0或者1。例如整型int是由4个字节,32个比特位构成,短整型short是由2个字节,16个比特位构成。
字典树节点可以用于保存0-9这10个数字字符和a-z这26个字母字符,所以字典树一共可以保存的字符为36个。
因此,可以用一个短整型的10个比特位表示10个数字对应的映射是否存在。例如,当前节点包括两个子节点,而两个子节点对应的字符分别为“4”和“6”时,比特映射结构如图5所示。图5中,上一行为比特位的值,下一行为比特位的序号,第0个比特位至第9个比特位分别对应字符“0-9”,而字符“4”和“6”对应的比特位的值为1,其他比特位的值为0,因此图5所示的比特映射结构表示“4”和“6”这两个数字字符对应的映射存在,其余映射不存在。
同理,可以用整型即4个字节的26个比特位表示26个字母对应的映射是否存在,例如,当前节点包括四个子节点,分别对应字符“e、g、u、w”,比特映射结构如图6所示。与图5类似,图6中上一行表示比特位的值,下一行为比特位的序号,第0个比特位至第25个比特位分别对应字符“a-z”,而字符“e”、“g”、“u”和“w”对应的比特位的值为1,其他比特位的值为0,因此图6所示的比特映射结构表示“e”、“g”、“u”和“w”这四个字符对应的映射存在,其余映射不存在。
当然,在其他实施例中,也可以将存在映射的比特位置为0,而其余比特位置为1,具体根据实际情况设置,在此不做限定。
在本实施例的一个可选实现方式中,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。为了维护当前节点的子节点信息,本实施例中采用单链表存储子节点的存储结构的地址信息。单链表可以包括一个或多个结点,每个结点对应存储当前节点的一个子节点的存储结构的地址信息。单链表的多个结点是有顺序关系的,前一结点保存有指向后一结点的指针,且单链表的结点的顺序与字典树当前节点各个子节点对应的字符在比特映射结构中对应比特位的顺序相同。例如,字典树的当前节点有三个子节点,且第一个子节点、第二个子节点和第三个子节点对应的字符分别在比特映射结构中对应的比特位为第1、3、4个字节,则第一个子节点对应单链表的第一个结点,第二个子节点对应单链表的第二个结点,第三个子节点对应单链表的第三个结点。因此,通过这种方式,可以基于比特映射结构和单链表维护子节点的地址信息,能够减少维护子节点的内存消耗。
下面通过具体实例说明单链表结构。
对于图5和6所示的比特映射表,假如图5和图6对应的比特映射表为同一节点的比特映射表,则其对应的单链表如图7所示。从图7可以看出,单链表包括6个结点,分别对应子节点“4”、“6”、“e”、“g”、“u”和“w”。每个结点存储对应子节点的存储结构的存储地址。
图8示出了图1所示字典树中最左侧第三层节点“o”的比特映射结构和单链表结构。该节点中存储有节点字符“o”,两个比特映射表,一个是数字“0-9”对应的比特映射表,由于其子节点中不包括数字“0-9”的字符,因此这个比特映射表的比特位的值均为0;而另一个比特映射表是字母“a-z”对应的比特映射表,由于其子节点为“p”和“t”,因此该比特映射表中第15个和19个比特位的值为1,其余均为0。而单链表包括两个结点,第0个结点对应子节点“p”,第1个结点对应子节点“t”,分别存储两个子节点的存储结构的地址。
图12示出根据本公开第二实施方式的数据查询装置的结构框图,该装置可以通过软件、硬件或者两者的结合实现成为电子设备的部分或者全部。如图12所示,所述数据查询装置包括第二获取模块1201、匹配模块1202和第三获取模块1203:
第二获取模块1201,被配置为获取字典树的当前节点的存储结构;所述字典树由预设词组集合构建而成,所述当前节点的存储结构包括当前节点对应的字符、比特映射结构和单链表;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符;
匹配模块1202,被配置为利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配;
第三获取模块1203,被配置为在匹配成功后,利用当前节点的存储结构获取匹配成功的子节点的存储结构,并与待查询数据的下一字符进行匹配,直至完成待查询数据的匹配。
在本实施例中,预设词组集合包括采用字典树结构存储的多个词组,词组可以由字符串构成。例如在检索系统中的已有关键词集合。采用字典树结构存储预设词组集合,可以在使用时,基于用户输入的部分内容与字典树结构进行匹配,进而获得与该部分内容相匹配的所有词组。例如,在外卖点餐系统中,利用商户的名称、菜品名称等构成的词组集合,构建字典树,并采用本公开的存储结构形式进行存储,用户在外卖点餐系统中输入商户名称或菜品的部分内容时,就可以通过该输入的部分内容与字典树中的词组进行匹配,最终获得用户查询的商户或者菜品,如用户在外卖点餐系统的搜索框中输入“KF”,则系统会在输出结果中显示“KFC肯德基”相关的店铺。
字典树包括根节点、中间节点和叶节点。根节点对应的字符为空,中间节点和叶节点对应构建字典树的词组中的字符。从根节点到某一叶节点的路径上的节点对应的字符按顺序形成一个词组。例如,构建字典树的词组是由0-9十个数组和a-z 26个字母构成的,那么根节点的子节点包括36个,分别为0-9、a-z这36个字符对应的子节点,而每个中间节点也最多会有0-9、a-z这36个字符对应的子节点。
本实施例中,预设词组集合中的任一词组,其首个字符作为字典树根节点的子节点,而其后续的字符依次作为前一字符的子节点。对于构建成的字典树而言,其存储结构中,每个节点存储有当前节点对应的字符以及子节点的信息,最终得到字典树结构。例如,图1所示的字典树结构就是由词组集合{mop,moth,pop,star,stop,9op}构建而成。
本实施例中,从字典树根节点开始,当前节点的存储结构中存储有当前节点对应的字符,如图1中最左侧路径上第一个中间节点对应的字符为“m”,其是存储数据“mop”的首个字符。当前节点除了存储所对应的字符之外,还存储子节点信息。子节点信息可以包括子节点对应的字符以及子节点的存储结构的地址信息。当然,当前节点为叶节点,即没有子节点时,子节点信息为空。
在本实施例中,当前节点的存储结构以比特映射结构和单链表相结合的方式存储子节点信息。单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。单链表包括多个结点,每个结点包括元素(数据元素的映象)和指向后续结点的指针(即后续结点的元素存储位置)。本实施例中,单链表的结点存储对应子节点的存储结构的地址信息。通过单链表相应节点的元素就能准确获取当前节点的子节点的存储结构。
在本实施例中,比特映射结构包括多个字节,多个字节中的比特位映射存储子节点对应的字符。通过比特映射结构可以确定当前节点的子节点对应的字符,进而在查询匹配时,可以结合比特映射结构和单链表就能确定待匹配字符是否与当前节点的子节点对应的字符相同,并且在相匹配时还可以获取相匹配字节的存储结构。
本实施例中,在将待查询数据与字典树结构进行匹配时,可以从字典树的根节点开始,获取根节点的存储结构,并基于根节点的存储结构匹配获得与待查询数据的首个字符相匹配的根节点的子节点,如果根节点的任何一个子节点都与待查询数据的首个字符不匹配,则结束查询;否则再根据根节点的存储结构获取相匹配的子节点的存储结构,进而利用该子节点的存储结构与待查询数据的下一字符进行匹配,匹配过程与首个字符与根节点的存储结构的匹配过程一致。在匹配过程中,字典树中每个节点与待查询数据的当前字符的匹配过程是一致的,即首先获取当前节点的存储结构,当前节点为根节点时,根节点的存储结构地址已知,可以直接根据地址获取,而非根节点时,从其父节点的存储结构获取;获得当前节点的存储结构后,利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配,如果匹配成功,则将匹配成功的该子节点作为当前节点进行处理,否则匹配失败。在待查询数据的所有字符都匹配成功后,可以根据匹配成功的路径获取从根节点到叶节点所对应的各个字符按顺序组成的词组。例如,图1所示的字典树中,用户输入的待查询数据是“mo”,则可以从图1所示的字典树匹配获取字符串“mop”和“moth”两个完整字符串。如果输入字符串为“mot”,则无匹路径,不能获取任何数据。
本实施例通过图4所示的第一实施例中数据存储方法将预设词组集合存储为字典树形式,而且字典树的存储结构采用了上述比特映射结构和单链表相结合的方式,使得在保存字典树节点时,仅仅增加了一个单链表的指针。而在64位机器上,指针占用8字节,保存的字典树节点也是一个指针,单链表的结点指向下一个单链表结点也是通过一个指针,所以内存冗余已有技术中采用STL的map结构存储时的600%降低为100%,大大降低了内存冗余。在64位机器上,默认内存对齐的单位是8字节。采用本公开实施例的这种存储方式,字典树的每个节点的内存占用是16个字节。而图2所示的字典树节点内存占用也是16字节(节点字符采用8字节存储,子节点map采用8字节存储子节点的存储结构)。遍历单链表的时间复杂度是O(N),红黑树的查找时间复杂度是O(logN)。由于字典树节点仅仅维护常数(如36)个字符,所以单链表遍历与红黑树查找的时间复杂度都是常数C。综上所述,采用第一实施例中的比特映射结合单链表结构替换已有技术中STL的map结构后,没有增加字典树节点的内存占用,没有增加查询的时间复杂度,同时将节点维护子节点时所需要的内存冗余降低到原来的1/6(STL的map结构采用图3所示的存储结构维护子节点,需要56个字节,而本实施例中仅需要)。可见,本公开实施例中利用采用了比特映射结构和单链表相结合的字典树的存储结构进行数据匹配,使得在不增加字典树查找时间复杂度的前提下,有效降低了维护子节点的内存冗余,且由于维护子节点的内存空间得到大大降低,使得数据查询时间进一步缩短。
在本实施例的一个可选实现方式中,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述预设词组集合中的词组由所述预设字符集中的字符构成。
该可选的实现方式中,待查询数据可以是字符串构成词组,如英文单词、中文拼音或其他由数字和字母构成的词组等。当然,待查询数据还可以由其他特殊字符构成,如中文文字、日文文字、韩文文字、希腊字母等等。预设字符集合包括构成待查询数据的所有字符,如0-9和a-z构成的字符集合。比特映射结构采用多个字节,将比特位与预设字符集合中的每个字符对应起来,比特位的数量大于或等于预设字符集合中的字符数量,由于机器存储时,需要字节对齐,因此比特映射结构通常以字节为单位,而预设字符集合中的字符数量不是一个字节比特数量即8的整数倍时,比特映射结构中多于预设字符集合中的字符数量的比特位始终为空,不存储数据。例如,预设字符集合包括0-9和a-z这36个字符时,可以分别为0-9和a-z建立比特映射结构,0-9对应两个字节的第一比特映射结构,而a-z对应4个字节的比特映射结构,第一比特映射结构中从第1个比特位至第10个比特位,分别对应0-9这10个字符,其余6个比特位始终为空;而第二比特映射结构中从第1个至第26个比特位,分别对应a-z这26个字符,其余6个比特位始终为空。通过这种方式,可以采用比特映射结构映射存储当前节点对应子节点的字符,并且还可以通过比特映射结构确定子节点的数量。
在本实施例的一个可选实现方式中,所述匹配模块1202包括:
第一确定子模块,被配置为根据所述比特映射结构中值为M的比特位确定所述当前节点是否存在与所述待查询数据的当前字符相匹配的子节点,其中M为0或1。
在计算机中比特位取值范围是0或1,那么采用比特映射结构存储子节点对应的字符时,由于比特位与字符之间是一一对应的关系,因此可以将子节点的字符对应的比特位置为1(或0),而其他比特位置为0(或1),就可以从比特映射结构中确定当前节点的子节点对应的字符是什么以及子节点的个数是多少。
下面通过具体实例说明比特映射结构。
在C++变量中,每个变量是由若干个字节组成,每个字节包含8个比特位(bit),每个bit可以取0或者1。例如整型int是由4个字节,32个比特位构成,短整型short是由2个字节,16个比特位构成。
字典树节点可以用于保存0-9这10个数字字符和a-z这26个字母字符,所以字典树一共可以保存的字符为36个。
因此,可以用一个短整型的10个比特位表示10个数字对应的映射是否存在。例如,当前节点包括两个子节点,而两个子节点对应的字符分别为“4”和“6”时,比特映射结构如图5所示。图5中,上一行为比特位的值,下一行为比特位的序号,第0个比特位至第9个比特位分别对应字符“0-9”,而字符“4”和“6”对应的比特位的值为1,其他比特位的值为0,因此图5所示的比特映射结构表示“4”和“6”这两个数字字符对应的映射存在,其余映射不存在。
同理,可以用整型即4个字节的26个比特位表示26个字母对应的映射是否存在,例如,当前节点包括四个子节点,分别对应字符“e、g、u、w”,比特映射结构如图6所示。与图5类似,图6中上一行表示比特位的值,下一行为比特位的序号,第0个比特位至第25个比特位分别对应字符“a-z”,而字符“e”、“g”、“u”和“w”对应的比特位的值为1,其他比特位的值为0,因此图6所示的比特映射结构表示“e”、“g”、“u”和“w”这四个字符对应的映射存在,其余映射不存在。
当然,在其他实施例中,也可以将存在映射的比特位置为0,而其余比特位置为1,具体根据实际情况设置,在此不做限定。
在本实施例的一个可选实现方式中,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。
为了维护当前节点的子节点信息,本实施例中采用单链表存储子节点的存储结构的地址信息。单链表可以包括一个或多个结点,每个结点对应存储当前节点的一个子节点的存储结构的地址信息。单链表的多个结点是有顺序关系的,前一结点保存有指向后一结点的指针,且单链表的结点的顺序与当前节点各个子节点对应的字符在比特映射结构中对应比特位的顺序相同。例如,当前节点有三个子节点,且第一个子节点、第二个子节点和第三个子节点对应的字符分别在比特映射结构中对应的比特位为第1、3、4个字节,则第一个子节点对应单链表的第一个结点,第二个子节点对应单链表的第二个结点,第三个子节点对应单链表的第三个结点。因此,通过这种方式,可以基于比特映射结构和单链表维护子节点的地址信息,能够减少维护子节点的内存消耗。
下面通过具体实例说明单链表结构。
对于图5和6所示的比特映射表,假如图5和图6对应的比特映射表为同一节点的比特映射表,则其对应的单链表如图7所示。从图7可以看出,单链表包括6个结点,分别对应子节点“4”、“6”、“e”、“g”、“u”和“w”。每个结点存储对应子节点的存储结构的存储地址。
图8示出了图1所示字典树中最左侧第三层节点“o”的比特映射结构和单链表结构。该节点中存储有节点字符“o”,两个比特映射表,一个是数字“0-9”对应的比特映射表,由于其子节点中不包括数字“0-9”的字符,因此这个比特映射表的比特位的值均为0;而另一个比特映射表是字母“a-z”对应的比特映射表,由于其子节点为“p”和“t”,因此该比特映射表中第15个和19个比特位的值为1,其余均为0。而单链表包括两个结点,第0个结点对应子节点“p”,第1个结点对应子节点“t”,分别存储两个子节点的存储结构的地址。
在本实施例的一个可选实现方式中,如图13所示,第三获取模块1203包括:
第二确定子模块1301,被配置为根据所述比特映射结构确定与匹配成功的子节点对应的所述单链表的结点;
获取子模块1302,被配置为从匹配成功的所述子节点对应的所述单链表的结点获取匹配成功的所述子节点的存储结构的存储地址。
该可选的实现方式中,比特映射结构中子节点对应的比特位的顺序与单链表中结点的顺序相同,因此可以基于比特映射结构中比特位的顺序确定子节点对应的单链表结点的顺序。根据该顺序可以从单链表中获取匹配成功的子节点对应的单链表结点地址,进而获取单链表结点中存储的该子节点的存储结构的存储地址。在获得存储地址以后,就可以获得子节点的存储结构,进而执行下一步操作。通过这种方式,可以快速获取子节点的存储结构,使得匹配速度较已有技术有了大大提高。
图14是适于用来实现根据本公开实施方式的数据存储方法的电子设备的结构示意图。
如图14所示,电子设备1400包括中央处理单元(CPU)1401,其可以根据存储在只读存储器(ROM)1402中的程序或者从存储部分1408加载到随机访问存储器(RAM)1403中的程序而执行上述图1所示的实施方式中的各种处理。在RAM1403中,还存储有电子设备1400操作所需的各种程序和数据。CPU1401、ROM1402以及RAM1403通过总线1404彼此相连。输入/输出(I/O)接口1405也连接至总线1404。
以下部件连接至I/O接口1405:包括键盘、鼠标等的输入部分1406;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1407;包括硬盘等的存储部分1408;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1409。通信部分1409经由诸如因特网的网络执行通信处理。驱动器1410也根据需要连接至I/O接口1405。可拆卸介质1411,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1410上,以便于从其上读出的计算机程序根据需要被安装入存储部分1408。
特别地,根据本公开的实施方式,上文参考图4描述的方法可以被实现为计算机软件程序。例如,本公开的实施方式包括一种计算机程序产品,其包括有形地包含在及其可读介质上的计算机程序,所述计算机程序包含用于执行图4的数据存储方法的程序代码。在这样的实施方式中,该计算机程序可以通过通信部分1409从网络上被下载和安装,和/或从可拆卸介质1411被安装。
图15是适于用来实现根据本公开实施方式的数据查询方法的电子设备的结构示意图。
如图15所示,电子设备1500包括中央处理单元(CPU)1501,其可以根据存储在只读存储器(ROM)1502中的程序或者从存储部分1508加载到随机访问存储器(RAM)1503中的程序而执行上述图1所示的实施方式中的各种处理。在RAM1503中,还存储有电子设备1500操作所需的各种程序和数据。CPU1501、ROM1502以及RAM1503通过总线1504彼此相连。输入/输出(I/O)接口1505也连接至总线1504。
以下部件连接至I/O接口1505:包括键盘、鼠标等的输入部分1506;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1507;包括硬盘等的存储部分1508;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1509。通信部分1509经由诸如因特网的网络执行通信处理。驱动器1510也根据需要连接至I/O接口1505。可拆卸介质1511,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1510上,以便于从其上读出的计算机程序根据需要被安装入存储部分1508。
特别地,根据本公开的实施方式,上文参考图9描述的方法可以被实现为计算机软件程序。例如,本公开的实施方式包括一种计算机程序产品,其包括有形地包含在及其可读介质上的计算机程序,所述计算机程序包含用于执行图9的数据查询方法的程序代码。在这样的实施方式中,该计算机程序可以通过通信部分1509从网络上被下载和安装,和/或从可拆卸介质1511被安装。
附图中的流程图和框图,图示了按照本公开各种实施方式的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,路程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施方式中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定。
作为另一方面,本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施方式中所述装置中所包含的计算机可读存储介质;也可以是单独存在,未装配入设备中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,所述程序被一个或者一个以上的处理器用来执行描述于本公开第一实施方式和第二实施方式的方法。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
A1、一种数据存储方法,包括:获取待存储数据;根据待存储数据构建并存储字典树;其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符。A2、根据A1所述的数据存储方法,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述待存储数据由所述预设字符集中的字符构成。A3、根据A2所述的数据存储方法,所述比特映射结构中与所述子节点的字符对应的比特位的值为M,其他比特位的值为N,N和M不同,且N和M的取值范围为0或1。A4、根据A2所述的数据存储方法,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。
B5、一种数据查询方法,包括:获取字典树的当前节点的存储结构;所述字典树由预设词组集合构建而成,所述当前节点的存储结构包括当前节点对应的字符、比特映射结构和单链表;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符;利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配;在匹配成功后,利用当前节点的存储结构获取匹配成功的子节点的存储结构,并与待查询数据的下一字符进行匹配,直至完成待查询数据的匹配。B6、根据B5所述的数据查询方法,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述预设词组集合中的词组由所述预设字符集中的字符构成。B7、根据B6所述的数据查询方法,利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配,包括:根据所述比特映射结构中值为M的比特位确定所述当前节点是否存在与所述待查询数据的当前字符相匹配的子节点,其中M为0或1。B8、根据B6所述的数据查询方法,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。B9、根据B8所述的数据查询方法,利用当前节点的存储结构获取匹配成功的子节点的存储结构,包括:根据所述比特映射结构确定与匹配成功的子节点对应的所述单链表的结点;从匹配成功的所述子节点对应的所述单链表的结点获取匹配成功的所述子节点的存储结构的存储地址。
C10、一种数据存储装置,包括:第一获取模块,被配置为获取待存储数据;存储模块,被配置为根据待存储数据构建并存储字典树;其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符。C11、根据C10所述的数据存储装置,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述待存储数据由所述预设字符集中的字符构成。C12、根据C11所述的数据存储装置,所述比特映射结构中与所述子节点的字符对应的比特位的值为M,其他比特位的值为N,N和M不同,且N和M的取值范围为0或1。C13、根据C11所述的数据存储装置,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。
D14、一种数据查询装置,包括:第二获取模块,被配置为获取字典树的当前节点的存储结构;所述字典树由预设词组集合构建而成,所述当前节点的存储结构包括当前节点对应的字符、比特映射结构和单链表;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符;匹配模块,被配置为利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配;第三获取模块,被配置为在匹配成功后,利用当前节点的存储结构获取匹配成功的子节点的存储结构,并与待查询数据的下一字符进行匹配,直至完成待查询数据的匹配。D15、根据D14所述的数据查询装置,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述预设词组集合中的词组由所述预设字符集中的字符构成。D16、根据D15所述的数据查询装置,所述匹配模块包括:第一确定子模块,被配置为根据所述比特映射结构中值为M的比特位确定所述当前节点是否存在与所述待查询数据的当前字符相匹配的子节点,其中M为0或1。D17、根据D15所述的数据查询装置,所述单链表的结点个数与所述当前节点的子节点个数相同,且所述单链表的结点的顺序与所述子节点对应的字符在所述比特映射结构中对应的比特位的顺序相同。D18、根据D17所述的数据查询装置,第三获取模块包括:第二确定子模块,被配置为根据所述比特映射结构确定与匹配成功的子节点对应的所述单链表的结点;获取子模块,被配置为从匹配成功的所述子节点对应的所述单链表的结点获取匹配成功的所述子节点的存储结构的存储地址。
E19、一种电子设备,包括存储器和处理器;其中,所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现A1-A4任一项所述的方法步骤。
F20、一种电子设备,包括存储器和处理器;其中,所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现B5-B9任一项所述的方法步骤。
G21、一种计算机可读存储介质,其上存储有计算机指令,该计算机指令被处理器执行时实现A1-A4任一项所述的方法步骤。
H22、一种计算机可读存储介质,其上存储有计算机指令,该计算机指令被处理器执行时实现B5-B9任一项所述的方法步骤。
Claims (10)
1.一种数据存储方法,其特征在于,包括:
获取待存储数据;
根据待存储数据构建并存储字典树;
其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符。
2.根据权利要求1所述的数据存储方法,其特征在于,所述比特映射结构中的多个预定比特位与预设字符集中的字符一一对应;所述待存储数据由所述预设字符集中的字符构成。
3.根据权利要求2所述的数据存储方法,其特征在于,所述比特映射结构中与所述子节点的字符对应的比特位的值为M,其他比特位的值为N,N和M不同,且N和M的取值范围为0或1。
4.一种数据查询方法,其特征在于,包括:
获取字典树的当前节点的存储结构;所述字典树由预设词组集合构建而成,所述当前节点的存储结构包括当前节点对应的字符、比特映射结构和单链表;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符;
利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配;
在匹配成功后,利用当前节点的存储结构获取匹配成功的子节点的存储结构,并与待查询数据的下一字符进行匹配,直至完成待查询数据的匹配。
5.一种数据存储装置,其特征在于,包括:
第一获取模块,被配置为获取待存储数据;
存储模块,被配置为根据待存储数据构建并存储字典树;
其中,所述字典树的存储结构中,从根节点开始,当前节点的存储结构中存储当前节点对应的字符;并且所述当前节点的存储结构中以比特映射结构和单链表相结合的方式存储子节点信息;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符。
6.一种数据查询装置,其特征在于,包括:
第二获取模块,被配置为获取字典树的当前节点的存储结构;所述字典树由预设词组集合构建而成,所述当前节点的存储结构包括当前节点对应的字符、比特映射结构和单链表;所述单链表的结点存储所述子节点的存储结构的地址信息,所述比特映射结构包括多个字节,所述多个字节中的比特位映射存储所述子节点对应的字符;
匹配模块,被配置为利用当前节点的存储结构将待查询数据的当前字符与当前节点的子节点对应的字符进行匹配;
第三获取模块,被配置为在匹配成功后,利用当前节点的存储结构获取匹配成功的子节点的存储结构,并与待查询数据的下一字符进行匹配,直至完成待查询数据的匹配。
7.一种电子设备,其特征在于,包括存储器和处理器;其中,
所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现权利要求1-3任一项所述的方法步骤。
8.一种电子设备,其特征在于,包括存储器和处理器;其中,
所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现权利要求4所述的方法步骤。
9.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,该计算机指令被处理器执行时实现权利要求1-3任一项所述的方法步骤。
10.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,该计算机指令被处理器执行时实现4所述的方法步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711053709.8A CN107862026B (zh) | 2017-10-31 | 2017-10-31 | 数据存储方法及装置、数据查询方法及装置、电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711053709.8A CN107862026B (zh) | 2017-10-31 | 2017-10-31 | 数据存储方法及装置、数据查询方法及装置、电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107862026A true CN107862026A (zh) | 2018-03-30 |
CN107862026B CN107862026B (zh) | 2021-01-01 |
Family
ID=61696504
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711053709.8A Active CN107862026B (zh) | 2017-10-31 | 2017-10-31 | 数据存储方法及装置、数据查询方法及装置、电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107862026B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110502535A (zh) * | 2019-08-28 | 2019-11-26 | 上海达梦数据库有限公司 | 数据访问方法、装置、设备和存储介质 |
CN110704444A (zh) * | 2019-09-30 | 2020-01-17 | 深圳前海环融联易信息科技服务有限公司 | 基于字典树的搜索方法、装置、计算机设备及存储介质 |
CN111274242A (zh) * | 2020-01-07 | 2020-06-12 | 南京天溯自动化控制系统有限公司 | 用于医院后勤运维的树结构的数据查找方法、装置 |
CN111354348A (zh) * | 2018-12-21 | 2020-06-30 | 北京搜狗科技发展有限公司 | 一种数据处理方法、装置和用于数据处理的装置 |
CN112835897A (zh) * | 2021-01-29 | 2021-05-25 | 上海寻梦信息技术有限公司 | 地理区域划分管理方法、数据转换方法及相关设备 |
CN113064555A (zh) * | 2021-04-21 | 2021-07-02 | 山东英信计算机技术有限公司 | 一种bios的数据存储方法、装置、设备及存储介质 |
CN113127692A (zh) * | 2019-12-31 | 2021-07-16 | 北京奇艺世纪科技有限公司 | 一种数据存储结构、检索方法、数据存储方法及终端设备 |
CN113239307A (zh) * | 2021-05-17 | 2021-08-10 | 北京百度网讯科技有限公司 | 用于存储消息主题的方法及装置 |
CN114078283A (zh) * | 2020-08-12 | 2022-02-22 | 腾讯科技(深圳)有限公司 | 数据查询方法、装置、设备及计算机可读存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101299212A (zh) * | 2008-06-20 | 2008-11-05 | 中山大学 | 一种基于比特映射的压缩键树的单词检索方法 |
CN105117417A (zh) * | 2015-07-30 | 2015-12-02 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
US20160056843A1 (en) * | 2011-11-08 | 2016-02-25 | Warren GROSS | Methods and systems for decoding polar codes |
CN106980656A (zh) * | 2017-03-10 | 2017-07-25 | 北京大学 | 一种基于二值码字典树的搜索方法 |
-
2017
- 2017-10-31 CN CN201711053709.8A patent/CN107862026B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101299212A (zh) * | 2008-06-20 | 2008-11-05 | 中山大学 | 一种基于比特映射的压缩键树的单词检索方法 |
US20160056843A1 (en) * | 2011-11-08 | 2016-02-25 | Warren GROSS | Methods and systems for decoding polar codes |
CN105117417A (zh) * | 2015-07-30 | 2015-12-02 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
CN106980656A (zh) * | 2017-03-10 | 2017-07-25 | 北京大学 | 一种基于二值码字典树的搜索方法 |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111354348A (zh) * | 2018-12-21 | 2020-06-30 | 北京搜狗科技发展有限公司 | 一种数据处理方法、装置和用于数据处理的装置 |
CN111354348B (zh) * | 2018-12-21 | 2024-04-26 | 北京搜狗科技发展有限公司 | 一种数据处理方法、装置和用于数据处理的装置 |
CN110502535B (zh) * | 2019-08-28 | 2022-02-22 | 上海达梦数据库有限公司 | 数据访问方法、装置、设备和存储介质 |
CN110502535A (zh) * | 2019-08-28 | 2019-11-26 | 上海达梦数据库有限公司 | 数据访问方法、装置、设备和存储介质 |
CN110704444A (zh) * | 2019-09-30 | 2020-01-17 | 深圳前海环融联易信息科技服务有限公司 | 基于字典树的搜索方法、装置、计算机设备及存储介质 |
CN113127692A (zh) * | 2019-12-31 | 2021-07-16 | 北京奇艺世纪科技有限公司 | 一种数据存储结构、检索方法、数据存储方法及终端设备 |
CN113127692B (zh) * | 2019-12-31 | 2023-08-18 | 北京奇艺世纪科技有限公司 | 一种数据存储结构、检索方法、数据存储方法及终端设备 |
CN111274242A (zh) * | 2020-01-07 | 2020-06-12 | 南京天溯自动化控制系统有限公司 | 用于医院后勤运维的树结构的数据查找方法、装置 |
CN111274242B (zh) * | 2020-01-07 | 2023-12-12 | 南京天溯自动化控制系统有限公司 | 用于医院后勤运维的树结构的数据查找方法、装置 |
CN114078283A (zh) * | 2020-08-12 | 2022-02-22 | 腾讯科技(深圳)有限公司 | 数据查询方法、装置、设备及计算机可读存储介质 |
CN114078283B (zh) * | 2020-08-12 | 2024-05-28 | 腾讯科技(深圳)有限公司 | 数据查询方法、装置、设备及计算机可读存储介质 |
CN112835897A (zh) * | 2021-01-29 | 2021-05-25 | 上海寻梦信息技术有限公司 | 地理区域划分管理方法、数据转换方法及相关设备 |
CN112835897B (zh) * | 2021-01-29 | 2024-03-15 | 上海寻梦信息技术有限公司 | 地理区域划分管理方法、数据转换方法及相关设备 |
CN113064555A (zh) * | 2021-04-21 | 2021-07-02 | 山东英信计算机技术有限公司 | 一种bios的数据存储方法、装置、设备及存储介质 |
CN113239307A (zh) * | 2021-05-17 | 2021-08-10 | 北京百度网讯科技有限公司 | 用于存储消息主题的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107862026B (zh) | 2021-01-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107862026A (zh) | 数据存储方法及装置、数据查询方法及装置、电子设备 | |
US11763356B2 (en) | Visualization of reputation ratings | |
US9600537B2 (en) | Fast identification of complex strings in a data stream | |
US6728732B1 (en) | Data structure using a tree bitmap and method for rapid classification of data in a database | |
Kumar et al. | Advanced algorithms for fast and scalable deep packet inspection | |
EP2040184B1 (en) | Database and database processing methods | |
US9619585B2 (en) | Fast, scalable dictionary construction and maintenance | |
US7249149B1 (en) | Tree bitmap data structures and their use in performing lookup operations | |
US20140101150A1 (en) | Efficient high performance scalable pipelined searching method using variable stride multibit tries | |
CN110309368A (zh) | 数据地址的确定方法、装置、存储介质和电子装置 | |
CN104331278A (zh) | 一种用于arinc661规范的指令过滤方法和装置 | |
CN105843882A (zh) | 一种信息匹配方法及装置 | |
Amir et al. | Managing unbounded-length keys in comparison-driven data structures with applications to online indexing | |
CN105808729B (zh) | 基于论文间引用关系的学术大数据分析方法 | |
Naik et al. | Conceptualizing Python in Google COLAB | |
CN103793522B (zh) | 快速特征码扫描 | |
CN107704105A (zh) | 输入提示方法、装置、电子设备及计算机可读存储介质 | |
US20040215595A1 (en) | Finite-state machine augmented for multiple evaluations of text | |
US8849866B2 (en) | Method and computer program product for creating ordered data structure | |
CN117874088B (zh) | 一种数据模糊匹配方法、装置、设备和介质 | |
CA2855398C (en) | Fast identification of complex strings in a data stream | |
CA2873011C (en) | Fast identification of complex strings in a data stream | |
JPWO2020071368A1 (ja) | データ処理システム、データ処理装置、データ処理方法及びプログラム | |
CN106934002A (zh) | 一种搜索关键字数字化解析方法和引擎 | |
JPH0415875A (ja) | 図形描画装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |