一种基于一维线性空间实现TRIE树的词典存储管理方法.pdf

上传人:zhu****69 文档编号:1486985 上传时间:2018-06-17 格式:PDF 页数:10 大小:496.85KB
返回 下载 相关 举报
摘要
申请专利号:

CN201310288785.2

申请日:

2013.07.03

公开号:

CN103365991A

公开日:

2013.10.23

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||著录事项变更IPC(主分类):G06F 17/30变更事项:发明人变更前:王国印变更后:王国印 贾西贝|||实质审查的生效IPC(主分类):G06F 17/30申请日:20130703|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

深圳市华傲数据技术有限公司

发明人:

王国印

地址:

518057 广东省深圳市南山区高新区中区高新中一道9号软件大厦7层713、715、716室

优先权:

专利代理机构:

代理人:

PDF下载: PDF下载
内容摘要

本发明实施例提供一种基于一维线性空间实现Trie树的词典存储管理方法,该方法包括以下步骤:获取完整的词典数据;生成有序的词典数据并存放在一维数组中;创建Trie树实现对词典数据的存储。本发明采用一维数组代替双数组(base[]和check[]),本方法使得Trie树序列化和反序列化更加便捷,使得词典的加载存储更有效率,同时本发明可以解决双数组实现Trie树的词典数据存储方法中存在的数据移动或存储空间的回溯问题。

权利要求书

1.  一种基于一维线性空间实现Trie树的词典存储管理方法,其特征在于,该方法包括以下步骤:
获取完整的词典数据;
生成有序的词典数据并存放在一维数组中;
创建Trie树实现对词典数据的存储。

2.
  根据权利要求1所述的方法,其特征在于,所述生成有序的词典数据包括:
将词典数据中所有词条和属性信息以Key为中心按词典顺序排序;
合并拥有相同Key值的values。

3.
  根据权利要求1所述的方法,其特征在于,所述一维数组包括:一维数组的偶数位存放双数组的base值,一维数组的奇数位存放双数组的check值。

4.
  根据权利要求1所述的方法,其特征在于,所述创建Trie树包括以下步骤:
定义起始状态,编号为0;
将起始状态放入双数组第0位置;
以起始状态为当前状态;
获取当前状态的所有直接后继状态的信息;
为当前结点寻找一个合适的base值,插入其所有直接后继结点。

5.
  根据权利要求1所述的方法,其特征在于,所述词典顺序排序还包括:
拥有公共前缀的keys相邻。

6.
  根据权利要求1或权利要求4所述的方法,其特征在于,所述状态的信息包括:
用一个数据机构Node存储每个状态的信息;
每个状态的信息包含:当前输入字符、状态的深度、第一个拥有当前状态key的编号、最后一个拥有当前状态key的下一个编号、拥有当前状态key的数量。

7.
  根据权利要求1或权利要求6所述的方法,其特征在于,所述的key包括:
在每个key后面添加一个虚拟字符代表叶子结点(终端结点),每个叶子结点虚拟字符的存储位置由其直接前驱的base值确定。

说明书

