首页> 中国专利> 一种大规模字符串文本的后缀索引构造方法及装置

一种大规模字符串文本的后缀索引构造方法及装置

摘要

本发明公开了一种大规模文本的后缀索引构造方法及装置,本发明在后缀索引构造过程中至少配置大规模字符串读取器,后缀前驱信息处理器,LMS后缀识别器,两个外存优先级队列容器和外存排序器。通过大规模字符串读取器读取字符串,LMS识别器识别字符串中的LMS子串或后缀,外存优先级队列容器实现子串或后缀的排序,最终完成大规模字符串文本的后缀索引构造。在索引构造过程中,利用了低成本的计算机外存资源,使得后缀索引构造不再受限于内存容量;从而在任意一台普通计算机环境下,本发明能完成超过该内存大小的字符串文本数据的后缀索引构造,突破现有后缀索引构造技术方案的局限性。且本发明具有运行速度快、I/O量小和简单易行等优点。

著录项

  • 公开/公告号CN105335481A

    专利类型发明专利

  • 公开/公告日2016-02-17

    原文格式PDF

  • 申请/专利号CN201510659972.6

  • 发明设计人 刘伟军;农革;

    申请日2015-10-14

  • 分类号G06F17/30(20060101);

  • 代理机构44102 广州粤高专利商标代理有限公司;

  • 代理人林丽明

  • 地址 528300 广东省佛山市顺德区大良街道办广东顺德中山大学卡内基梅隆大学国际联合研究院

  • 入库时间 2023-12-18 14:11:39

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-01-22

    授权

    授权

  • 2016-03-16

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20151014

    实质审查的生效

  • 2016-02-17

    公开

    公开

说明书

技术领域

本发明涉及后缀索引构造技术领域,尤其涉及一种利用计算机外存来构造大规模字符串文本后缀索引的方法及装置。

背景技术

后缀索引,也称为后缀数组(suffixarray),是计算机科学中的一个重要数据结构,具有结构紧凑且空间占用小的特点,在全文检索、数据压缩、基因序列对齐和模式匹配等诸多领域具有广泛应用。任意给定一个字符串文本,简称为字符串,从字符串中的任意位置开始到该字符串结尾的所有字符组成一个字符子串,该子串称为字符串的后缀(suffix)。显然,长度为n的字符串包含n个后缀,对这n个后缀按字典顺序升序保存在一个整型数组中,该数组则称为字符串的后缀索引。

传统构造后缀索引技术需要把所有文本全部加载至内存,然后才能进行后缀索引构造。但近年来,基因数据库、互联网文本数据以及其它相关领域的文本数据规模不断扩大,普通计算机内存已无法一次性加载全部文本,这些传统索引构造技术显然已不再适用。

发明内容

本发明为克服上述现有技术所述的至少一种缺陷(不足),首先提供一种大规模字符串文本的后缀索引构造方法,使用户在普通计算机环境下(如:内存大小为4G)也能进行大规模字符串文本的后缀索引构造。

本发明的又一目的是提出一种大规模字符串文本的后缀索引构造装置,其实现了借助计算机外存对大规模字符串文本进行后缀索引构造。

为了实现上述目的,本发明采用如下技术方案:

一种大规模文本的后缀索引构造方法,所述方法包括:

收缩字符串T,得到新的字符串T1,T1的规模最多为T的一半;

以直接方式或递归方式构造T1的后缀索引;

扫描T1的后缀索引,得到T的后缀索引。

其中,所述收缩字符串T,得到新的字符串T1的具体过程为:

使用大规模字符串读取器分批读取字符串T,获取T中所有LMS子串,压入外存优先级队列容器Q1中。扫描Q1排序L子串,并使用子串命名单元对L子串和LMS子串进行命名,得到的有序L子串存放于外存优先级队列容器Q2中。扫描Q2中所有L子串排序S子串,并对S子串命名,得到有序S子串。提取S子串中所有LMS子串的名字,这些名字按照LMS子串在原字符串中的索引位置升序构成新的字符串T1;

所述LMS子串的识别方法为,该子串的首字符和尾字符均为LMS字符,首字符与尾字符之间不存在任何LMS字符;

