CN109446198B - 一种基于双数组的trie树节点压缩方法及装置 - Google Patents

一种基于双数组的trie树节点压缩方法及装置 Download PDF

Info

Publication number
CN109446198B
CN109446198B CN201811204439.0A CN201811204439A CN109446198B CN 109446198 B CN109446198 B CN 109446198B CN 201811204439 A CN201811204439 A CN 201811204439A CN 109446198 B CN109446198 B CN 109446198B
Authority
CN
China
Prior art keywords
nodes
leaf
node
value
array
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.)
Active
Application number
CN201811204439.0A
Other languages
English (en)
Other versions
CN109446198A (zh
Inventor
徐国天
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China Criminal Police University
Original Assignee
China Criminal Police University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by China Criminal Police University filed Critical China Criminal Police University
Priority to CN201811204439.0A priority Critical patent/CN109446198B/zh
Publication of CN109446198A publication Critical patent/CN109446198A/zh
Application granted granted Critical
Publication of CN109446198B publication Critical patent/CN109446198B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于双数组的trie树节点压缩方法及装置,该方法包括:由根节点开始,遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点;将所有分枝节点存储于基本双数组中;当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中;或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,对多个叶子节点进行压缩,以位图形式存储于压缩数组中。未压缩前每个叶子节点占8个字节空间,压缩后每个叶子节点对应位图数据中的一个比特位。因此,可以大大节省存储空间,避免不必要的资源浪费。

Description

一种基于双数组的trie树节点压缩方法及装置
技术领域
本发明涉及数据处理技术领域,具体涉及一种基于双数组的trie树节点压缩方法及装置。
背景技术
利用trie树检索一个关键词所需时间与关键词长度和trie树深度有关,最佳情况下一次检索命中目标,时间复杂度为O(1),最差情况下n次检索命中目标,n为trie树的深度,时间复杂度为O(n)。高检索效率使得trie树被广泛应用于自然语言处理、信息检索、词典管理和中文分词等相关领域。
双数组是trie树的一种高效实现,它在降低存储空间需求的同时,保留了trie树关键词检索快速的特点。双数组trie树采用的构造方法是将trie树中全部节点都存储到双数组中,但是双数组trie树中存在大量叶子节点,这些节点下面再无任何子树,其在双数组中仍然消耗了大量存储空间,由此造成了资源的不必要浪费。
发明内容
本发明实施例的目的在于提供一种基于双数组的trie树节点压缩方法及装置,用以解决现有双数组中大量叶子节点占用存储空间而造成资源浪费的问题。
为实现上述目的,本发明实施例提供一种基于双数组的trie树节点压缩方法,trie树链式存储结构中每一个节点都对应词典里一个词汇中的字符,所述方法包括:由根节点开始,遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点;
将所有分枝节点存储于基本双数组中;
当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中;
或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,将叶子节点进行压缩,并存储于压缩数组中,其中压缩数组中每组存储单元存储根节点或一个分枝节点对应的所有叶子子节点的位图数据。
本发明实施例具有如下优点:遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点;将所有分枝节点存储于基本双数组中;当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中;或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,对多个叶子节点进行压缩,以位图形式存储于压缩数组中。未压缩前每个叶子节点占8个字节空间,压缩后每个叶子节点对应位图数据中的一个比特位。因此,可以大大节省存储空间,避免不必要的资源浪费。
为实现上述目的,本发明实施例还提供了一种基于双数组的节点压缩装置,trie树链式存储结构中每一个节点都对应词典里一个词汇中的字符,装置包括:
遍历单元,用于由根节点开始,遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点;
处理单元,用于将所有分枝节点存储于基本双数组中;
当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中;
或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,将叶子节点进行压缩,并存储于压缩数组中,其中压缩数组中每组存储单元存储根节点或一个分枝节点对应的所有叶子子节点的位图数据。
本发明实施例具有如下优点:遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点;将所有分枝节点存储于基本双数组中;当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中;或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,对多个叶子节点进行压缩,以位图形式存储于压缩数组中。未压缩前每个叶子节点占8个字节空间,压缩后每个叶子节点对应位图数据中的一个比特位。因此,可以大大节省存储空间,避免不必要的资源浪费。
附图说明
图1为本发明实施例1提供的一组单词构成的trie树结构示意图;
图2为本发明实施例1提供的一种基于双数组的节点压缩方法流程示意图;
图3为本发明实施例1提供的双数组初始存储状态示意图;
图4为本发明实施例1提供的插入根节点的全部子节点后的双数组示意图;
图5为本发明实施例1提供的插入P的子节点后的双数组示意图;
图6为本发明实施例1提供的插入B的子节点后的双数组示意图;
图7为本发明实施例1提供的插入F的子节点后的双数组示意图;
图8为本发明实施例1提供的插入I的子节点后的双数组示意图;
图9为本发明实施例1提供的插入L的子节点后的双数组示意图;
图10为本发明实施例1提供的插入A的子节点后的双数组示意图;
图11为本发明实施例1提供的全部子节点插入后的双数组示意图;
图12为本发明实施例2提供的一种基于双数组的字节压缩装置结构示意图。
具体实施方式
以下实施例用于说明本发明,但不用来限制本发明的范围。
实施例1
本发明实施例1提供的一种基于双数组的节点压缩方法。该方法可以应用于一种词汇存储和检索的应用场景中。在采用本发明实施例的节点压缩方法之前,需要事先将词汇存储于trie树的链式存储结构中。例如,词典当中存储的单词为BOG、BE、FAR、FAT、FAX、IN、LAB、PA、PIG、PIN、PE,这组单词对应的trie树如图1所示,图1中虚线状态的节点即为叶子节点,其他节点则为分枝节点。
以该trie树链式存储结构为例对本发明实施例的方法作详细的介绍,具体如图2所示,该方法包括:
步骤110,由根节点开始,遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点。
步骤120,将所有分枝节点存储于基本双数组中。
步骤130,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中。
或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,对叶子节点进行压缩,并存储于压缩数组中。
具体的,基本双数组包括base数组和check数组。压缩数组包括base_leaf数组和check_leaf数组。其中,base数组用于存储根节点或分枝节点的所有分枝子节点的基地址,check数组中用于存储父节点的存储位置。base_leaf数组用于存储根节点或分枝节点的所有叶子子节点位图数据,而check_leaf数组则用于存储叶子子节点位图数据的基地址校验值。当然,其限定条件就是根节点或分枝节点的所有叶子子节点的个数是大于或者等于预设数值的。预设数值可以为2。即当叶子子节点数大于或者等于2时,则可以将所有叶子子节点进行压缩。未压缩前每个叶子节点占8个字节空间,压缩后每个叶子节点对应位图数据中的一个比特位。因此,可以大大节省存储空间,避免不必要的资源浪费。显然,这里说明的比较抽象。那么,下面将以图1所示的trie树为例进行说明。
初始状态下,基本双数组中位置1单元存储trie树根节点,其base值设置为0,check值设置为1。除位置1单元之外,其它位置为空闲单元,对应的check值为0,base值将全部空闲单元链接起来,即base[0]=2、base[2]=3、base[3]=4,...以此类推。具体如图3所示,位置0单元的base值用于指向第一个空闲单元,因此,base[0]=2,用于说明第一个空闲单元是位置2的单元。而base[2]=3用于指示下一个空闲单元是位置3的单元,...以此类推。在本例词典中,共有26个英文字母,字符编码规则为A-0,B-1,C-2,D-3,...,Y-24,Z-25。
初始状态下,压缩数组中全部单元均为空闲单元,压缩数组中全部单元的check_leaf初值为0xFC,base_leaf初值为0。
图1中根节点的全部子节点编码依次为B-1,F-5,I-8,L-11,P-15。设置根节点的全部子节点的基地址初始值k=1。可知,check[k+1]=0,check[k+5]=0,check[k+8]=0,check[k+11]=0,check[k+15]=0,即位置2,6,9,12和16均为空闲状态。那么,将图3中的check[2],check[6],check[9],check[12]以及check[16]都设置为其父节点的存储位置值,即根节点的存储位置1。而当前没有检测到这些子节点下面是否还有分枝节点或者叶子节点。因此,对应的base值暂时都设置为0,具体如图4所示。重新调整基本双数组中空闲单元的base值,使得空闲单元重新链接起来。
图1中子节点B、F、I、L和P均有自己的分枝子节点和/或叶子子节点。而其中,P的子节点最多,因此可以优先插入P的子节点。P的子节点共有三个,其中A和E为叶子子节点,I为分枝子节点。
也即是说,P的叶子子节点个数等于预设数值2。那么则需要对其叶子子节点进行压缩。而I为分枝子节点,则需要将其按照上述类似的方式插入到基本双数组中。具体过程如下:
I的对应编码值为8,设置其基地址初始值k=1,由于check[k+8]≠0,说明这个单元不是空闲状态,执行k=k+1,由于check[2+8]=0,这是一个空闲单位,将节点I存入这一位置,即将节点I插入到基本双数组中位置为10的空闲单元。check[10]用于指代I的父节点P的存储位置,即位置16,因此check[10]=16。与上文类似的,base[10]暂时设置为0。
可选的,在压缩叶子子节点时,需要首先确定每一个叶子子节点的位图数据。例如本实施例中,可以将26个英文字母按照8个字母一组进行划分,A-H为第一组,I-P为第二组,Q-X为第三组,Y和Z为第四组。每组对应8个比特位,当字符存在时,将对应比特位设置为1,否则设置为0。那么,A和E的数据位图为10001000,但是其转入到计算机中存储时需要转换为倒序。因此,计算机所存储的数据位图实际为:00010001。将数据位图转换为十六进制,则为0x11。首先设置位图数据的基地址m=0。将0x11存入压缩数组第一组空闲单元,具体如图4所示。下标为0的空闲单元是首组空闲单元,其对应的base_leaf值为初始值00,check_leaf值为初始值0xFC。因此,可以将0x11存入压缩数组中位置为0的空闲单元,即设定base_leaf[0]=0x11。相应的,将位图数据基地址的校验值存入第一组空闲单元的check_leaf中,即设定check_leaf[0]=m mod 0xFC=0mod 0xFC=0,mod为求余运算。
在叶子子节点存储至压缩数组之后,还需要在基本双数组中设置相应的指示信息,用于当后续在基本双数组中查询不到叶子节点时,可以根据指示信息在压缩数组中查询叶子节点。
具体包括:由图4基本双数组中位置0单元的base值可以看出,当前基本双数组中第一个空闲单元的存储位置为3。因此,可以将位置3的空闲单元中,base值填写为P的叶子子节点A和E的位图数据基地址,check值填写为P的分枝子节点I的基地址,即base[3]=m=0,check[3]=k=2。而P节点的存储单元中,base值用于指示叶子子节点和分枝子节点相应信息的存储位置,即base[16]=3,而check[16]=-check[16]=-1。让P节点存储单元中的check值赋值为负值,是用于说明该节点存在压缩叶子子节点。调整后的基本双数组和压缩数组如图5所示。
以上说明的是,由于是首次向压缩数组中填充数据。因此,当前首个空闲单元,即第一组空闲单元的check_leaf值不会与其他空闲单元的check_leaf值相冲突。因此,不需要事先验证是否冲突,而是直接将输入填充进去即可。而后续,在将叶子节点进行压缩时,则需要事先验证check_leaf值是否和其他单元的check_leaf值冲突,如果冲突,则需要重新设定基地址,然后根据重新设定的基地址,再次确定存储叶子节点位图数据的空闲单元。而这将在下文中做详细介绍。
如图1所示,现在可以插入B的子节点。
具体的,B的子节点分别为O和E,其中O为分枝子节点,E为叶子子节点。因为B的叶子子节点个数小于2,由于不会提高存储空间利用效率,因此不对B的叶子子节点进行压缩存储。子节点E的编码为4,O的编码为14。设置子节点存储位置基地址k=1,由于check[1+4]=0,check[1+14]=0,节点B的存储位置为2,设置base[2]=k=1,设置check[1+4]=2,check[1+14]=2,base[1+4]=0,base[1+14]=0,具体如图6所示。其具体原理实际和上文中填充分枝子节点至基本双数组中的原理类似,这里不做过多介绍。
然后,插入F的子节点。
节点F只有一个分枝子节点A,A的编码为0。设置子节点存储位置基地址k=1,由于check[1+0]≠0,说明这个单元不是空闲状态,执行k=k+1,当k=4时,check[4+0]=0,找到一个空闲位置。节点F的存储位置为6,设置check[4+0]=6,base[4+0]=0,base[6]=k=4。调整后的基本双数组和压缩数组如图7所示。
然后插入I的子节点。
节点I有1个叶子子节点N,N的编码值为13。因为I的叶子子节点个数小于2,由于不会提高存储空间利用效率,因此不对I的叶子子节点进行压缩存储。设置子节点存储位置基地址k=1,由于check[1+13]=0,即这是一个空闲位置。节点I的存储位置为9,设置check[1+13]=9,base[1+13]=0,base[9]=k=1。调整后的基本双数组和压缩数组如图8所示。
插入L的子节点。
节点L只有一个分枝子节点A,A的编码为0。设置子节点存储位置基地址k=1,check[1+0]≠0,说明这个单元不是空闲状态,执行k=k+1,当k=7时,check[7+0]=0,找到一个空闲位置。节点L的存储位置为12。设置check[7+0]=12,base[7+0]=0,base[12]=k=7。调整后的基本双数组和压缩数组如图9所示。
在第三层中,A的子节点最多。优先插入A的子节点。
由于A的子节点均为叶子节点,其个数为3个,大于本实施例中设置的预设阈值2。因此,需要对叶子节点进行压缩存储。叶子节点分别是R、T、X,编码为R-17、T-19、X-23。将26个英文字母按照8个字母一组进行划分,A-H为第一组,I-P为第二组,Q-X为第三组,Y和Z为第四组。每组对应8个比特位,当字符存在时,将对应比特位设置为1,否则设置为0。本例中叶子子节点R、T、X处于第三组位图区间,即Q-X字符区间,对应位图数据为01010001,逆序转换后对应二进制值为10001010,相应的十六进制值为0X8A。设置子节点存储位置基地址m=0,在寻找空闲位置时,要求m+2位置为空闲单元,而m+0、m+1和m+3单元是否处于空闲状态,不需要进行判断,但这四个单元中非空闲单元的check_leaf校验值不能相同,否则判定为冲突。在本例中,因为check_leaf[0+2]=0xFC,说明这是一个空闲位置,但如果设置base_leaf[0+2]=0x8A,check_leaf[0+2]=m mod 0xFC=0。
由于check_leaf[0+0]=0x00,check_leaf[0+2]=0x00,两者产生冲突,因此令m=m+1,继续探测。
而这种情况,就是上文所说的check_leaf值与其他单元的check_leaf值相同,而发生的冲突。那么,这种情况,就需要重新设定基地址。并根据基地址重新确定一组新的空闲单元。即,当check_leaf值与位图数据所在区域内其他单元中的check_leaf值相同时,调整基地址的数值;
而继续调整基地址的数值后,当m=1时,check_leaf[1+2]=0xFC,说明这是一个空闲位置,且check_leaf[1+0]、check_leaf[1+1]、check_leaf[1+3]均不等于m mod 0xFC,即不等于1。
则令check_leaf[1+2]=m mod 0xFC=1,base_leaf[1+2]=0x8A。
基本双数组中第一组空闲单位位置为8,A节点位置为4,因A节点无分枝子节点,设置check[8]=-4,即check[8]设置为A节点存储位置的负值,base[8]=m=1,base[4]=8,check[4]=-check[4]=-6。调整base值,使得空闲节点重新连接起来,调整后结果如图10所示。
而插入I的子节点的过程,以及插入O和A子节点的过程均和上文所介绍的类似,这里不做过多的介绍。最终插入完成后的基本双数组和压缩数组示意图如图11所示。
下面,则举例说明如何通过上述基于双数组的节点压缩方法压缩双数组后,对单词进行查找。
案例1:查找字典中存在的单词FAR。
第一步:读入字母F,F不是单词结束字符,如果存在,应是一个分枝节点,因此在基本双数组内查找。F的编码值为5,trie树根节点位置为1,base[1]=1,判断check[1+5]=base[1],因此节点F存在。
第二步:读入字母A,A不是单词结束字符,如果存在,应是一个分枝节点,因此在基本双数组内查找。A的编码值为0,A的父节点F的位置为6,base[6]=4,判断abs(check[4+0])=6,abs()为求绝对值函数。说明节点A存在。
第三步:读入字母R,R是单词结束字符,如果存在,应是一叶子节点,首先在基本双数组内查找,R的父节点是A,节点A的存储位置为4,因为check[4]=-6为负数,说明对A的叶子节点进行了压缩处理,base[4]=8,base[8]=1,1是节点A全部叶子子节点位图数据起始基址m,R的编码值为17,17/8=2,17mod 8=1,即,可以确定R是属于26个字母中的第3组,其编号为02,而基地址值m为1。因此,判断check_leaf[1+2]=m mod 0xFC=0x01,条件为真,继续判断base_leaf[1+2]&((0x01)<<1),其中<<为向左移位运算,&为按位与运算。上述表达式结果为真,查找成功。
案例2:查找一个字典中不存在的单词CAR。
第一步:读入字母C,C不是单词结尾字符,因此在基本双数组内查找。C的编码值为2,trie树根节点位置为1,base[1]=1,判断check[1+2]≠base[1],因此节点C不存在,查找失败。
本发明实施例提供的一种基于双数组的节点压缩方法,遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点;将所有分枝节点存储于基本双数组中;当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中;或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,对多个叶子节点进行压缩,以位图形式存储于压缩数组中。未压缩前每个叶子节点占8个字节空间,压缩后每个叶子节点对应位图数据中的一个比特位。因此,可以大大节省存储空间,避免不必要的资源浪费。
实施例2
与上述实施例相对应的,本发明实施例还提供了一种基于双数组的节点压缩装置,trie树链式存储结构中每一个节点都对应词典中一个词汇的字符。具体如图12所示,该装置包括:遍历单元1101和处理单元1102。
遍历单元1101,用于由根节点开始,遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点;
处理单元1102,用于将所有分枝节点存储于基本双数组中;
当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中;
或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,将叶子节点进行压缩,并存储于压缩数组中,其中压缩数组存储根节点或分枝节点的叶子子节点位图数据。
可选的,处理单元1102还用于,将预存储的词组文件中的词汇插入到trie树链式存储结构中。
可选的,处理单元1102具体用于:
分别确定每一个叶子节点的位图数据;
将位图数据进行转换后存储至压缩数组中的第一组空闲单元,并将第一组空闲单元中的base_leaf值设置为位图数据进行转换后的数值;
将与所述位图数据对应的基地址校验值设置为所述第一组空闲单元中对应位置的check_leaf值。
可选的,处理单元1102还用于,当check_leaf值与位图数据所在区域内除第一组空闲单元之外的存储单元的check_leaf值相同时,调整基地址的数值;
并根据调整后的基地址的数值,重新确定存储转换后的位图数据的空闲单元。
本发明实施例提供的一种基于双数组的节点压缩装置中各个单元所执行的功能均已在实施例1中做了详细介绍,这里不再赘述。
本发明实施例提供的一种基于双数组的节点压缩装置,遍历trie树链式存储结构中所有节点,节点包括分枝节点和叶子节点;将所有分枝节点存储于基本双数组中;当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数小于预设数值时,将叶子节点存储于基本双数组中;或者,当确定根节点或分枝节点的子节点中存在叶子节点,且叶子节点的个数大于或者等于预设数值时,对多个叶子节点进行压缩,以位图形式存储于压缩数组中。未压缩前每个叶子节点占8个字节空间,压缩后每个叶子节点对应位图数据中的一个比特位。因此,可以大大节省存储空间,避免不必要的资源浪费。
虽然,上文中已经用一般性说明及具体实施例对本发明作了详尽的描述,但在本发明基础上,可以对之作一些修改或改进,这对本领域技术人员而言是显而易见的。因此,在不偏离本发明精神的基础上所做的这些修改或改进,均属于本发明要求保护的范围。

Claims (6)

1.一种基于双数组的trie树节点压缩方法,其特征在于,trie树链式存储结构中每一个节点都对应词典里一个词汇中的字符,所述方法包括:
由根节点开始,遍历所述trie树链式存储结构中所有节点,所述节点包括分枝节点和叶子节点;
将所有分枝节点存储于基本双数组中;
当确定所述根节点或分枝节点的子节点中存在叶子节点,且所述叶子节点的个数小于预设数值时,将所述叶子节点存储于基本双数组中;
或者,当确定所述根节点或分枝节点的子节点中存在叶子节点,且所述叶子节点的个数大于或者等于预设数值时,对所述叶子节点进行压缩,并存储于压缩数组中,其中所述压缩数组中每组存储单元存储所述根节点或一个分枝节点对应的所有叶子子节点位图数据;
所述压缩数组包括:base_leaf和check_leaf两个存储数组,当确定所述根节点或分枝节点的子节点中存在叶子节点,且所述叶子节点的个数大于或者等于预设数值时,将所述叶子节点进行压缩,并存储于压缩数组中,具体包括:
分别确定所述根节点或分枝节点的全部叶子子节点位图数据;
将所述位图数据进行转换后存储至压缩数组中的第一组空闲单元,并将所述第一组空闲单元中的base_leaf值设置为所述位图数据进行转换后的数值;
将与所述位图数据对应的基地址校验值设置为所述第一组空闲单元中对应位置的check_leaf值。
2.根据权利要求1所述的方法,其特征在于,所述由根节点开始,遍历所述trie树链式存储结构中所有节点之前,所述方法还包括:
将预存储的词典文件中的词汇插入到trie树链式存储结构中。
3.根据权利要求1所述的方法,其特征在于,当所述check_leaf值与位图数据所在区域内除所述第一组空闲单元之外的存储单元的check_leaf值相同时,调整所述基地址的数值;
并根据调整后的基地址的数值,重新确定存储所述转换后的位图数据的空闲单元。
4.一种基于双数组的节点压缩装置,其特征在于,trie树链式存储结构中每一个节点都对应词典里一个词汇中的字符,所述装置包括:
遍历单元,用于由根节点开始,遍历所述trie树链式存储结构中所有节点,所述节点包括分枝节点和叶子节点;
处理单元,用于将所有分枝节点存储于基本双数组中;
当确定所述根节点或分枝节点的子节点中存在叶子节点,且所述叶子节点的个数小于预设数值时,将所述叶子节点存储于基本双数组中;
或者,当确定所述根节点或分枝节点的子节点中存在叶子节点,且所述叶子节点的个数大于或者等于预设数值时,对所述叶子节点进行压缩,并存储于压缩数组中,其中所述压缩数组中每组存储单元存储所述根节点或一个分枝节点对应的所有叶子子节点位图数据;
所述处理单元具体用于:
分别确定所述根节点或分枝节点的全部叶子子节点位图数据;
将所述位图数据进行转换后存储至压缩数组中的第一组空闲单元,并将所述第一组空闲单元中的base_leaf值设置为所述位图数据进行转换后的数值;
将与所述位图数据对应的基地址校验值设置为所述第一组空闲单元中对应位置的check_leaf值。
5.根据权利要求4所述的装置,其特征在于,所述处理单元还用于,将预存储的词组文件中的词汇插入到trie树链式存储结构中。
6.根据权利要求4所述的装置,其特征在于,所述处理单元还用于,当所述check_leaf值与位图数据所在区域内除所述第一组空闲单元之外的存储单元的check_leaf值相同时,调整所述基地址的数值;
并根据调整后的基地址的数值,重新确定存储所述转换后的位图数据的空闲单元。
CN201811204439.0A 2018-10-16 2018-10-16 一种基于双数组的trie树节点压缩方法及装置 Active CN109446198B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811204439.0A CN109446198B (zh) 2018-10-16 2018-10-16 一种基于双数组的trie树节点压缩方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811204439.0A CN109446198B (zh) 2018-10-16 2018-10-16 一种基于双数组的trie树节点压缩方法及装置

Publications (2)

Publication Number Publication Date
CN109446198A CN109446198A (zh) 2019-03-08
CN109446198B true CN109446198B (zh) 2020-08-07

Family

ID=65545410

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811204439.0A Active CN109446198B (zh) 2018-10-16 2018-10-16 一种基于双数组的trie树节点压缩方法及装置

Country Status (1)

Country Link
CN (1) CN109446198B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110347804B (zh) * 2019-07-22 2023-05-12 同方知网数字出版技术股份有限公司 一种线性时间复杂度的敏感信息检测方法
CN112988912B (zh) * 2021-05-07 2021-11-02 支付宝(杭州)信息技术有限公司 区块链数据存储方法及装置、电子设备

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060020638A1 (en) * 2004-07-21 2006-01-26 Ori Software Development Ltd. Method and apparatus to efficiently navigate and update a pointerless trie
CN103995855B (zh) * 2014-05-14 2017-03-08 华为技术有限公司 存储数据的方法和装置
CN105320669B (zh) * 2014-06-19 2019-09-27 腾讯科技(深圳)有限公司 数据存储、读取方法及数据存储、读取装置
US10262333B2 (en) * 2014-08-07 2019-04-16 Inmobi Pte. Ltd. Linear programming approach for querying a trie data structure
CN106528647B (zh) * 2016-10-15 2019-07-23 传神语联网网络科技股份有限公司 一种基于cedar双数组字典树算法进行术语匹配的方法
CN108509505B (zh) * 2018-03-05 2022-04-12 昆明理工大学 一种基于分区双数组Trie的字符串检索方法及装置

Also Published As

Publication number Publication date
CN109446198A (zh) 2019-03-08

Similar Documents

Publication Publication Date Title
US4782325A (en) Arrangement for data compression
US6563956B1 (en) Method and apparatus for compressing data string
CN109889205B (zh) 编码方法及系统、解码方法及系统、编解码方法及系统
US20060004858A1 (en) Self-Adaptive Prefix Encoding for Stable Node Identifiers
WO2011057680A1 (en) Indexing compressed data
CN105183788A (zh) 一种基于关键词字典树检索的中文ac自动机工作方法
CN109446198B (zh) 一种基于双数组的trie树节点压缩方法及装置
CN111144117B (zh) 知识图谱中文地址消除歧义方法
CN103365991A (zh) 一种基于一维线性空间实现Trie树的词典存储管理方法
WO2010108373A1 (zh) 一种对词库压缩编码及解码的方法和系统
CN108509505A (zh) 一种基于分区双数组Trie的字符串检索方法及装置
CN115840799A (zh) 一种基于深度学习的知识产权综合管理系统
CN100578943C (zh) 一种优化的霍夫曼解码方法和装置
CN101158955A (zh) 一种中文词库的构造方法
CN113553847A (zh) 用于对地址文本进行解析的方法、装置、系统和存储介质
CN100361128C (zh) 一种用于文本或网络内容分析的多关键词匹配方法
CN101551820A (zh) 兴趣点属性的索引数据库的生成方法和装置
US7933885B1 (en) Longest matching prefix search engine with hierarchical decoders
US8976048B2 (en) Efficient processing of Huffman encoded data
CN103294735B (zh) 基于tcam的确定性有穷状态自动机dfa的匹配方法和装置
CN114385624A (zh) 编码方法、编码查找方法、装置、电子设备及存储介质
CN116089663A (zh) 一种规则表达式匹配方法、装置及计算机可读存储介质
CN113630123A (zh) 一种数据压缩系统及方法
CN117349295B (zh) 字词频度统计方法及装置
CN110287147A (zh) 一种字符串排序方法及装置

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