一种基于一维线性空间实现Trie树的词典存储管理方法
技术领域
本发明涉及一种词典存储管理方法,尤其涉及一种基于一维线性空间实现Trie树的词典存储管理方法。
背景技术
在信息检索和自然语言处理领域,特别是基于词典的技术应用中,词典的规模一般都非常大,拥有成千上万甚至上亿条记录,尤其是搜索引擎中倒排索引词的规模最为庞大。对海量数据词典的存储,当前通常采用索引的数据结构来实现。常用的索引结构包括线性索引表、倒排表、散列(hash)表和搜索树等。当前网络上流行的Trie树的实现版本一般都是基于双数组的,两个数组的名字分别为base[]和check[],数组中的每一个元素下标i相当于Trie树的一个结点编号或在双数组中的存储位置,又称状态编号。
base[i]:存放的是当前状态i到所有后继状态最小无冲突的偏移量;
check[i]:存放的是当前状态i的直接前驱信息,即存储当前状态是由哪一个状态转移而来;
base和check是成对的;
base[i]和check[i]代表同一个状态的属性。
然而这种基于双数组实现的Trie树的词典数据存储方法存在着这样一个问题:会因为插入新状态而引起的冲突导致要移动大量存在冲突的词典数据,不仅会导致词典数据存储速率慢,也会导致数据移动或存储空间的回溯问题。
发明内容
为了解决上述技术的缺陷之一,本发明实施例提供一种基于一维线性空间实现Trie树的词典存储管理方法,本发明采用一维数组代替双数组(base[]和check[]),本方法使得Trie树序列化和反序列化更加便捷,使得词典的加载存储更有效率,同时本发明可以解决双数组实现Trie树的词典数据存储方法中存在的数据移动或存储空间的回溯问题。
为此,本发明实施例公开了一种基于一维线性空间实现Trie树的词典存储管理方法。该方法包括以下步骤:获取完整的词典数据;生成有序的词典数据并存放在一维数组中;创建 Trie树实现对词典数据的存储。
在本发明实施例中,使用一维数组代替双数组(base[]和check[]),此种做法的好处使得Trie树序列化和反序列化更加简单,使得词典的加载更加容易。具体做法可以将base数组放在一维数组的偶数位,check数组放在奇数位,对应关系如下:
base[i]->>array[2*i];
check[i]->>array[2*i+1].
在本发明的一个实施例中,所述生成有序的词典数据包括:
将词典数据中所有词条和属性信息以Key为中心按词典顺序排序;
合并拥有相同Key值的values。
在本发明的一个实施例中,所述的key包括:
在每个key后面添加一个虚拟字符代表叶子结点(终端结点),每个叶子结点虚拟字符的存储位置由其直接前驱的base值确定。
本发明实施例中,允许让每个key带上自己的属性值values(词性或者其他标注信息)。当前很多Trie树的实现版本,只能存储key,无法将key和key的属性或解释信息(统称为values)直接关联起来。本方法的解决方式是在每个key后面加一个虚拟字符“$”代表叶子结点(终端结点),使得原先的终端结点变为非终端结点,在其后增加一个终端结点“$”作为其直接后继。把每个叶子结点“$”(终端结点)的base值赋上其所处的key按词典顺序序号的相反数-m(m为当前key在所有词条集中的词典顺序序号,m能直接确定相关key对应的values的存储位置),每个叶子结点“$”的存储位置,直接由其直接前驱的base值确定,同时叶子结点的直接前驱定义为自己,即叶子结点的check值等于其状态编号即逻辑存储位置。
在本发明的一个实施例中,所述词典顺序排序还包括:
拥有公共前缀的keys相邻。
在本发明的一个实施例中,所述状态的信息包括:
用一个数据机构Node存储每个状态的信息;
每个状态的信息包含:当前输入字符、状态的深度、第一个拥有当前状态key的编号、最后一个拥有当前状态key的下一个编号、拥有当前状态key的数量。
在本发明实施例中,在创建Trie树的过程中为了很好的避免因插入新状态导致冲突而引起的数据移动,要求所有信息按照key有序,才能够获取当前状态的所有直接后继状态的信息(如当前输入的字符c,该状态在Trie树的深度,直接后继状态包含的词条位置范围等)。 为了方便,本发明定义一个数据结构Node存储每个状态的信息。
在本发明的一个实施例中,创建Trie树包括以下步骤:
定义起始状态,编号为0;
将起始状态放入双数组第0位置;
以起始状态为当前状态;
获取当前状态的所有直接后继状态的信息;
为当前结点寻找一个合适的base值,插入其所有直接后继结点。
本发明实施例提供的一种基于一维线性空间实现Trie树的词典存储管理方法能够使Trie树序列化和反序列化更加便捷,提高了词典的数据加载存储效率,同时本发明克服了双数组实现Trie树的词典数据存储方法中存在的数据移动或存储空间的回溯问题。
应当理解,以上总体说明和以下详细说明都是说明性和实例性的,旨在提供对所要求的本发明的进一步说明。
附图说明
图1是本发明实施例一种基于一维线性空间实现Trie树的词典存储管理方法的流程图。
图2是本发明实施例中词典数据前缀树组成的森林的构造图。
图3是本发明实施例中实现Trie树的词典存储的流程的示意图。
图4是本发明实施例中实现Trie树创建时结点的插入顺序流程的示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施例仅仅用于解释本发明,并不用于限定本发明。
本发明实施例提供的一种基于一维线性空间实现Trie树的词典存储管理方法,该方法包括以下步骤:获取完整的词典数据;生成有序的词典数据并存放在一维数组中;创建Trie树实现对词典数据的存储。
如图1所示,是本发明实施例一种一维线性空间实现Trie树的词典存储管理方法的流程图,包括以下步骤:
步骤S110,获取完整的词典数据。
例如,词典中要存放如下表1中的这些词条(key)数据:

中国深圳中国人深圳大学南山深圳市南山区深圳村南山大道龙山镇南山社区龙岗南山街道龙岗区

表1
步骤S120,生成有序的词典数据并存放在一维数组中。
将词典数据中所有词条和属性信息以Key为中心按词典顺序排序;合并拥有相同Key值的values。同时,让拥有公共前缀的keys相邻。根据上述获取的词典数据,那些词之间存在着一些共同的前缀,按照这些前缀树可以组成一个森林,如图2所示,各棵树的结点做如下说明:
虚线圆代表树的终端结点;
实线圆代表数的非终端结点;
从树的根部结点到当前终端结点构成的词是词典中的一条完整词条;
从树的根部结点到某一非终端结点构成的词是词典中某些词条的公共前缀。
由此可以看出在构造Trie树中,一定要存储当前状态的直接前驱信息。当前网络上流行的Trie树的实现版本一般都是基于双数组的,两个数组的名字分别为base[]和check[],数组中的每一个元素下标i相当于Trie树的一个结点编号或在双数组中的存储位置,又称状态编号。
base[i]:存放的是当前状态i到所有后继状态最小无冲突的偏移量。
check[i]:存放的是当前状态i的直接前驱信息,即存储当前状态是由哪一个状态转移而来
base和check是成对的,base[i]和check[i]代表同一个状态的属性
假如当前状态为s,输入的字符为c,下一状态为t,则查询过程的约束条件为:
check[base[s]+c]=s;
base[s]+c=t。
在本发明的一个实施例中,在每个key后面添加一个虚拟字符代表叶子结点(终端结点), 每个叶子结点虚拟字符的存储位置由其直接前驱的base值确定。允许让每个key带上自己的属性值values(词性或者其他标注信息)。当前很多Trie树的实现版本,只能存储key,无法将key和key的属性或解释信息(统称为values)直接关联起来。本方法的解决方式是在每个key后面加一个虚拟字符“$”代表叶子结点(终端结点),使得原先的终端结点变为非终端结点,在其后增加一个终端结点“$”作为其直接后继。把每个叶子结点“$”(终端结点)的base值赋上其所处的key按词典顺序序号的相反数-m(m为当前key在所有词条集中的词典顺序序号,m能直接确定相关key对应的values的存储位置),每个叶子结点“$”的存储位置,直接由其直接前驱的base值确定,同时叶子结点的直接前驱定义为自己,即叶子结点的check值等于其状态编号即逻辑存储位置。
使用一维数组代替双数组(base[]和check[]),此种方法的好处使得Trie树序列化和反序列化更加简单,使得词典的加载更加容易。具体做法可以将base数组放在一维数组的偶数位,check数组放在奇数位,对应关系如下:
base[i]->>array[2*i];
check[i]->>array[2*i+1].
所述一维数组包括:一维数组的偶数位存放双数组的base值,一维数组的奇数位存放双数组的check值。
在创建Trie树的过程中为了很好的避免因插入新状态导致冲突而引起的数据移动,要求所有信息按照key有序,才能够获取当前状态的所有直接后继状态的信息(如当前输入的字符c,该状态在Trie树的深度,直接后继状态包含的词条位置范围等)。为了方便,本发明实施例定义一个数据结构Node存储每个状态的信息,该数据结构用于在创建Trie树时存储新插入的状态信息,主要存储的信息说明包括:
code存储的是当前的输入字符c,可以为c的Unicode值或者字节值,为了规避虚拟的终端结点“$”(终端结点的code为0),本方法定义每个code的值取字符c的Unicode值+1;
depth当前状态在Trie树中的深度+1,即其直接后继在Trie树的深度(Trie树的根结点即初始结点定义为第0层);
start第一个拥有当前状态key的编号;
end最后一个拥有当前状态key的下一个编号;
end-start为拥有当前状态key的数量,即这些key拥有共同的前缀。
步骤S130,创建Trie树实现对词典数据的存储。
如图3所示,是实现Trie树词典数据的存储流程,具体包括以下步骤:
步骤S131,将所有词条和属性信息以key为中心按词典顺序排序,合并拥有相同key值的values,要保证key不存在重复;
步骤S132,定义起始状态,编号为0,其包含的信息值为[code=0,depth=0,start=0,end=N],其中N为词典的规模,即key的数量;
步骤S133,将起始状态放入双数组第0位置,将其base[0]=1(array[2*0]=array[0]=1),并标识base为1的值已经被占用(保证所有状态的base值唯一),check[0]=0(array[2*0+1]=array[1]=0);
步骤S134,以起始状态作为当前状态;
步骤S135,获取当前状态的所有直接后继状态的信息,若直接后继结点列表为空,即当前结点为终端结点“$”,表示从起始结点到当前结点构成的key恰好是词典中的一个完整词条,将当前结点(终端结点)的base值赋上当前key词典顺序序号的相反数,该路径上执行完毕;否则执行步骤S136;
步骤S136,为当前结点寻找一个合适的base值,使得base值唯一,且不会导致所有直接后继结点与现有Trie树存储的结点冲突。依次将当前结点的直接后继结点插入Trie树中,并将其check值赋上当前结点的base值,再依次把当前结点的直接后继结点作为当前结点,跳转到步骤S135。
如图4所示,Trie树在插入新结点的顺序是依次插入当前结点的直接后继结点,然后依次把当前结点的直接后继结点作为当前结点,递归执行插入操作,若当前结点没有后继结点,即当前结点为终端结点“$”,跳出当前递归,直至所有结点插入完毕,即可完成Trie树的创建操作。若把所有的结点(包括终端结点“$”)按照插入的顺序编号。
本发明实施例提供一种基于一维线性空间实现Trie树的词典存储管理方法,该方法包括以下步骤:获取完整的词典数据;生成有序的词典数据并存放在一维数组中;创建Trie树实现对词典数据的存储。本发明采用一维数组代替双数组(base[]和check[]),本方法使得Trie树序列化和反序列化更加便捷,使得词典的加载存储更有效率,同时本发明可以解决双数组实现Trie树的词典数据存储方法中存在的数据移动或存储空间的回溯问题。