所述LMS字符的识别方法为,当后缀为LMS后缀时,则该后缀所对应字符子串的首字符称为LMS字符;

所述LMS后缀的识别方法为,若当前后缀为S后缀,且字符串T中与当前后缀相邻的左手边第一个后缀为L后缀,则该后缀为LMS后缀;

所述L子串的识别方法为,子串的首字符为L字符,尾字符为LMS字符,且首字符与尾字符之间不存在任何LMS字符,则该子串为L子串;

所述L或S字符的识别方法为,若某后缀为L或S后缀,则该后缀所对应字符子串的首字符分别称为L或S字符;

所述S子串的识别方法为,子串的首字符为S字符,尾字符为LMS字符,且首字符与尾字符之间不存在任何LMS字符,则该子串为S子串;

所述L后缀、S后缀的识别方法为,先假定字符串最后一个字符为‘$’,该字符在整个字符串所包含的字符当中最小并且唯一,为S后缀;然后从字符串文本倒数第二个字符开始往前扫描,若当前字符比前一字符小,则该后缀为S后缀;或当前字符与前一字符相等且前一字符所对应的后缀为S后缀,则该后缀也为S后缀。除上述两种情况之外,后缀被识别为L后缀。

其中,所述构造字符串T1的后缀索引的过程为:

若字符串T1中所有字符都唯一,各字符的名称即为各后缀在后缀索引中的优先级次序,扫描字符串T1,每个索引位置生成相应的二元组:(T[i],i),即(字符名称,位置索引),将这些二元组全部压入外存排序器,按照字符名称排序,排序后取各字符对应的索引号存入数组,即得到T1的后缀索引,否则以T1为新的字符串输入参数,用递归方式构造T1的后缀索引。

其中,所述扫描T1的后缀索引,得到T的后缀索引的过程为:

使用大规模字符串读取器读取字符串T,识别其中的LMS后缀,根据T1的后缀索引,给相应的LMS后缀赋予优先级,并压入外存优先级队列容器Q1中;

扫描Q1,得到的有序L后缀,L后缀存放于外存优先级队列Q2中;

扫描Q2,得到有序S后缀序列;

归并所有L和S后缀,得到字符串T的后缀索引。

一种大规模文本的后缀索引构造装置,所述后缀索引构造装置包括大规模字符串文本读取器,后缀前驱信息处理器,前驱信息存储模块,LMS后缀识别器,L/S后缀识别器,子串命名单元,外存优先级队列容器,外存排序器和后缀索引存储模块;

大规模字符串读取器,用于顺序读取外存大规模字符串文本;

后缀前驱信息处理器,用于生成字符串文本中各后缀的前驱信息,并保存至外存容器;

其中,所述后缀前驱信息为一个元组,该元组包含了该后缀在字符串中的位置信息,前驱字符以及前驱字符距离。这里的前驱字符为:在字符串T中,后缀i对应的字符为T[i],T[i]左侧第一个不等于T[i]的字符称为后缀i的前驱字符,例如:某后缀与其前驱字符的距离为“0”,说明该后缀左侧第一个字符为其前驱字符;

前驱信息存储模块,一种外存容器,用于存放后缀前驱信息处理器所输出的各后缀前驱信息;

外存优先级队列容器,用于在外存上对字符子串或后缀进行排序,每次从该队列弹出的子串或后缀为当前队列中最小或最大子串或后缀;

L/S后缀识别器,用于识别具体的后缀是L还是S后缀;

LMS后缀识别器,用于识别具体的后缀是否为LMS后缀;

子串命名单元,用于索引构造过程中,对字符子串进行命名,以便字符串规模的收缩;

外存排序器,一种外存容器,可对存入其中的对象按照指定关键字排序;

后缀索引存储模块,一种外存容器,用于存储后缀索引。

与现有技术相比,本发明具有以下的优点和积极效果:

本发明在后缀索引构造过程中至少配置大规模字符串读取器,后缀前驱信息处理器,LMS后缀识别器,两个外存优先级队列容器和外存排序器。这样,通过大规模字符串读取器读取字符串,通过LMS识别器识别字符串中的LMS子串或后缀,通过外存优先级队列容器实现子串或后缀的排序,最终完成大规模字符串文本的后缀索引构造。在索引构造过程中,利用了低成本的计算机外存资源,使得后缀索引构造不再受限于内存容量;从而在任意一台普通计算机环境下,本系统能完成超过该内存大小的字符串文本数据的后缀索引构造,突破了现有后缀索引构造技术方案的局限性。而且,本发明具有运行速度快、I/O量小和简单易行等优点。

