CN110309368A - 数据地址的确定方法、装置、存储介质和电子装置 - Google Patents
数据地址的确定方法、装置、存储介质和电子装置 Download PDFInfo
- Publication number
- CN110309368A CN110309368A CN201810252398.6A CN201810252398A CN110309368A CN 110309368 A CN110309368 A CN 110309368A CN 201810252398 A CN201810252398 A CN 201810252398A CN 110309368 A CN110309368 A CN 110309368A
- Authority
- CN
- China
- Prior art keywords
- target
- address
- child node
- bitmap
- node
- 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/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
- G06F16/90335—Query processing
- G06F16/90344—Query processing by using string matching techniques
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
技术领域
本发明涉及计算机领域,具体而言,涉及一种数据地址的确定方法、装置、存储介质和电子装置。
背景技术
目前,字典树的实现方法可以通过数组来实现,比如,使用指针数组来实现,也即,在每一个节点上都开辟字符表大小(字符表中包括所有可能的字符)的指针数组。
在通常情况下,字典树都很稀疏,假设每个节点最多有N个孩子节点,每个孩子节点使用一个指针表示,在64位计算机上,一个指针占用8个字节,则需要8*N个字节的内存来存储孩子节点的位置,而在大部分情况下,这些指针中包括空指针,都是浪费内存。
为了减少内存的浪费,一种常见的实现字典树的方法是使用双数组法,利用有限状态机(DFA)的思想,借助基数组(base)和核对数组(check),实现了字典树,其中。base数组的每个元素用于表示一个字典树(Trie)的节点,即用于一个状态,check数组表示某个状态的前驱状态。但是该算法思想不易理解,并且实现复杂,不便于项目维护。
针对上述的数据存储浪费存储空间的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供了一种数据地址的确定方法、装置、存储介质和电子装置,以至少解决相关技术数据存储浪费存储空间的技术问题。
根据本发明实施例的一个方面,提供了一种数据地址的确定方法。该方法包括:在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中;获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点;将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址
根据本发明实施例的另一方面,还提供了一种数据地址的确定装置。该装置包括:第一获取单元,用于在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中;第二获取单元,用于获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点;偏移单元,用于将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。
根据本发明实施例的另一方面,还提供了一种存储介质。该存储介质中存储有计算机程序,其中,计算机程序被设置为运行时执行本发明实施例的数据地址的确定方法。
根据本发明实施例的另一方面,还提供了一种电子装置。该电子装置包括存储器和处理器,其特征在于,存储器中存储有计算机程序,处理器被设置为通过计算机程序执行本发明实施例的数据地址的确定方法。
在本发明实施例中,采用在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中;获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点;将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。由于用连续内存来存储目标父节点下的多个目标子节点,而不需要存储全部的子节点,避免了内存的浪费,进而将已获取到的第二地址,偏移待确定的第一地址相对于第二地址的目标偏移量,得到第一地址,达到了在节约内存的情况下对第一地址进行确定的目的,从而实现了节约数据的存储空间的技术效果,进而解决了相关技术数据存储浪费存储空间的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的一种数据地址的确定的硬件环境的示意图;
图2是根据本发明实施例的一种数据地址的确定方法的流程图;
图3是根据本发明实施例的一种经典字典树的存储方法的示意图;
图4是根据本发明实施例的一种Bitmap_trie的存储结构的示意图;
图5是根据本发明实施例的一种孩子节点存储的示意图;
图6是根据本发明实施例的另一种Bitmap_trie的存储结构的示意图;
图7是根据本发明实施例的一种数据地址的确定装置的示意图;以及
图8是根据本发明实施例的一种电子装置的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、***、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本发明实施例的一个方面,提供了一种数据地址的确定方法的实施例。
可选地,在本实施例中,上述数据地址的确定方法可以应用于如图1所示的由服务器102和终端104所构成的硬件环境中。图1是根据本发明实施例的一种数据地址的确定的硬件环境的示意图。如图1所示,服务器102通过网络与终端104进行连接,上述网络包括但不限于:广域网、城域网或局域网,终端104并不限定于PC、手机、平板电脑等。本发明实施例的数据地址的确定方法可以由服务器102来执行,也可以由终端104来执行,还可以是由服务器102和终端104共同执行。其中,终端104执行本发明实施例的数据地址的确定方法也可以是由安装在其上的客户端来执行。
图2是根据本发明实施例的一种数据地址的确定方法的流程图。如图2所示,该方法可以包括以下步骤:
步骤S202,在目标数据结构中获取目标父节点下的多个目标子节点。
在本申请上述步骤S202提供的技术方案中,在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中。
在该实施例中,目标数据结构可以为由负载均衡模块构建的静态数据结构,可以通过位图(Bitmap)来存储同一个目标父节点下的多个目标子节点的信息,比如,用于存储同一个目标父节点下的多个目标子节点在目标字符串中是否存在,可选地,通过Bitmap位上的‘0’表示对应的目标子节点在目标字符串中不存在,通过位上的‘1’表示对应的目标子节点在目标字符串中存在,并且利用连续内存来存储目标父节点下的多个目标子节点,比如,多个目标子节点为'a'、'c'、'f'、'h',占用连续的内存,只需要四个指针占用的内存。
可选地,该实施例的目标数据结构通过Bitmap_trie来表示,通过在字典树的父节点中,存储多个目标子节点所属的连续内存的首地址和Bitmap,而不是在每一个节点上都开辟字符表大小(字符表中包括所有可能的字符)的指针数组来存储所有的子节点,从而极大地节省了内存,其中,连续内存的首地址用于计算待确定的子节点在连续内存中的地址。
该实施例在目标数据结构中获取目标父节点下的多个目标子节点,也即,多个目标子节点具有相同的目标父节点,该多个目标子节点为目标父节点下的多个孩子节点,可以为a~z(26个小写字母)中的多个字母,比如,目标父节点为‘x’,存在四个目标子节点'a'、'c'、'f'、'h';该多个目标子节点也可以***数字中的多个数字,还可以ASSIC表中的多个字符等,此处不做限制。该多个目标子节点按照目标顺序存储在连续内存中,该目标顺序可以为a~z的字母排列顺序或z~a的字母排列顺序,也可以为数字从小到大的顺序或从大到小的顺序,也可以为ASSIC表中的多个字符的排列顺序,可以预先设置好以作为多个目标子节点在内存中连续存储的默认顺序。
步骤S204,获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量。
在本申请上述步骤S204提供的技术方案中,获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点。
在该实施例中,在目标数据结构中获取目标父节点下的多个目标子节点之后,获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量。该待确定的第一地址为当前需要确的、多个目标子节点中的第一目标子节点在连续内存中的位置,比如,目标父节点为‘x’,存在四个目标子节点'a'、'c'、'f'、'h',其中,第一目标子节点可以为'f'。已获取到的第二地址可以为目标数据结构中已存储的第二目标子节点在连续内存中的地址,该第二目标子节点可以为多个目标子节点中的首孩子节点,第二目标子节点在连续内存中的地址也即连续内存的首地址,其它目标子节点在连续内存中的地址,都是按照该第二目标子节点在连续内存中的第二地址进行偏移的,比如,第二目标子节点为'a',可以通过指针来表示第二目标子节点在连续内存中的地址,可选地,通过Children指针来表示第二目标子节点在连续内存中的地址。由于目标数据结构存储了第二地址,通过获取待确定的第一地址相对于第二地址的目标偏移量(Offset),以获取第一目标子节点在连续内存中的第一地址。
举例而言,孩子节点小于64个,则可以用下面的方式来定义节点struct Bitmap_trie_node:
struct Bitmap_trie_node{
__u64 bit_map;
struct Bitmap_trie_node*children;
}
其中,children指针用于表示孩子节点的首地址,bit_map用于存储孩子节点的相关信息,比如,用于存储具有相同父节点的孩子节点的数量,孩子节点的地址与孩子节点的首地址之间的偏移量等。
步骤S206,将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。
在本申请上述步骤S206提供的技术方案中,目标偏移量为待确定的第一地址相对于从目标数据结构中已获取到的第二地址的偏移量,在获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量之后,将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址,比如,将第二地址加上目标偏移量,就得到第一目标子节点在连续内存中的第一地址。
可选地,该实施例中除了确定第一目标子节点在连续内存中的第一地址之外,还可以通过上述方法确定第三目标子节点在连续内存中的第三地址,该第三目标子节点为目标父节点下的多个目标子节点中除第一目标子节点、第二目标子节点之外的其它的目标子节点。
在该实施例中,使用目标数据结构进行存储,同一个目标父节点的所有目标子节点所属的内存连续,整体节点数和传统字典树的节点数相同。但是,传统字典树是使用指针来查找子节点的,如果需要存储26个英文字母,则传统字典树的每个节点就需要存储26个英文字母的指针,而该实施例的目标数据结构只需要存储第二地址和一个用于存储目标父节点下的多个目标子节点的信息的Bitmap,就可以用于查找第一目标子节点在连续内存中的第一地址,这样在存储第二地址和一个用于存储目标父节点下的多个目标子节点的信息时,只需要占用两个指针的内存,而这只占用传统字典树的十三分之一,从而极大地节省了数据存储的内存,并且不降低子节点的查找性能。
通过上述步骤S202至步骤S206,采用在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中;获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点;将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。由于用连续内存来存储目标父节点下的多个目标子节点,而不需要存储全部的子节点,避免了内存的浪费,进而将已获取到的第二地址,偏移待确定的第一地址相对于第二地址的目标偏移量,得到第一地址,达到了在节约内存的情况下对第一地址进行确定的目的,从而实现了节约数据的存储空间的技术效果,进而解决了相关技术数据存储浪费存储空间的技术问题。
作为一种可选的实施方式,在步骤S202,在目标数据结构中获取目标父节点下的多个目标子节点之前,该方法还包括:将包括多个目标子节点的子节点组中的子节点按照目标顺序映射到目标位图中对应的位,其中,目标数据结构包括目标位图;在目标数据结构中获取目标父节点下的多个目标子节点包括:在目标位图中获取目标父节点下的多个目标子节点;获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量包括:在目标位图中,根据第一位和第二位确定目标偏移量,其中,第一位为第一目标子节点在目标位图中映射的位,第二位为第二目标子节点在目标位图中映射的位。
在该实施例中,可以用目标位图来存储多个目标子节点的信息,该目标位图可以包括多个位(bit),可以将包括多个目标子节点的子节点组按照目标顺序进行排序,并映射到目标数据结构中的目标位图对应的位,也即,通过该目标位图中的多个位来对应子节点组中的各个子节点,比如,上述包括多个目标子节点的子节点组为26个小写字母,将子节点组中的子节点照字母a~z的顺序进行排序,映射到目标位图中对应的位上,通过目标位图上的位的信息来表示子节点组中的各个子节点,比如,通过目标位图上的位为‘1’来表示每个目标子节点,通过目标位图上的位为‘0’来表示子节点组中除多个目标子节点之外的子节点,这样在目标位图中获取目标父节点下的多个目标子节点,进而在目标位图中,根据第一位和第二位确定目标偏移量,其中,第一位为第一目标子节点在目标位图中映射的位,也即,第一位为第一目标子节点在目标位图中对应的映射位置,第二位为第二目标子节点在目标位图中映射的位,也即,第二位为第二目标子节点在目标位图中对应的映射位置。
在目标位图中,根据第一目标子节点在目标位图中映射的位和第二目标子节点在目标位图中映射的位,来确定目标偏移量,进而将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址,实现了在节约数据的存储空间的效果上对第一地址的查找。
作为一种可选的实施方式,将包括多个目标子节点的子节点组中的子节点按照目标顺序映射到目标位图中对应的位包括:在目标位图中将与多个目标子节点对应的位设置为第一值,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值;在目标位图中,根据第一位和第二位确定目标偏移量包括:在目标位图中获取第一位与第二位之间取值为第一值的位的数量;将目标偏移量设置为数量+1,或者,将目标偏移量设置为数量。
在该实施例中,将多个目标子节点和子节点组中除多个目标子节点之外的子节点在目标位图中对应的位上,通过不同的值进行表示以区分多个目标子节点和子节点组中除多个目标子节点之外的子节点,可以在目标位图中将与多个目标子节点对应的位设置为第一值,比如,在目标位图中将与多个目标子节点对应的位设置为‘1’,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值,比如,将与多个目标子节点对应的位设置为‘0’。也即,在目标位图中对应的位设置为第一值,则该位上的子节点可以查找成功,进而确定该子节点在内存中的存储位置,在目标位图中对应的位设置为第二值,则该位上的子节点查找失败。
举例而言,子节点组包括26个小写字母的子节点,目标父节点‘x’下的四个目标子节点为'a','c','f','h',则在当前的目标位图中的表示为00000.......10100101,其中,00000.......10100101共64位,从右到左,第一个‘1’表示'a',第二个‘1’表示'c',第三个‘1’表示'f',第四个‘1’表示'h',26个小写字母中除'a','c','f','h'的小写字母在目标位图上的位设置为‘0’。
在根据第一位和第二位确定目标偏移量时,可以在目标位图中获取第一位与第二位之间取值为第一值的位的数量,比如,上述'f'为第一目标子节点,在目标位图中所对应的位为第一位,上述'a'为第二目标子节点,在目标位图中所对应的位为第二位,可以在目标位图中获取'f'对应的位与'a'对应的位之间取值为‘1’的位的数量,比如,获取00000.......10100101从右到左,第三个‘1’对应的位与第一个‘1’对应的位之间‘1’的数量,为1,这样目标偏移量设置为数量+1,也即2,或者,将目标偏移量设置为1。
作为一种可选的实施方式,将第二地址偏移目标偏移量包括:在将目标偏移量设置为数量+1的情况下,将第二地址加上目标偏移量;或者在将目标偏移量设置为数量的情况下,将第二地址加上目标偏移量+1。
在该实施例中,在将目标偏移量设置为目标位图中第一位与第二位之间取值为第一值的位的数量+1的情况下,在将第二地址偏移目标偏移量时,将第二地址加上目标偏移量,比如,目标父节点‘x’下的四个目标子节点为'a','c','f','h',其中,第一目标子节点为'f',第二目标子节点为'a',在目标位图中的表示为00000.......10100101,从右到左,第三个‘1’(对应于'f')对应的位与第一个‘1’(对应于'a')对应的位之间‘1’的数量,为1,这样可以目标偏移量设置为数量+1,也即2,将第二目标子节点为'a'在连续内存中的第二地址加上2即可得到第一目标子节点'f'在连续内存中的第一地址,从而实现了对第一地址的查找。
可选地,该实施例将目标偏移量设置为目标位图中第一位与第二位之间取值为第一值的位的数量,在将第二地址偏移目标偏移量时,将第二地址加上目标偏移量+1,比如,目标父节点‘x’下的四个目标子节点为'a','c','f','h',其中,第一目标子节点为'f',第二目标子节点为'a',在目标位图中的表示为00000.......10100101,从右到左,第三个‘1’(对应于'f')对应的位与第一个‘1’(对应于'a')对应的位之间‘1’的数量,为1,这样将第二目标子节点为'a'在连续内存中的第二地址加上数量1再加上1,即可得到第一目标子节点'f'在连续内存中的第一地址,从而实现了对第一地址的查找。
作为一种可选的实施方式,将包括多个目标子节点的子节点组中的子节点按照目标顺序映射到目标位图中对应的位包括:在目标位图中将与多个目标子节点对应的位设置为第一值,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值;在目标位图中,根据第一位和第二位确定目标偏移量包括:在目标位图中获取位于第一位右边、且取值为第一值的位的数量,其中,第二位为目标位图的多个位的最右边的首位;将目标偏移量设置为数量。
在该实施例中,目标位图包括多个位,在目标位图中将与多个目标子节点对应的位设置为第一值,比如,第一值为‘1’,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值,比如,第二值为‘0’。
该实施例的第二目标子节点在目标位图中映射的第二位可以为目标位图的多个位最右边的首位,也即,该实施例存储右边第一个目标子节点的地址,该右边第一个目标子节点也即该实施例的上述第二目标子节点,其它的目标子节点按照第二目标子节点的第二地址进行偏移。可选地,该实施例按照字母顺序表来确定第二目标子节点,在存在'a'的情况下,将'a'确定为第二目标子节点,在不存在'a'、存在'b'的情况下,将'b'确定为第二目标子节点,在不存在'a'、'b'、存在'c'的情况下,将'c'确定为第二目标子节点,以次类推。
举例而言,目标位图表示为00000.......10100101,第二目标子节点在目标位图中映射的第二位为右边的第一个‘1’(对应于'a')对应的位,第一目标子节点在目标位图中映射的第一位可以为00000.......10100101从右到左第三个‘1’(对应于'f')对应的位,这样在根据第一位和第二位确定目标偏移量时,可以在目标位图中获取位于第一位右边、且取值为第一值的位的数量,将目标偏移量设置为该数量,比如,获取00000.......10100101从右到左第三个‘1’对应的位的右边、且取值为‘1’的位的数量,也即,为2,将目标偏移量设置为2,这样将第二目标子节点在连续内存中的第二地址加上2,即可得到第一目标子节点在连续内存中的第一地址,从而实现了对第一地址的查找。
作为一种可选的实施方式,在目标位图中获取位于第一位右边、且取值为第一值的位的数量包括:在目标位图中通过位1计数指令获取位于第一位右边、且取值为第一值的位的数量。
在该实施例中,位1计数指令(Popcnt)是中央处理器(Central Processing Unit,简称为CPU)提供的计算一个通过二进制表示的数有多少位是1的指令,可以用于统计目标位图中有多少个设置为‘1’的位,第二位为目标位图的多个位的最右边的首位,通过位1计数指令(Popcnt)获取位于第一位右边、且取值为第一值的位的数量,比如,通过位1计数指令获取第一位右边位中的‘1’的数量,作为目标偏移量,进而将已获取到的第二地址,偏移上述目标偏移量,得到第一地址,达到了在节约内存的情况下对第一地址进行确定的目的。
可选地,在该实施例中,目标位图中位于第一位右边的位的数量为第一数量,将第一位向左偏移第二数量,得到目标二进制数,该第一数量与第二数量之和可以为64;将目标偏移量设置为通过目标内嵌函数获取目标二进制数中的第一值的数量。比如,目标位图表示为00000.......10100101,从右到左,第三个‘1’对应的第一位用于表示‘f’,第一个‘1’对应的第二位用于表示‘a’,位于第一位右边的位的数量为5,将第一位左移59位,这样00000.......10100101就变成目标二进制数0010100000000000000000000....0000,可以通过内嵌函数__builtin_popcountll就可以算出0010100000000000000000000....0000中的‘1’的数量,得到目标偏移量,进而将已获取到的第二地址,偏移上述目标偏移量,得到第一地址,达到了在节约内存的情况下对第一地址进行确定的目的。
作为一种可选的实施方式,在目标数据结构使用的过程中,禁止向目标数据结构添加子节点。
实施例的目标数据结构在创建好之后,第二目标子节点的第二地址、第一目标子节点的第一地址与第二地址之间的偏移量也就确定,如果子节点动态添加至目标数据结构中,则导致整个内存的存储需要重新调整,使得内存的存储结构复杂,因而在目标数据结构使用的过程中,禁止向目标数据结构添加子节点,也即,目标数据结构的子节点不能动态添加,整体的字典树也只能静态创建。
作为一种可选的实施方式,在步骤S206,将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,该方法还包括:在第一地址为合法地址的情况下,对第一地址进行转发;在第一地址为非法地址的情况下,禁止对第一地址进行转发。
在该实施例中,对于大量字符串搜索匹配,其中字符串变化频率不高,但是要求整体占用内存较小、搜索性能高的情况下,可以利用该实施例的目标数据结构(Bitmap_trie)来实现。可选地,在该实施例中,利用云服务器可以很方便地搭建个人站点,但是一些不法分子会利用这种便捷性来搭建一些非法网站,比如,色情、赌博网站等,这就需要对于非法域名的请求进行封禁。非法域名封禁整体流程是***门后台扫描出非法域名,定期下发非法域名到网络负载均衡中间模块,负载均衡模块需要匹配相关域名是否是非法域名,如果是则需要进行封禁。
网络负载均衡模块承担着大量的网络转发任务,性能要求高,所以需要匹配速度快、内存占用小,并且非法域名数量极大,所以该实施例就可通过目标数据结构(Bitmap_trie)来实现。***分下发非法域名到负载均衡模块,负载均衡模块构建静态的目标数据结构。
在将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,通过目标数据结构的查找算法判断第一地址是否为合法地址,在第一地址为合法地址的情况下,对第一地址进行转发,在第一地址为非法地址的情况下,禁止对第一地址进行转发,也即,对第一地址封禁。可选地,也即,判断与第一目标子节点对应的转发数据中的域名,是否匹配非法域名,不匹配非法域名,则转发,如果匹配非法域名,则不再转发。这里利用bitmap_trie的查找算法查找第一地址,判断与第一地址对应的域名是否是非法域名,如果是非法域名则封禁,不是则正常转发。
作为一种可选的实施方式,在步骤S206,将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,该方法还包括:将目标数据结构从第一数据结构更新为第二数据结构;释放第一数据结构中的子节点所占的内存,并将第二数据结构中的子节点存入目标内存。
在该实施例中,目标数据结构可以定期更新,在每次更新时,都需要重新创建目标数据结构,使得目标数据结构由第一数据结构更新为第二数据结构,使用具有第二数据结构的目标数据结构替换具有第一数据结构的目标数据结构,同时释放第一数据结构中的子节点所占的内存,并将第二数据结构中的子节点存入目标内存中。
作为一种可选的实施方式,多个目标子节点在连续内存中的大小为与多个目标子节点具有相同数量的指针所占用的内存的大小。
在该实施例中,多个目标子节点在内存中连续存储,比如,多个目标节点为'a'、'c'、'f'、'h',在内存中连续存储,就需要四个指针占用的内存来进行存储。由于不需要存储子节点组中包括的所有的子节点,比如,不需要存储字符表中包括的所有可能的字符,因而节约了数据存储的内存。
该实施例将具有同一个目标父节点的所有多个目标子节点通过连续内存来存储,而不需要存储全部的子节点,可以通过位1技术计数来进行查找,从而解决了数据存储浪费空间的问题,最终达到极大地节约存储内存的效果,而又不影响数据的查找速度。
下面结合优选的实施例对本发明的技术方案进行说明。
该实施例可以使用Bitmap来存储具有相同父节点的所有孩子节点,用于指示孩子节点是否存在,利用连续内存来存储所有具有相同父节点的孩子节点。在字典树的父节点中,只需要存储上述连续内存的首地址和Bitmap,就可以找到具体孩子节点在连续内存中的存储位置。
该实施例将通过Bitmap_trie来表示利用Bitmap实现字典树的数据结构。
下面对本发明实施例的Bitmap_trie的基本思想与原理进行介绍。
在该实施例中,Bitmap_trie使用Bitmap来存储孩子节点的信息。对于孩子节点按照一定顺序进行排序,比如,按照字母表中字母的顺序、***数字大小、ASSIC表中字符的顺序等进行排序,并在Bitmap_trie映射对应的位置,其中,Bitmap_trie中的bit为1,则表示Bitmap_trie存在该孩子节点,Bitmap_trie中的bit为0,则表示不存在该孩子节点。
举例而言,孩子节点小于64个,则可以用下面的方式来定义节点struct Bitmap_trie_node:
struct Bitmap_trie_node{
__u64bit_map;
struct Bitmap_trie_node*children;
}
其中,children指针用于表示孩子节点的首地址,bit_map用于存储孩子节点的相关信息,比如,用于存储具有相同父节点的孩子节点的数量,孩子节点的地址与孩子节点的首地址之间的偏移量等。
需要说明的是,该实施例的Bitmap_trie在创建好之后,孩子节点的首地址、孩子节点的地址与孩子节点的首地址之间的偏移量也就确定,如果孩子节点动态添加,则导致整个内存的存储需要重新调整,使得内存的存储结构复杂,因而Bitmap_trie的孩子节点不能动态添加,整体的字典树也只能静态创建。
下面对本发明实施例的Bitmap_trie的存储方法进行介绍。
在该实施例中,假设存在abc、abd、acd、bcd四个单词需要存储。
图3是根据本发明实施例的一种经典字典树的存储方法的示意图。如图3所示,每次从父结点开始一次搜索,取得需要查找单词的第一个字母,并根据该字母选择对应的子树,并转到该子树继续进行搜索,在相应的子树上,取得要查找的单词的第二个字母,并进一步选择对应的子树进行搜索,如此进行迭代,直至在某个节点处,单词的所有字母已被取出,完成查找。比如,父节点为Root,子节点包括a,在以a为父节点的子树上,子节点为b、c,在以b为父节点的子树上,子节点为c、d,在以c为父节点的子树上,子节点为d,从而完成单词abc、abd、acd的存储;父节点为Root时,子节点还包括b,在以b为父节点的子树上,子节点为c,在以c为父节点的子树上,子节点为d,从而完成单词bcd的存储。
该实施例利用字符串的公共前缀进行存储,节约存储空间,最大限度地减少无谓的字符串比较,从而提高了查询效率。
图4是根据本发明实施例的一种Bitmap_trie的存储结构的示意图。如图4所示,在存储abc、abd、acd、bcd四个单词时,在具有相同的Root父节点时,子节点为a、b;在具有相同的a父节点时,子节点为b、c;在具有相同的b父节点时,子节点为c、d;在具有相同的c为父节点时,孩子节点只有d;在具有相同的b为父节点时,孩子节点只有c;在具有相同的c为父节点时,孩子节点只有d。
在使用上述Bitmap_trie存储单词时,同一个父节点的所有孩子节点的内存是连续的,整体节点数和传统字典树的节点数相同。但是,传统字典树使用指针来查找子节点,每个节点需要存储26个英文字母的指针(孩子节点为26个小写英文字母),而Bitmap_trie只需要存储连续内存的首地址指针加上一个26bit的Bitmap就可以查找孩子节点,其中,26bit的Bitmap占用一个指针的存储空间,这样Bitmap_trie就只需要占用两个指针的存储空间,因而使用Bitmap_trie节点的内存只占用传统字典树十三分之一的内存,可以极大地节省内存的同时。
下面对本发明实施例的Bitmap_trie的查找算法进行介绍。
Bitmap_trie整体的查找过程和普通字典树查找区别在于每一个节点的查找算法。该实施例重点描述从父节点确定孩子节点位置的算法。下面以Bitmap_trie存储英文单词,孩子节点为26个小写英文字母进行举例说明。
在该实施例中,确定当前字母在bitmap_trie中对应的映射位置。对于26个小写字母,可以用使用bitmap中的0到25位来对应各个小写字母。
当前孩子节点为字母,如果当前字母的对应映射位置在Bitmap中的bit位为0,则表示查找失败;如果当前字母的对应映射位置在Bitmap中的bit位为1,则取出该bit右边所有的位,使用Popcnt指令计算出该bit右边所有位中“1”的个数,将该bit右边所有位中“1”的个数作为当前字母的地址相对于首孩子地址的偏移量Offset,通过首孩子地址加上当前字母的地址相对于首孩子地址的偏移量Offset,从而查找出当前字母在连续内存中的位置。
图5是根据本发明实施例的一种孩子节点存储的示意图。如图5所示,x为父节点‘x’,存在'a','c','f','h'四个孩子节点,'a','c','f','h'四个孩子节点在内存中连续存储,通过64位的二进制数码进行表示,当前的Bitmap为00000.......10100101。
其中,从右向左,'a','c','f','h'四个孩子节点对应的位用1表示,而'b','d','e','g'以及其它小写字幕对应的位用0表示。
其中,首地址指向'a'所在的孩子节点,要查找'f'节点(由00000.......10100101倒数第3个1所表示)的位置,首先计算'f'的右边的1的数量,为2,将2作为'f'的地址相对于'a'所在的孩子节点的地址的偏移量Offset,然后将'a'所在的孩子节点的地址加上偏移量Offset就可以确定'f'在连续内存中的地址。
可选地,在计算'f'的偏移(也就是'f'右边有多少个1)的方法是通过先将bitmap中的'f'左移59位,这样将bitmap中的'f'左移59位后的bitmap表示为:0010100000000000000000000....0000。
然后可以使用内嵌函数__builtin_popcountll,就可以算出这个64位整数中的‘1’的个数,也即,得到'f'右边‘1’的个数,从而计算得到'f'的偏移。
下面对本发明实施例的Bitmap_trie的应用场景进行介绍。
该实施例可以应用于词库查询、拼音输入、搜索引擎提示等。下面通过Bitmap_trie实现词库查询进行举例说明。
假设词库中只有“中国”、“中国人”、“中华”这三个词语,静态构建Bitmap_trie来存储“中国”、“中国人”、“中华”这三个词语,其中,在通过Bitmap_trie存储“中国”、“中国人”、“中华”这三个词语之后,首地址、其它子节点的地址相对首地址的偏移量也都确定,如果再动态添加子节点至Bitmap_trie中,则导致整个内存的存储需要重新调整,使得内存的存储结构复杂,因而禁止再向其添加其它的子节点。
图6是根据本发明实施例的另一种Bitmap_trie的存储结构的示意图。如图6所示,同一个父节点的所有子节点在内存中连续,父节点为Root,其子节点为“中”,在以“中”为父节点的子树上,子节点为“国”、“华”,“国”、“华”在连续内存中的存储地址连续,在以“国”为父节点的子树上,子节点为“人”,为了区分“中国”和“中国人”,在“中国”后面加上结束符“$”。
该实施例使用Bitmap来存储子节点的信息,比如,对于以“中”为父节点的子树上,子节点为“国”、“华”,使用Bitmap来存储子节点“国”、“华”的信息,对于“国”、“华”按照一定顺序进行排序,并在Bitmap中映射对应的位置,可选地,Bitmap的位为“1”表示存在该子节点,Bitmap的位为“0”表示不存在子节点。确定子节点“国”、“华”所占的连续内存的首地址,通过子节点“国”、“华”在Bitmap中映射的位置,确定子节点在连续内存中的地址相对首地址的偏移量,比如,以“国”在连续内存中的地址为首地址,通过子节点“国”、“华”在Bitmap中映射的位置,确定子节点“华”相对于“国”的偏移量,比如,为1,进而将首地址加上偏移1得到子节点“华”在连续内存中的地址。
通过上述方法进而可以查找到其它子节点在连续内存中的地址。
可选地,在进行词库查询时,当输入“中”的时候,可以在Bitmap_trie中查找“中”的所有子节点,在这时,候选有“中国”、“中国人”、“中华”,在继续输入“国”之后,查找“国”的所有子节点,候选有“中国”、“中国人”。如果这个时候按回车,就可匹配结束符“$”,给出正确的输入结果“中国”。
下面继续以拼音输入法的提示为例说明Bitmap_trie在词库查询方法中的应用。
在进行词库查询时,当输入拼音“zhong”的时候,可以显示查找与“zhong”对应的“中”的所有子节点,在这时,候选有“中国”、“中国人”、“中华”,当继续输入“guo”之后,查找与“guo”对应的“国”的所有子节点,在这时,候选有“中国”、“中国人”。如果这个时候按回车,就可匹配结束符,给出与拼音输入对应的正确结果“中国”。
上述方法同样试用于搜索引擎提示的场景中。
在该实施例中,对于大量的字符串搜索匹配场景,在字符串变化频率不高、但是要求整体占用内存较小、搜索性能高的情况下,可以利用Bitmap_trie来进行实现。
作为另外一种示例,该实施例利用云服务器可以很方便地搭建个人站点,但是一些不法分子会利用这种便捷性来搭建一些非法网站,比如,搭建色情、赌博网站等,这时就需要对于非法域名的请求进行封禁。非法域名封禁的整体流程是***门后台扫描出非法域名,定期下发非法域名到网络负载均衡中间模块,负载均衡模块需要匹配相关域名是否是非法域名,如果是非法域名,则进行封禁。
网络负载均衡中间模块承担着大量的网络转发任务,性能要求高,所以需要匹配速度快、内存占用小,并且非法域名数量极大,这样就可以应用Bitmap_trie来实现。
可选地,***下发非法域名到负载均衡模块,负载均衡模块构建静态的Bitmap_trie树。通过Bitmap_trie树查找转发的数据中的域名是否匹配非法域名,如果域名匹配,则不再转发,如果域名不匹配,则转发。这里利用Bitmap_trie的查找算法判断是否是非法域名,如果是非法域名则封禁,不是则正常转发。
该实施例还会定期更新非法域名。在每次更新非法域名时,都重新创建Bitmap_trie树,然后使用新的Bitmap_trie替换旧的Bitmap_trie,同时释放旧的Bitmap_trie占用的内存。
该实施例将字典树和bitmap进行结合,将具有同一个父节点的所有孩子节点通过连续内存来存储字典树的孩子节点,可以使用Popcnt指令来进行查找,从而解决了数据存储浪费空间的问题,最终达到极大地节约存储内存的效果。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
根据本发明实施例的另一方面,还提供了一种用于实施上述数据地址的确定方法的数据地址的确定装置。图7是根据本发明实施例的一种数据地址的确定装置的示意图。如图7所示,该数据地址的确定装置700可以包括:第一获取单元10、第二获取单元20和偏移单元30。
第一获取单元10,用于在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中。
第二获取单元20,用于获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点;
偏移单元30,用于将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。
可选地,该装置还包括:映射单元,用于在目标数据结构中获取目标父节点下的多个目标子节点之前,将包括多个目标子节点的子节点组中的子节点按照目标顺序映射到目标位图中对应的位,其中,目标数据结构包括目标位图;第一获取单元10包括:获取模块,用于在目标位图中获取目标父节点下的多个目标子节点;第二获取单元20包括:确定模块,用于在目标位图中,根据第一位和第二位确定目标偏移量,其中,第一位为第一目标子节点在目标位图中映射的位,第二位为第二目标子节点在目标位图中映射的位。
可选地,映射单元包括:设置模块,用于在目标位图中将与多个目标子节点对应的位设置为第一值,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值;确定模块包括:获取子模块,用于在目标位图中获取第一位与第二位之间取值为第一值的位的数量;设置子模块,用于将目标偏移量设置为数量+1,或者,将目标偏移量设置为数量。
可选地,偏移单元30包括:第一相加模块,用于在将目标偏移量设置为数量+1的情况下,将第二地址加上目标偏移量;或者第二相加模块,用于在将目标偏移量设置为数量的情况下,将第二地址加上目标偏移量+1。
可选地,映射单元包括:设置模块,用于在目标位图中将与多个目标子节点对应的位设置为第一值,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值;确定模块包括:第一获取子模块,用于在目标位图中获取位于第一位右边、且取值为第一值的位的数量,其中,第二位为目标位图的多个位的最右边的首位;将目标偏移量设置为数量。
可选地,第一获取子模块用于通过以下步骤来在目标位图中获取位于第一位右边、且取值为第一值的位的数量:在目标位图中通过位1计数指令获取位于第一位右边、且取值为第一值的位的数量。
可选地,该实施例在目标数据结构使用的过程中,禁止向目标数据结构添加子节点。
可选地,该装置还包括:转发单元,用于在将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,在第一地址为合法地址的情况下,对第一地址进行转发;禁止单元,用于在第一地址为非法地址的情况下,禁止对第一地址进行转发。
可选地,该装置还包括:更新单元,用于在将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,将目标数据结构从第一数据结构更新为第二数据结构;处理单元,用于释放第一数据结构中的子节点所占的内存,并将第二数据结构中的子节点存入目标内存。
可选地,该实施例的多个目标子节点在连续内存中的大小为与多个目标子节点具有相同数量的指针所占用的内存的大小。
需要说明的是,该实施例中第一获取单元10可以用于执行本申请实施例中的步骤S202,该实施例中的第二获取单元20可以用于执行本申请实施例中的步骤S204,该实施例中的偏移单元30可以用于执行本申请实施例中的步骤S206。
该实施例通过第一获取单元10在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中,通过第二获取单元20获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点,通过偏移单元30将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。由于用连续内存来存储目标父节点下的多个目标子节点,而不需要存储全部的子节点,避免了内存的浪费,进而将已获取到的第二地址,偏移待确定的第一地址相对于第二地址的目标偏移量,得到第一地址,达到了在节约内存的情况下对第一地址进行确定的目的,从而实现了节约数据的存储空间的技术效果,进而解决了相关技术数据存储浪费存储空间的技术问题。
此处需要说明的是,上述单元和模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现,其中,硬件环境包括网络环境。
根据本发明实施例的又一方面,还提供了一种用于实施上述数据地址的确定方法的电子装置。
图8是根据本发明实施例的一种电子装置的结构框图。如图8所示,该的电子装置可以包括:包括存储器801和处理器803,该存储器801中存储有计算机程序,该处理器803被设置为通过计算机程序执行上述任一项方法实施例中的步骤。可选地,如图8所示,该电子装置还可以包括传输装置805和输入输出设备807。
可选地,在本实施例中,上述电子装置可以位于计算机网络的多个网络设备中的至少一个网络设备。
可选地,在本实施例中,上述处理器803可以被设置为通过计算机程序执行以下步骤:
在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中;
获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点;
将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。
处理器803还用于执行下述步骤:在目标数据结构中获取目标父节点下的多个目标子节点之前,将包括多个目标子节点的子节点组中的子节点按照目标顺序映射到目标位图中对应的位,其中,目标数据结构包括目标位图;在目标位图中获取目标父节点下的多个目标子节点;在目标位图中,根据第一位和第二位确定目标偏移量,其中,第一位为第一目标子节点在目标位图中映射的位,第二位为第二目标子节点在目标位图中映射的位。
处理器803还用于执行下述步骤:在目标位图中将与多个目标子节点对应的位设置为第一值,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值;在目标位图中获取第一位与第二位之间取值为第一值的位的数量;将目标偏移量设置为数量+1,或者,将目标偏移量设置为数量。
处理器803还用于执行下述步骤:在将目标偏移量设置为数量+1的情况下,将第二地址加上目标偏移量;或者在将目标偏移量设置为数量的情况下,将第二地址加上目标偏移量+1。
处理器803还用于执行下述步骤:在目标位图中将与多个目标子节点对应的位设置为第一值,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值;在目标位图中,根据第一位和第二位确定目标偏移量包括:在目标位图中获取位于第一位右边、且取值为第一值的位的数量,其中,第二位为目标位图的多个位的最右边的首位;将目标偏移量设置为数量。
处理器803还用于执行下述步骤:在目标位图中通过位1计数指令获取位于第一位右边、且取值为第一值的位的数量。
处理器803还用于执行下述步骤:在目标数据结构使用的过程中,禁止向目标数据结构添加子节点。
处理器803还用于执行下述步骤:在将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,在第一地址为合法地址的情况下,对第一地址进行转发;在第一地址为非法地址的情况下,禁止对第一地址进行转发。
处理器803还用于执行下述步骤:在将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,将目标数据结构从第一数据结构更新为第二数据结构;释放第一数据结构中的子节点所占的内存,并将第二数据结构中的子节点存入目标内存。
可选地,本领域普通技术人员可以理解,图8所示的结构仅为示意,电子装置也可以是智能手机(如AndroID手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,MID)、PAD等终端设备。图8其并不对上述电子装置的结构造成限定。例如,电子装置还可包括比图8中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图8所示不同的配置。
其中,存储器801可用于存储软件程序以及模块,如本发明实施例中的数据处理方法和装置对应的程序指令/模块,处理器803通过运行存储在存储器801内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的数据处理方法。存储器801可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器801可进一步包括相对于处理器803远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
上述的传输装置805用于经由一个网络接收或者发送数据。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置805包括一个网络适配器(NetworkInterface Controller,NIC),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置805为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
其中,具体地,存储器801用于存储应用程序。
采用本发明实施例,提供了一种数据地址的确定的方案。采用在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中;获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点;将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。由于用连续内存来存储目标父节点下的多个目标子节点,而不需要存储全部的子节点,避免了内存的浪费,进而将已获取到的第二地址,偏移待确定的第一地址相对于第二地址的目标偏移量,得到第一地址,达到了在节约内存的情况下对第一地址进行确定的目的,从而实现了节约数据的存储空间的技术效果,进而解决了相关技术数据存储浪费存储空间的技术问题。
本发明的实施例还提供了一种存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
在目标数据结构中获取目标父节点下的多个目标子节点,其中,多个目标子节点按照目标顺序存储在连续内存中;
获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,第一地址为第一目标子节点在连续内存中的地址,第二地址为第二目标子节点在连续内存中的地址,多个目标子节点包括第一目标子节点和第二目标子节点;
将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在目标数据结构中获取目标父节点下的多个目标子节点之前,将包括多个目标子节点的子节点组中的子节点按照目标顺序映射到目标位图中对应的位,其中,目标数据结构包括目标位图;在目标位图中获取目标父节点下的多个目标子节点;在目标位图中,根据第一位和第二位确定目标偏移量,其中,第一位为第一目标子节点在目标位图中映射的位,第二位为第二目标子节点在目标位图中映射的位。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在目标位图中将与多个目标子节点对应的位设置为第一值,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值;在目标位图中获取第一位与第二位之间取值为第一值的位的数量;将目标偏移量设置为数量+1,或者,将目标偏移量设置为数量。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在将目标偏移量设置为数量+1的情况下,将第二地址加上目标偏移量;或者在将目标偏移量设置为数量的情况下,将第二地址加上目标偏移量+1。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在目标位图中将与多个目标子节点对应的位设置为第一值,将与子节点组中除多个目标子节点之外的子节点对应的位设置为第二值;在目标位图中,根据第一位和第二位确定目标偏移量包括:在目标位图中获取位于第一位右边、且取值为第一值的位的数量,其中,第二位为目标位图的多个位的最右边的首位;将目标偏移量设置为数量。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在目标位图中通过位1计数指令获取位于第一位右边、且取值为第一值的位的数量。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在目标数据结构使用的过程中,禁止向目标数据结构添加子节点。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,在第一地址为合法地址的情况下,对第一地址进行转发;在第一地址为非法地址的情况下,禁止对第一地址进行转发。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:在将第二地址偏移目标偏移量,得到第一目标子节点在连续内存中的第一地址之后,将目标数据结构从第一数据结构更新为第二数据结构;释放第一数据结构中的子节点所占的内存,并将第二数据结构中的子节点存入目标内存。
可选地,存储介质还被设置为存储用于执行上述实施例中的方法中所包括的步骤的计算机程序,本实施例中对此不再赘述。
可选地,在本实施例中,本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(Random Access Memory,RAM)、磁盘或光盘等。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (15)
1.一种数据地址的确定方法,其特征在于,包括:
在目标数据结构中获取目标父节点下的多个目标子节点,其中,所述多个目标子节点按照目标顺序存储在连续内存中;
获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,所述第一地址为第一目标子节点在所述连续内存中的地址,所述第二地址为第二目标子节点在所述连续内存中的地址,所述多个目标子节点包括所述第一目标子节点和所述第二目标子节点;
将所述第二地址偏移所述目标偏移量,得到所述第一目标子节点在所述连续内存中的所述第一地址。
2.根据权利要求1所述的方法,其特征在于,
在从所述目标数据结构中获取所述目标父节点下的所述多个目标子节点之前,所述方法还包括:将包括所述多个目标子节点的子节点组中的子节点按照所述目标顺序映射到目标位图中对应的位,其中,所述目标数据结构包括所述目标位图;
在所述目标数据结构中获取所述目标父节点下的所述多个目标子节点包括:在所述目标位图中获取所述目标父节点下的所述多个目标子节点;
获取待确定的所述第一地址相对于从目标数据结构中已获取到的所述第二地址的目标偏移量包括:在所述目标位图中,根据第一位和第二位确定所述目标偏移量,其中,所述第一位为所述第一目标子节点在所述目标位图中映射的位,所述第二位为所述第二目标子节点在所述目标位图中映射的位。
3.根据权利要求2所述的方法,其特征在于,
将包括所述多个目标子节点的子节点组中的子节点按照所述目标顺序映射到所述目标位图中对应的位包括:在所述目标位图中将与所述多个目标子节点对应的位设置为第一值,将与所述子节点组中除所述多个目标子节点之外的子节点对应的位设置为第二值;
在所述目标位图中,根据所述第一位和所述第二位确定所述目标偏移量包括:在所述目标位图中获取所述第一位与所述第二位之间取值为所述第一值的位的数量;将所述目标偏移量设置为所述数量+1,或者,将所述目标偏移量设置为所述数量。
4.根据权利要求3所述的方法,其特征在于,将所述第二地址偏移所述目标偏移量包括:
在将所述目标偏移量设置为所述数量+1的情况下,将所述第二地址加上所述目标偏移量;或者
在将所述目标偏移量设置为所述数量的情况下,将所述第二地址加上所述目标偏移量+1。
5.根据权利要求2所述的方法,其特征在于,
将包括所述多个目标子节点的子节点组中的子节点按照所述目标顺序映射到所述目标位图中对应的位包括:在所述目标位图中将与所述多个目标子节点对应的位设置为第一值,将与所述子节点组中除所述多个目标子节点之外的子节点对应的位设置为第二值;
在所述目标位图中,根据所述第一位和所述第二位确定所述目标偏移量包括:在所述目标位图中获取位于所述第一位右边、且取值为第一值的位的数量,其中,所述第二位为所述目标位图的多个位的最右边的首位;将所述目标偏移量设置为所述数量。
6.根据权利要求5所述的方法,其特征在于,在所述目标位图中获取位于所述第一位右边、且取值为所述第一值的位的数量包括:
在所述目标位图中通过位1计数指令获取位于所述第一位右边、且取值为所述第一值的位的数量。
7.根据权利要求1至6中任意一项所述的方法,其特征在于,在所述目标数据结构使用的过程中,禁止向所述目标数据结构添加子节点。
8.根据权利要求1至6中任意一项所述的方法,其特征在于,在将所述第二地址偏移所述目标偏移量,得到所述第一目标子节点在所述连续内存中的所述第一地址之后,所述方法还包括:
在所述第一地址为合法地址的情况下,对所述第一地址进行转发;
在所述第一地址为非法地址的情况下,禁止对所述第一地址进行转发。
9.根据权利要求1至6中任意一项所述的方法,其特征在于,在将所述第二地址偏移所述目标偏移量,得到所述第一目标子节点在所述连续内存中的所述第一地址之后,所述方法还包括:
将所述目标数据结构从第一数据结构更新为第二数据结构;
释放所述第一数据结构中的子节点所占的内存,并将所述第二数据结构中的子节点存入目标内存。
10.根据权利要求1至6中任意一项所述的方法,其特征在于,所述多个目标子节点在所述连续内存中的大小为与所述多个目标子节点具有相同数量的指针所占用的内存的大小。
11.一种数据地址的确定装置,其特征在于,包括:
第一获取单元,用于在目标数据结构中获取目标父节点下的多个目标子节点,其中,所述多个目标子节点按照目标顺序存储在连续内存中;
第二获取单元,用于获取待确定的第一地址相对于从目标数据结构中已获取到的第二地址的目标偏移量,其中,所述第一地址为第一目标子节点在所述连续内存中的地址,所述第二地址为第二目标子节点在所述连续内存中的地址,所述多个目标子节点包括所述第一目标子节点和所述第二目标子节点;
偏移单元,用于将所述第二地址偏移所述目标偏移量,得到所述第一目标子节点在所述连续内存中的所述第一地址。
12.根据权利要求11所述的装置,其特征在于,
所述装置还包括:映射单元,用于在获取所述目标父节点下的所述多个目标子节点之后,将包括所述多个目标子节点的子节点组中的子节点按照所述目标顺序映射到目标位图中对应的位,其中,所述目标数据结构包括所述目标位图;
第二获取单元包括:确定模块,用于在所述目标位图中,根据第一位和第二位确定所述目标偏移量,其中,所述第一位为所述第一目标子节点在所述目标位图中映射的位,所述第二位为所述第二目标子节点在所述目标位图中映射的位。
13.根据权利要求12所述的装置,其特征在于,
所述映射单元包括:设置模块,用于在所述目标位图中将与所述多个目标子节点对应的位设置为第一值,将与所述子节点组中除所述多个目标子节点之外的子节点对应的位设置为第二值;
所述确定模块包括:获取子模块,用于在所述目标位图中获取所述第一位与所述第二位之间取值为所述第一值的位的数量;设置子模块,用于将所述目标偏移量设置为所述数量+1,或者,将所述目标偏移量设置为所述数量。
14.一种存储介质,其特征在于,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行所述权利要求1至10任一项中所述的数据地址的确定方法。
15.一种电子装置,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为通过所述计算机程序执行所述权利要求1至10任一项中所述的数据地址的确定方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810252398.6A CN110309368B (zh) | 2018-03-26 | 2018-03-26 | 数据地址的确定方法、装置、存储介质和电子装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810252398.6A CN110309368B (zh) | 2018-03-26 | 2018-03-26 | 数据地址的确定方法、装置、存储介质和电子装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110309368A true CN110309368A (zh) | 2019-10-08 |
CN110309368B CN110309368B (zh) | 2023-09-22 |
Family
ID=68073487
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810252398.6A Active CN110309368B (zh) | 2018-03-26 | 2018-03-26 | 数据地址的确定方法、装置、存储介质和电子装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110309368B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111026762A (zh) * | 2019-12-12 | 2020-04-17 | 北京金山云网络技术有限公司 | 红黑树索引生成方法、装置、电子设备及存储介质 |
CN111857575A (zh) * | 2020-06-24 | 2020-10-30 | 国汽(北京)智能网联汽车研究院有限公司 | 计算平台内存空间确定方法、装置、设备及存储介质 |
CN112580691A (zh) * | 2020-11-25 | 2021-03-30 | 北京北大千方科技有限公司 | 一种元数据字段的术语匹配方法、匹配***和存储介质 |
CN113157695A (zh) * | 2021-03-29 | 2021-07-23 | 北京字节跳动网络技术有限公司 | 数据处理方法、装置、可读介质及电子设备 |
CN113190471A (zh) * | 2021-06-30 | 2021-07-30 | 飞天诚信科技股份有限公司 | 一种助记词的管理方法及装置 |
CN114638366A (zh) * | 2020-11-30 | 2022-06-17 | 合肥本源量子计算科技有限责任公司 | 量子地址数据的解析方法、装置、存储介质及电子装置 |
CN117492577A (zh) * | 2023-12-29 | 2024-02-02 | 深圳山灵数码科技发展有限公司 | 轻量级字库显示方法、装置、微处理器及电子设备 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20010042186A1 (en) * | 1998-09-29 | 2001-11-15 | Jukka-Pekka Iivonen | Compression of nodes in a trie structure |
US20040008634A1 (en) * | 2002-05-31 | 2004-01-15 | Vijay Rangarajan | Method and apparatus for generating and using enhanced tree bitmap data structures in determining a longest prefix match |
CN101577662A (zh) * | 2008-05-05 | 2009-11-11 | 华为技术有限公司 | 一种基于树形数据结构的最长前缀匹配方法和装置 |
CN102682112A (zh) * | 2012-05-11 | 2012-09-19 | 华为技术有限公司 | 存储方法和装置 |
CN104899297A (zh) * | 2015-06-08 | 2015-09-09 | 南京航空航天大学 | 具有存储感知的混合索引结构 |
CN105677480A (zh) * | 2015-12-31 | 2016-06-15 | 杭州华为数字技术有限公司 | 一种数据处理方法及装置 |
US20160203172A1 (en) * | 2015-01-12 | 2016-07-14 | International Business Machines Corporation | Hardware for a bitmap data structure for efficient storage of heterogeneous lists |
CN107622121A (zh) * | 2017-09-25 | 2018-01-23 | 北京邮电大学 | 一种基于位图数据结构的数据分析方法及装置 |
CN107832343A (zh) * | 2017-10-13 | 2018-03-23 | 天津大学 | 一种基于位图的mbf数据索引结构对数据快速检索的方法 |
-
2018
- 2018-03-26 CN CN201810252398.6A patent/CN110309368B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20010042186A1 (en) * | 1998-09-29 | 2001-11-15 | Jukka-Pekka Iivonen | Compression of nodes in a trie structure |
US20040008634A1 (en) * | 2002-05-31 | 2004-01-15 | Vijay Rangarajan | Method and apparatus for generating and using enhanced tree bitmap data structures in determining a longest prefix match |
CN101577662A (zh) * | 2008-05-05 | 2009-11-11 | 华为技术有限公司 | 一种基于树形数据结构的最长前缀匹配方法和装置 |
CN102682112A (zh) * | 2012-05-11 | 2012-09-19 | 华为技术有限公司 | 存储方法和装置 |
US20160203172A1 (en) * | 2015-01-12 | 2016-07-14 | International Business Machines Corporation | Hardware for a bitmap data structure for efficient storage of heterogeneous lists |
CN104899297A (zh) * | 2015-06-08 | 2015-09-09 | 南京航空航天大学 | 具有存储感知的混合索引结构 |
CN105677480A (zh) * | 2015-12-31 | 2016-06-15 | 杭州华为数字技术有限公司 | 一种数据处理方法及装置 |
CN107622121A (zh) * | 2017-09-25 | 2018-01-23 | 北京邮电大学 | 一种基于位图数据结构的数据分析方法及装置 |
CN107832343A (zh) * | 2017-10-13 | 2018-03-23 | 天津大学 | 一种基于位图的mbf数据索引结构对数据快速检索的方法 |
Non-Patent Citations (1)
Title |
---|
李建辉;张永棠;: "一种基于偏移编码特里树的高效IP寻址算法", 计算机工程, no. 04 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111026762A (zh) * | 2019-12-12 | 2020-04-17 | 北京金山云网络技术有限公司 | 红黑树索引生成方法、装置、电子设备及存储介质 |
CN111857575A (zh) * | 2020-06-24 | 2020-10-30 | 国汽(北京)智能网联汽车研究院有限公司 | 计算平台内存空间确定方法、装置、设备及存储介质 |
CN112580691A (zh) * | 2020-11-25 | 2021-03-30 | 北京北大千方科技有限公司 | 一种元数据字段的术语匹配方法、匹配***和存储介质 |
CN112580691B (zh) * | 2020-11-25 | 2024-05-14 | 北京北大千方科技有限公司 | 一种元数据字段的术语匹配方法、匹配***和存储介质 |
CN114638366A (zh) * | 2020-11-30 | 2022-06-17 | 合肥本源量子计算科技有限责任公司 | 量子地址数据的解析方法、装置、存储介质及电子装置 |
CN114638366B (zh) * | 2020-11-30 | 2023-08-08 | 本源量子计算科技(合肥)股份有限公司 | 量子地址数据的解析方法、装置、存储介质及电子装置 |
CN113157695A (zh) * | 2021-03-29 | 2021-07-23 | 北京字节跳动网络技术有限公司 | 数据处理方法、装置、可读介质及电子设备 |
CN113157695B (zh) * | 2021-03-29 | 2023-06-06 | 抖音视界有限公司 | 数据处理方法、装置、可读介质及电子设备 |
CN113190471A (zh) * | 2021-06-30 | 2021-07-30 | 飞天诚信科技股份有限公司 | 一种助记词的管理方法及装置 |
CN117492577A (zh) * | 2023-12-29 | 2024-02-02 | 深圳山灵数码科技发展有限公司 | 轻量级字库显示方法、装置、微处理器及电子设备 |
CN117492577B (zh) * | 2023-12-29 | 2024-04-16 | 深圳山灵数码科技发展有限公司 | 轻量级字库显示方法、装置、微处理器及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN110309368B (zh) | 2023-09-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110309368A (zh) | 数据地址的确定方法、装置、存储介质和电子装置 | |
Wang et al. | Wire Speed Name Lookup: A {GPU-based} Approach | |
JP4452183B2 (ja) | プログラマブル状態マシンのデータ構造を作成して入力単語連鎖を構文解析する方法、プログラマブル状態マシンのデータ構造を使用して入力単語連鎖に対応する結果として得られた値を検索する方法、ワイヤスピードのディープ・パケット処理を行う方法、ディープ・パケット処理のための装置、チップ埋め込み装置、およびプログラミング・コード命令を含むコンピュータ・プログラム(ディープ・パケット処理のための方法および装置) | |
CN111460311A (zh) | 基于字典树的搜索处理方法、装置、设备和存储介质 | |
CN104426909B (zh) | 用于将图样编译成非确定有限自动机(nfa)图形的方法和计算机*** | |
US7240048B2 (en) | System and method of parallel pattern matching | |
CN106797446B (zh) | 基于存储器的历史搜索 | |
CN107862026B (zh) | 数据存储方法及装置、数据查询方法及装置、电子设备 | |
CN108769111A (zh) | 一种服务器连接方法、计算机可读存储介质及终端设备 | |
US8972450B2 (en) | Multi-stage parallel multi-character string matching device | |
CN108875064B (zh) | 基于FPGA的OpenFlow多维数据匹配查找方法 | |
CN106326475B (zh) | 一种高效的静态哈希表实现方法及*** | |
CN107800631A (zh) | 使用ram中的散列表的tcam规则的有效匹配 | |
KR20010077983A (ko) | 데이터 패킷 분류 방법 및 수단 | |
CN107046586B (zh) | 一种基于类自然语言特征的算法生成域名检测方法 | |
CN100442255C (zh) | 具有条目群组和跳过操作的关联存储器 | |
CN109639579A (zh) | 组播报文的处理方法及装置、存储介质、处理器 | |
CN106326234A (zh) | 流分类方法及装置 | |
CN103460209A (zh) | 编码数据标识符的方法 | |
US9485179B2 (en) | Apparatus and method for scalable and flexible table search in a network switch | |
Wang et al. | Memory-based architecture for multicharacter Aho–Corasick string matching | |
US20140101150A1 (en) | Efficient high performance scalable pipelined searching method using variable stride multibit tries | |
CN112235436A (zh) | 网络地址转换规则匹配方法及设备 | |
CN108875006A (zh) | 确定ip地址所属地区的方法及装置 | |
CN105978868A (zh) | Ip地址权限的查找方法及装置 |
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 |