一种基于一维线性空间实现TRIE树的词典存储管理方法.pdf_第1页
第1页 / 共10页
一种基于一维线性空间实现TRIE树的词典存储管理方法.pdf_第2页
第2页 / 共10页
一种基于一维线性空间实现TRIE树的词典存储管理方法.pdf_第3页
第3页 / 共10页
点击查看更多>>
资源描述

《一种基于一维线性空间实现TRIE树的词典存储管理方法.pdf》由会员分享,可在线阅读,更多相关《一种基于一维线性空间实现TRIE树的词典存储管理方法.pdf(10页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 103365991 A(43)申请公布日 2013.10.23CN103365991A*CN103365991A*(21)申请号 201310288785.2(22)申请日 2013.07.03G06F 17/30(2006.01)(71)申请人深圳市华傲数据技术有限公司地址 518057 广东省深圳市南山区高新区中区高新中一道9号软件大厦7层713、715、716室(72)发明人王国印(54) 发明名称一种基于一维线性空间实现Trie树的词典存储管理方法(57) 摘要本发明实施例提供一种基于一维线性空间实现Trie树的词典存储管理方法,该方法包括以下步骤:获取完整的。

2、词典数据;生成有序的词典数据并存放在一维数组中;创建Trie树实现对词典数据的存储。本发明采用一维数组代替双数组(base和check),本方法使得Trie树序列化和反序列化更加便捷,使得词典的加载存储更有效率,同时本发明可以解决双数组实现Trie树的词典数据存储方法中存在的数据移动或存储空间的回溯问题。(51)Int.Cl.权利要求书1页 说明书5页 附图3页(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书1页 说明书5页 附图3页(10)申请公布号 CN 103365991 ACN 103365991 A1/1页21.一种基于一维线性空间实现Trie树的词典存储管理方法,。

3、其特征在于,该方法包括以下步骤:获取完整的词典数据;生成有序的词典数据并存放在一维数组中;创建Trie树实现对词典数据的存储。2.根据权利要求1所述的方法,其特征在于,所述生成有序的词典数据包括:将词典数据中所有词条和属性信息以Key为中心按词典顺序排序;合并拥有相同Key值的values。3.根据权利要求1所述的方法,其特征在于,所述一维数组包括:一维数组的偶数位存放双数组的base值,一维数组的奇数位存放双数组的check值。4.根据权利要求1所述的方法,其特征在于,所述创建Trie树包括以下步骤:定义起始状态,编号为0;将起始状态放入双数组第0位置;以起始状态为当前状态;获取当前状态的所。

4、有直接后继状态的信息;为当前结点寻找一个合适的base值,插入其所有直接后继结点。5.根据权利要求1所述的方法,其特征在于,所述词典顺序排序还包括:拥有公共前缀的keys相邻。6.根据权利要求1或权利要求4所述的方法,其特征在于,所述状态的信息包括:用一个数据机构Node存储每个状态的信息;每个状态的信息包含:当前输入字符、状态的深度、第一个拥有当前状态key的编号、最后一个拥有当前状态key的下一个编号、拥有当前状态key的数量。7.根据权利要求1或权利要求6所述的方法,其特征在于,所述的key包括:在每个key后面添加一个虚拟字符代表叶子结点(终端结点),每个叶子结点虚拟字符的存储位置由其。

5、直接前驱的base值确定。权 利 要 求 书CN 103365991 A1/5页3一种基于一维线性空间实现 Trie 树的词典存储管理方法技术领域0001 本发明涉及一种词典存储管理方法,尤其涉及一种基于一维线性空间实现Trie树的词典存储管理方法。背景技术0002 在信息检索和自然语言处理领域,特别是基于词典的技术应用中,词典的规模一般都非常大,拥有成千上万甚至上亿条记录,尤其是搜索引擎中倒排索引词的规模最为庞大。对海量数据词典的存储,当前通常采用索引的数据结构来实现。常用的索引结构包括线性索引表、倒排表、散列(hash)表和搜索树等。当前网络上流行的Trie树的实现版本一般都是基于双数组的。

6、,两个数组的名字分别为base和check,数组中的每一个元素下标i相当于Trie树的一个结点编号或在双数组中的存储位置,又称状态编号。0003 basei:存放的是当前状态i到所有后继状态最小无冲突的偏移量;0004 checki:存放的是当前状态i的直接前驱信息,即存储当前状态是由哪一个状态转移而来;0005 base和check是成对的;0006 basei和checki代表同一个状态的属性。0007 然而这种基于双数组实现的Trie树的词典数据存储方法存在着这样一个问题:会因为插入新状态而引起的冲突导致要移动大量存在冲突的词典数据,不仅会导致词典数据存储速率慢,也会导致数据移动或存储空。

7、间的回溯问题。发明内容0008 为了解决上述技术的缺陷之一,本发明实施例提供一种基于一维线性空间实现Trie树的词典存储管理方法,本发明采用一维数组代替双数组(base和check),本方法使得Trie树序列化和反序列化更加便捷,使得词典的加载存储更有效率,同时本发明可以解决双数组实现Trie树的词典数据存储方法中存在的数据移动或存储空间的回溯问题。0009 为此,本发明实施例公开了一种基于一维线性空间实现Trie树的词典存储管理方法。该方法包括以下步骤:获取完整的词典数据;生成有序的词典数据并存放在一维数组中;创建Trie树实现对词典数据的存储。0010 在本发明实施例中,使用一维数组代替双。

8、数组(base和check),此种做法的好处使得Trie树序列化和反序列化更加简单,使得词典的加载更加容易。具体做法可以将base数组放在一维数组的偶数位,check数组放在奇数位,对应关系如下:0011 basei-array2*i;0012 checki-array2*i+1.0013 在本发明的一个实施例中,所述生成有序的词典数据包括:0014 将词典数据中所有词条和属性信息以Key为中心按词典顺序排序;说 明 书CN 103365991 A2/5页40015 合并拥有相同Key值的values。0016 在本发明的一个实施例中,所述的key包括:0017 在每个key后面添加一个虚拟字。

9、符代表叶子结点(终端结点),每个叶子结点虚拟字符的存储位置由其直接前驱的base值确定。0018 本发明实施例中,允许让每个key带上自己的属性值values(词性或者其他标注信息)。当前很多Trie树的实现版本,只能存储key,无法将key和key的属性或解释信息(统称为values)直接关联起来。本方法的解决方式是在每个key后面加一个虚拟字符“”代表叶子结点(终端结点),使得原先的终端结点变为非终端结点,在其后增加一个终端结点“”作为其直接后继。把每个叶子结点“” (终端结点)的base值赋上其所处的key按词典顺序序号的相反数-m(m为当前key在所有词条集中的词典顺序序号,m能直接确。

10、定相关key对应的values的存储位置),每个叶子结点“”的存储位置,直接由其直接前驱的base值确定,同时叶子结点的直接前驱定义为自己,即叶子结点的check值等于其状态编号即逻辑存储位置。0019 在本发明的一个实施例中,所述词典顺序排序还包括:0020 拥有公共前缀的keys相邻。0021 在本发明的一个实施例中,所述状态的信息包括:0022 用一个数据机构Node存储每个状态的信息;0023 每个状态的信息包含:当前输入字符、状态的深度、第一个拥有当前状态key的编号、最后一个拥有当前状态key的下一个编号、拥有当前状态key的数量。0024 在本发明实施例中,在创建Trie树的过程。

11、中为了很好的避免因插入新状态导致冲突而引起的数据移动,要求所有信息按照key有序,才能够获取当前状态的所有直接后继状态的信息(如当前输入的字符c,该状态在Trie树的深度,直接后继状态包含的词条位置范围等)。为了方便,本发明定义一个数据结构Node存储每个状态的信息。0025 在本发明的一个实施例中,创建Trie树包括以下步骤:0026 定义起始状态,编号为0;0027 将起始状态放入双数组第0位置;0028 以起始状态为当前状态;0029 获取当前状态的所有直接后继状态的信息;0030 为当前结点寻找一个合适的base值,插入其所有直接后继结点。0031 本发明实施例提供的一种基于一维线性空。

12、间实现Trie树的词典存储管理方法能够使Trie树序列化和反序列化更加便捷,提高了词典的数据加载存储效率,同时本发明克服了双数组实现Trie树的词典数据存储方法中存在的数据移动或存储空间的回溯问题。0032 应当理解,以上总体说明和以下详细说明都是说明性和实例性的,旨在提供对所要求的本发明的进一步说明。附图说明0033 图1是本发明实施例一种基于一维线性空间实现Trie树的词典存储管理方法的流程图。0034 图2是本发明实施例中词典数据前缀树组成的森林的构造图。说 明 书CN 103365991 A3/5页50035 图3是本发明实施例中实现Trie树的词典存储的流程的示意图。0036 图4是。

13、本发明实施例中实现Trie树创建时结点的插入顺序流程的示意图。具体实施方式0037 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施例仅仅用于解释本发明,并不用于限定本发明。0038 本发明实施例提供的一种基于一维线性空间实现Trie树的词典存储管理方法,该方法包括以下步骤:获取完整的词典数据;生成有序的词典数据并存放在一维数组中;创建Trie树实现对词典数据的存储。0039 如图1所示,是本发明实施例一种一维线性空间实现Trie树的词典存储管理方法的流程图,包括以下步骤:0040 步骤S110,获取完整的词典数。

14、据。0041 例如,词典中要存放如下表1中的这些词条(key)数据:0042 中国深圳中国人深圳大学南山深圳市南山区深圳村南山大道龙山镇南山社区龙岗南山街道龙岗区0043 表10044 步骤S120,生成有序的词典数据并存放在一维数组中。0045 将词典数据中所有词条和属性信息以Key为中心按词典顺序排序;合并拥有相同Key值的values。同时,让拥有公共前缀的keys相邻。根据上述获取的词典数据,那些词之间存在着一些共同的前缀,按照这些前缀树可以组成一个森林,如图2所示,各棵树的结点做如下说明:0046 虚线圆代表树的终端结点;0047 实线圆代表数的非终端结点;0048 从树的根部结点到。

15、当前终端结点构成的词是词典中的一条完整词条;0049 从树的根部结点到某一非终端结点构成的词是词典中某些词条的公共前缀。0050 由此可以看出在构造Trie树中,一定要存储当前状态的直接前驱信息。当前网络上流行的Trie树的实现版本一般都是基于双数组的,两个数组的名字分别为base和check,数组中的每一个元素下标i相当于Trie树的一个结点编号或在双数组中的存储说 明 书CN 103365991 A4/5页6位置,又称状态编号。0051 basei:存放的是当前状态i到所有后继状态最小无冲突的偏移量。0052 checki:存放的是当前状态i的直接前驱信息,即存储当前状态是由哪一个状态转移。

16、而来0053 base和check是成对的,basei和checki代表同一个状态的属性0054 假如当前状态为s,输入的字符为c,下一状态为t,则查询过程的约束条件为:0055 checkbases+cs;0056 bases+ct。0057 在本发明的一个实施例中,在每个key后面添加一个虚拟字符代表叶子结点(终端结点),每个叶子结点虚拟字符的存储位置由其直接前驱的base值确定。允许让每个key带上自己的属性值values(词性或者其他标注信息)。当前很多Trie树的实现版本,只能存储key,无法将key和key的属性或解释信息(统称为values)直接关联起来。本方法的解决方式是在每个。

17、key后面加一个虚拟字符“”代表叶子结点(终端结点),使得原先的终端结点变为非终端结点,在其后增加一个终端结点“”作为其直接后继。把每个叶子结点“” (终端结点)的base值赋上其所处的key按词典顺序序号的相反数-m(m为当前key在所有词条集中的词典顺序序号,m能直接确定相关key对应的values的存储位置),每个叶子结点“”的存储位置,直接由其直接前驱的base值确定,同时叶子结点的直接前驱定义为自己,即叶子结点的check值等于其状态编号即逻辑存储位置。0058 使用一维数组代替双数组(base和check),此种方法的好处使得Trie树序列化和反序列化更加简单,使得词典的加载更加容。

18、易。具体做法可以将base数组放在一维数组的偶数位,check数组放在奇数位,对应关系如下:0059 basei-array2*i;0060 checki-array2*i+1.0061 所述一维数组包括:一维数组的偶数位存放双数组的base值,一维数组的奇数位存放双数组的check值。0062 在创建Trie树的过程中为了很好的避免因插入新状态导致冲突而引起的数据移动,要求所有信息按照key有序,才能够获取当前状态的所有直接后继状态的信息(如当前输入的字符c,该状态在Trie树的深度,直接后继状态包含的词条位置范围等)。为了方便,本发明实施例定义一个数据结构Node存储每个状态的信息,该数据。

19、结构用于在创建Trie树时存储新插入的状态信息,主要存储的信息说明包括:0063 code存储的是当前的输入字符c,可以为c的Unicode值或者字节值,为了规避虚拟的终端结点“” (终端结点的code为0),本方法定义每个code的值取字符c的Unicode值+1;0064 depth当前状态在Trie树中的深度+1,即其直接后继在Trie树的深度(Trie树的根结点即初始结点定义为第0层);0065 start第一个拥有当前状态key的编号;0066 end最后一个拥有当前状态key的下一个编号;0067 end-start为拥有当前状态key的数量,即这些key拥有共同的前缀。0068 。

20、步骤S130,创建Trie树实现对词典数据的存储。说 明 书CN 103365991 A5/5页70069 如图3所示,是实现Trie树词典数据的存储流程,具体包括以下步骤:0070 步骤S131,将所有词条和属性信息以key为中心按词典顺序排序,合并拥有相同key值的values,要保证key不存在重复;0071 步骤S132,定义起始状态,编号为0,其包含的信息值为code0,depth0,start0,endN,其中N为词典的规模,即key的数量;0072 步骤S133,将起始状态放入双数组第0位置,将其base01(array2*0array01),并标识base为1的值已经被占用(保。

21、证所有状态的base值唯一),check00(array2*0+1array10);0073 步骤S134,以起始状态作为当前状态;0074 步骤S135,获取当前状态的所有直接后继状态的信息,若直接后继结点列表为空,即当前结点为终端结点“”,表示从起始结点到当前结点构成的key恰好是词典中的一个完整词条,将当前结点(终端结点)的base值赋上当前key词典顺序序号的相反数,该路径上执行完毕;否则执行步骤S136;0075 步骤S136,为当前结点寻找一个合适的base值,使得base值唯一,且不会导致所有直接后继结点与现有Trie树存储的结点冲突。依次将当前结点的直接后继结点插入Trie树中。

22、,并将其check值赋上当前结点的base值,再依次把当前结点的直接后继结点作为当前结点,跳转到步骤S135。0076 如图4所示,Trie树在插入新结点的顺序是依次插入当前结点的直接后继结点,然后依次把当前结点的直接后继结点作为当前结点,递归执行插入操作,若当前结点没有后继结点,即当前结点为终端结点“”,跳出当前递归,直至所有结点插入完毕,即可完成Trie树的创建操作。若把所有的结点(包括终端结点“” )按照插入的顺序编号。0077 本发明实施例提供一种基于一维线性空间实现Trie树的词典存储管理方法,该方法包括以下步骤:获取完整的词典数据;生成有序的词典数据并存放在一维数组中;创建Trie树实现对词典数据的存储。本发明采用一维数组代替双数组(base和check),本方法使得Trie树序列化和反序列化更加便捷,使得词典的加载存储更有效率,同时本发明可以解决双数组实现Trie树的词典数据存储方法中存在的数据移动或存储空间的回溯问题。说 明 书CN 103365991 A1/3页8图1图2说 明 书 附 图CN 103365991 A2/3页9图3说 明 书 附 图CN 103365991 A3/3页10图4说 明 书 附 图CN 103365991 A10。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1