附图说明

图1为本发明具体实施方案的方法流程图。

图2为本发明的装置结构示意图。

具体实施方式

附图仅用于示例性说明,不能理解为对本专利的限制;为了更好说明本实施例,附图某些部件会有省略、放大或缩小,并不代表实际产品的尺寸;

对于本领域技术人员来说,附图中某些公知结构及其说明可能省略是可以理解的。下面结合附图和实施例对本发明的技术方案做进一步的说明。

本发明的基本思想是:将字符串文本中的后缀分为L后缀和S后缀,先通过外存优先级队列容器排序字符串中的LMS子串;在有序LMS子串的基础上,推导有序L后缀;在有序L后缀的基础上,推导有序S后缀;最后以桶为单位,归并L后缀和S后缀,输出后缀索引。这里的桶是指:后缀数组中具有相同首字符的后缀构成一块连续的区域,该区域称为桶。

在索引构造过程中,需要随时访问后缀的前驱字符,传统方法为,将所有字符串全部加载至内存,这样,在索引构造过程中可随机访问后缀的前驱字符;但在字符串规模较大,远远超过内存容量的情况下,这种处理办法已不再适用。

因此,本发明预先产生字符串各后缀的前驱信息,并对所有前驱信息元组排序,预先存放在外存容器。排序关键字为二元组:后缀的首字符和后缀位置索引,即先按首字符排序,然后按该后缀在源字符串中的位置索引值排序。

如前所述,具有相同首字符的后缀构成一块连续的区域,这个连续的区域称为桶,在索引构造过程中,也是按桶关键字有序扫描各后缀,因而在扫描过程中可以仅加载当前正在扫描的桶所包含的后缀的前驱信息,然后通过位置索引值来访问具体后缀的前驱信息,从而完成字符子串或者后缀的排序。

在索引构造过程当中,还需对L和S子串进行命名。命名过程如下:当排序L子串时,定义一个整型变量i,i初始化为0,每弹出一个后缀,i增加1。若当前子串与前一子串不等,当前子串被命名为当前变量i的值;若当前子串与前一子串相等,则当前子串的名字与前一子串相等。排序S子串时,命名方法与排序L子串一样,同样需要定义一个整型变量i,不同的地方是,i初始化为字符串的长度减1,即n-1,每弹出一个后缀,i自减1。

当得到有序S子串以后,取其中所有LMS子串(LMS子串属于S子串),统计LMS子串命名次数,若LMS子串的命名次数与其数目一样,说明字符串中各LMS子串是两两互异的,LMS子串的名字即为LMS子串的优先级;否则,字符串中存在相等的LMS子串,暂时无法确定其所对应的后缀大小关系;因此,必须提取各LMS子串的名字,按照其所对应的LMS后缀在字符串中的位置索引从小到大排列,构成一个新的字符串,计算该新字符串各后缀的前驱信息,排序L和S子串,以递归方式计算LMS子串的优先级次序。

当LMS子串有序,可通过外存优先级队列容器Q1,输出有序L后缀至Q2;然后在有序L后缀的基础上,通过Q2,输出有序S后缀,对L和S后缀按桶关键字归并,得到字符串的后缀索引。

基于以上所述,本发明实施例提供了一种通过计算机外存来构造大规模字符串文本的后缀索引的方法,参见图1,该方法包括如下步骤:

S101:获取后缀前驱信息;

从后往前扫描字符串,若当前字符与前一扫描字符不相等,则产生一个前驱信息元组,将其输出至外存排序器中;扫描结束后,对所有前驱信息先按桶名称从小到大排序,然后按其在字符串中的位置索引从小到大排序,排序结果保存在前驱信息存储模块中,这样,保证了所有前驱信息元组先按桶名称有序,再按位置索引有序。

S102:将所有LMS子串压入外存优先级队列容器Q1;

具体实现时,可以在LMS后缀识别器的支持下,利用大规模字符串读取器,从后往前读取字符串文本,将字符串中所有LMS子串压入Q1。每个被压入的LMS子串包含信息有:LMS子串的首字符,该LMS子串所对应的后缀,该后缀的类型及后缀在Q1中的插入次序。

S103:扫描外存容器Q1对L子串排序并命名,并将有序L子串输入到外存容器Q2;

具体实现过程可以为,逐一弹出Q1中的元素,直到Q1为空。若当前弹出后缀的前驱是L后缀,将该前驱后缀重新压入Q1;同时,若当前弹出的后缀为L后缀,则将该L后缀压入到Q2。

S104:扫描外存容器Q2对S子串排序并命名,并将S子串中的所有LMS子串的位置索引及其命名信息输入到外存排序器;

具体实现过程可以为,逐一弹出Q2中的元素,直到队列为空。若当前弹出后缀的直接前驱是S后缀,则将该前驱后缀重新压入Q2;同时,若当前后缀是LMS后缀,将该LMS后缀及其名字封装在一起,压入外存排序器。

S105:对外存排序器中所有LMS子串按位置索引进行升序排序,所有LMS子串的名字构成新的字符串T1;

S106:根据字符串T1所包含的字符是否均唯一,以直接或递归方式计算新字符串T1的后缀索引;

在这一步,T1规模为T的一半,若T1所包含的字符没有重复字符,则可以直接计算新字符串的后缀索引;否则以T1为输入字符串,转移到S101执行,以递归的方式计算T1的后缀索引。

S107:扫描字符串T及T1的后缀索引,将T中所有LMS后缀及其优先级压入外存优先级容器Q1中;这里T1的后缀索引即为T中各LMS后缀的优先级;

S108:扫描外存容器Q1,得到有序L后缀,并保存至外存容器Q2;

该步骤与步骤S103类似,排序L后缀之前,所有LMS后缀已经输入到Q1中。然后逐一弹出Q1中的元素,查看其前驱是否为L后缀,若是,则将该前驱后缀压入Q1中;同时,若该后缀是L后缀,还必须把该后缀压入Q2中。与步骤S103所不同的是:本步骤是排序L后缀,不需要做命名操作,而S103是排序L子串,需要对各字符子串命名。当容器Q1为空时,得到有序L后缀。

S109:扫描外存容器Q2,在有序L后缀的基础上,得到有序的S后缀。

这一步与步骤S104类似,同样是逐一弹出Q2中的元素,查看其前驱是否为S后缀,若是,则将该前驱后缀其压入Q2中;同样,该步骤不需要做命名操作,当Q2为空时,得到有序S后缀。

S110:以桶为单位,归并L和S后缀,输出字符串T的后缀索引。

本发明实施例还提供了一种通过计算机外存来构造大规模字符串文本的后缀索引的装置,如图2的结构示意图,包括:

大规模字符串读取器1,用于顺序读取外存大规模字符串文本T;

后缀前驱信息处理器2,用于生成字符串文本中各后缀的前驱信息,并保存至外存容器(即前驱信息存储模块3);

其中,所述后缀前驱信息为一个元组,该元组包含了该后缀在字符串中的位置信息,前驱字符以及前驱字符距离。这里的前驱字符为:在字符串文本T中,后缀i对应的字符为T[i],T[i]左侧第一个不等于T[i]的字符称为后缀i的前驱字符,例如:某后缀与其前驱字符的距离为“0”,说明该后缀左侧第一个字符为其前驱字符;

前驱信息存储模块3,是一种外存容器,用于存放后缀前驱信息处理器2所输出的各后缀前驱信息;

LMS后缀识别器4,用于识别具体的后缀是否为LMS后缀;

L/S后缀识别器5,用于识别具体的后缀是L还是S后缀;

子串命名单元6,用于在索引构造过程中,对字符子串进行命名,以便字符串规模的收缩;

外存优先级队列容器7,包括容器Q1、Q2,用于在外存上对字符子串或后缀进行排序,每次从该队列弹出的子串或后缀为当前队列中最小或最大子串或后缀;

外存排序器8,也是一种外存容器,可对存入其中的对象按照指定关键字排序;

后缀索引存储模块9,也是一种外存容器,用于存储后缀索引。

显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号