一种后缀数组的正确性验证方法及系统与流程

文档序号:11620531阅读:185来源:国知局
一种后缀数组的正确性验证方法及系统与流程

本发明涉及后缀数组的验证领域,更具体地,涉及一种后缀数组的正确性验证方法及系统。



背景技术:

后缀数组是指可以在更小的空间内实现等同后缀树的数据结构,是后缀树的紧凑型替代,广泛应用于字符串处理、生物信息检索、数据压缩和模式匹配等诸多领域。任意给定一个字符串,从其中的任意位置开始至其结尾的所有字符组成的字符子串称为字符串的后缀(suffix)。显然,长度为n的字符串包含n个后缀,对这n个后缀按字典顺序排序,将其地址保存在一个整型数组中,该数组则称为字符串的后缀数组。

现有的后缀数组正确性验证方法是在后缀数组构造完成以后,执行两轮整数排序来验证后缀数组的正确性。随着数据集规模的不断增长,后缀数组的正确性验证时间甚至会超过构造时间,现有的验证方法已经不再完全适用。



技术实现要素:

本发明为克服上述现有技术所述的至少一种缺陷,提供一种后缀数组的正确性验证方法及系统。

本发明旨在至少在一定程度上解决上述技术问题。

为了达到上述技术效果,本发明的技术方案如下:

一种后缀数组的正确性验证方法,包括:从右向左扫描一遍t,按照后缀类型的定义比较当前扫描的字符t[i]与后继字符t[i+1]的大小,计算t的字符t[i]和suf(t,i)的类型,记录于t[i]中;从左向右扫描一遍t,找出其中所有lms字符出现的位置,从而获取所有lms子串的首字符指针,用数组p1来记录;根据数组p1、b和sa,使用归纳排序的方法对t的lms子串进行排序,结果保存在数组sa1;从左向右扫描sa,如果sa[i]为lms类型,将sa[i]保存至sa1中;判断t1中的字符是否唯一。若是则直接根据t1的名字计算出sa1,且用sa1更新c数组;根据t1和sa1归纳计算t的后缀数组sa,计算过程中使用c数组验证sa的正确性,如果sa正确,用sa更新c数组;其中c数组保存的是当前递归层已有序的lms后缀地址。

优选地,根据数组p1、b和sa,使用归纳排序的方法对t的lms子串进行排序,结果保存在数组sa1的步骤包括:初始化sa所有元素的值为-1。计算sa中各字符桶的结束位置,保存在数组b。从右向左扫描p1,将p1的值保存至sa中b[t[p1[i]]]指向的位置,将b[t[p1[i]]]更新为b[t[p1[i]]]-1。扫描结束后,sa中各字符桶尾部记录了t中相同lms字符的地址;计算sa中各字符桶的开始位置,保存在数组b。从左向右扫描sa一次,如果当前扫描到的元素sa[i]的值为-1或在t中的前继t[sa[i]-1]的类型是s类型,则继续扫描下一个元素,否则将sa[i]-1保存至sa中b[t[sa[i]-1]]所指向的位置,然后将b[t[sa[i]-1]]更新为b[t[sa[i]-1]]+1;计算sa中各字符桶的结束位置,保存在数组b。从右向左扫描sa,判断当前元素sa[i]在t中的前继t[sa[i]-1]是否是l型,若是则继续扫描下一个元素,否则将sa[i]-1保存至sa中b[t[sa[i]-1]]所指向的位置,然后将b[t[sa[i]-1]]更新为b[t[sa[i]-1]]-1。

优选地,根据sa1中保存的lms子串的地址信息,对lms子串进行比较和命名,用新的名字替换t中lms子串,形成新的字符串t1的步骤包括:从左向右扫描sa1中已排序的lms子串,第一个扫描到的lms子串命名为0,依次比较相邻的lms子串是否相同,相同则命名不变,不同则命名加1;其中,相邻lms子串的比较过程为:先比较两个lms子串的字符是否相同,然后比较字符类型是否相同。如果字符和字符类型完全相同,则相邻lms字串相同,否则不同;扫描字符串t,将扫描到的lms子串用步骤41)中新的命名替换,形成新的字符串t1。

优选地,归纳计算和验证t的后缀数组sa的步骤包括:初始化sa所有元素的值为-1。计算sa中各字符桶的结束位置,保存在数组b。从右向左扫描sa1,将sa1的值保存至sa中b[t[sa1[i]]]指向的位置,将b[t[sa1[i]]]更新为b[t[sa1[i]]]-1。扫描结束后,sa中各字符桶尾部记录了t中有序lms后缀的地址;计算sa中各字符桶的开始位置,保存在数组b。从左向右扫描sa一次,如果当前扫描到的元素sa[i]的值为-1或t[sa[i]-1]的类型是s型,则继续扫描下一个元素,否则将sa[i]-1保存至sa中b[t[sa[i]-1]]所指向的位置,然后将b[t[sa[i]-1]]更新为b[t[sa[i]-1]]+1;计算sa中各字符桶的结束位置,保存在数组b。定义临时指针cp指向c数组的尾部。从右向左扫描sa,判断sa[i]是否为lms后缀,若是则将sa[i]与c数组中的元素c[cp]进行比较,如果两者相同,则将cp更新为cp-1,否则sa不正确,程序返回。若程序无返回,接着判断当前扫描元素sa[i]在t中的前继t[sa[i]-1]是否是l型,若是则继续扫描下一个元素,否则将sa[i]-1保存至sa中b[t[sa[i]-1]]所指向的位置,然后将b[t[sa[i]-1]]更新为b[t[sa[i]-1]]-1。

其中,c数组保存的是当前递归层已计算出的有序的lms后缀地址。因为lms后缀是最左s类型后缀,也就是说lms后缀属于s类型后缀,所以在推导s类型后缀的过程中,lms后缀也会被推导出,如果新推导出的lms后缀和c数组中的已有序的lms后缀顺序一致,则sa正确,否则错误。

一种后缀数组的正确性验证系统,包括:字符串读取模块、l/s后缀识别模块、lms后缀识别模块、lms子串排序模块、lms子串命名模块、字符串收缩模块、l型后缀排序模块和s型后缀排序以及lms后缀验证模块;所述字符串读取模块,用于读取字符串;所述l/s后缀识别模块,用于识别字符串后缀类型是l型或s型;所述lms后缀识别模块,用于识别s型后缀中的lms后缀;所述lms子串排序模块,用归纳排序的方法对lms子串进行排序;所述lms子串命名模块,对lms子串进行命名。对有序的lms子串中相邻的lms子串进行比较,如果二者相同其命名也相同,否则命名加1;所述字符串收缩模块,根据lms子串在t中的位置,用lms子串名替换lms子串形成新的字符串t1;所述l型后缀排序模块,用有序的lms后缀归纳排序l型后缀;所述s型后缀排序以及lms后缀验证模块,用有序的l型后缀归纳排序s型后缀,同时对lms型后缀正确性进行验证;其中,所述对lms型后缀正确性进行验证的过程为:在从右向左扫描sa,如果扫描到的后缀为lms类型,则将该后缀与验证信息模块中对应的lms后缀进行比较,如果所有扫描到的lms型后缀顺序与验证信息模块中保存的lms型后缀顺序一致,说明归纳排序计算出的sa正确。

优选地,还包括:后缀数组存取模块;所述后缀数组存取模块,用于存取后缀数组。

优选地,还包括:验证信息存取模块;所述验证信息存取模块,用于存取回溯过程中高层计算出的lms后缀的地址。

优选地,还包括:判定器a和判定器b;所述判定器a,用于判断字符串收缩模块生成的t1中的字符是否唯一,若是则直接计算其后缀,否则对t1执行递归;所述判定器b,用于判断当前递归层是否是第0层,若是则不更新c数组,否则更新c数组。

优选地,还包括:后缀直接计算模块;所述后缀直接计算模块,用于直接根据字符大小来计算字符串后缀。

与现有技术相比,本发明技术方案的有益效果是:

在后缀数组构建的过程中,同时实现了后缀数组的正确性验证;降低了后缀数组正确性验证的时间和空间开销。

附图说明

图1为一实施例的一种后缀数组的正确性验证方法的示意性流程图;

图2为一实施例的一种后缀数组的正确性验证系统的示意性结构图。

具体实施方式

附图仅用于示例性说明,不能理解为对本专利的限制;

为了更好说明本实施例,附图某些部件会有省略、放大或缩小,并不代表实际产品的尺寸;

对于本领域技术人员来说,附图中某些公知结构及其说明可能省略是可以理解的。

下面结合附图和实施例对本发明的技术方案做进一步的说明。

实施例1

图1为一实施例的一种后缀数组的正确性验证方法的示意性流程图。如图1所示,一种后缀数组的正确性验证方法,包括:

s101:从右向左扫描一遍t,按照后缀类型的定义比较当前扫描的字符t[i]与后继字符t[i+1]的大小,计算t的字符t[i]和suf(t,i)的类型,记录于t[i]中;

s102:从左向右扫描一遍t,找出其中所有lms字符出现的位置,从而获取所有lms子串的首字符指针,用数组p1来记录;

s103:根据数组p1、b和sa,使用归纳排序的方法对t的lms子串进行排序,结果保存在数组sa1;

所述步骤s103中对t的lms子串排序的具体步骤如下:

31)初始化sa所有元素的值为-1。计算sa中各字符桶的结束位置,保存在数组b。从右向左扫描p1,将p1的值保存至sa中b[t[p1[i]]]指向的位置,将b[t[p1[i]]]更新为b[t[p1[i]]]-1。扫描结束后,sa中各字符桶尾部记录了t中相同lms字符的地址;

32)计算sa中各字符桶的开始位置,保存在数组b。从左向右扫描sa一次,如果当前扫描到的元素sa[i]的值为-1或在t中的前继t[sa[i]-1]的类型是s类型,则继续扫描下一个元素,否则将sa[i]-1保存至sa中b[t[sa[i]-1]]所指向的位置,然后将b[t[sa[i]-1]]更新为b[t[sa[i]-1]]+1;

33)计算sa中各字符桶的结束位置,保存在数组b。从右向左扫描sa,判断当前元素sa[i]在t中的前继t[sa[i]-1]是否是l型,若是则继续扫描下一个元素,否则将sa[i]-1保存至sa中b[t[sa[i]-1]]所指向的位置,然后将b[t[sa[i]-1]]更新为b[t[sa[i]-1]]-1;

34)从左向右扫描sa,如果sa[i]为lms类型,将sa[i]保存至sa1中。

s104:根据sa1中保存的lms子串的地址信息,对lms子串进行比较和命名,用新的名字替换t中lms子串,形成新的字符串t1;

所述步骤s104中,计算新字符串t1的具体步骤如下:

41)从左向右扫描sa1中已排序的lms子串,第一个扫描到的lms子串命名为0,依次比较相邻的lms子串是否相同,相同则命名不变,不同则命名加1;

其中,相邻lms子串的比较过程为:先比较两个lms子串的字符是否相同,然后比较字符类型是否相同。如果字符和字符类型完全相同,则相邻lms字串相同,否则不同。

42)扫描字符串t,将扫描到的lms子串用步骤41)中新的命名替换,形成新的字符串t1。

s105:判断t1中的字符是否唯一。若是则直接根据t1的名字计算出sa1,且用sa1更新c数组,否则以t1和sa1作为输入跳转到步骤s101执行递归;

s106:根据t1和sa1归纳计算t的后缀数组sa,计算过程中使用c数组验证sa的正确性,如果sa正确,用sa更新c数组,用sa更新c数组;其中c数组保存的是当前递归层已有序的lms后缀地址。否则跳出程序;

所述步骤s106中,归纳计算和验证t的后缀数组sa的具体步骤如下:

61)初始化sa所有元素的值为-1。计算sa中各字符桶的结束位置,保存在数组b。从右向左扫描sa1,将sa1的值保存至sa中b[t[sa1[i]]]指向的位置,将b[t[sa1[i]]]更新为b[t[sa1[i]]]-1。扫描结束后,sa中各字符桶尾部记录了t中有序lms后缀的地址;

62)计算sa中各字符桶的开始位置,保存在数组b。从左向右扫描sa一次,如果当前扫描到的元素sa[i]的值为-1或t[sa[i]-1]的类型是s型,则继续扫描下一个元素,否则将sa[i]-1保存至sa中b[t[sa[i]-1]]所指向的位置,然后将b[t[sa[i]-1]]更新为b[t[sa[i]-1]]+1;

63)计算sa中各字符桶的结束位置,保存在数组b。定义临时指针cp指向c数组的尾部。从右向左扫描sa,判断sa[i]是否为lms后缀,若是则将sa[i]与c数组中的元素c[cp]进行比较,如果两者相同,则将cp更新为cp-1,否则sa不正确,程序返回。若程序无返回,接着判断当前扫描元素sa[i]在t中的前继t[sa[i]-1]是否是l型,若是则继续扫描下一个元素,否则将sa[i]-1保存至sa中b[t[sa[i]-1]]所指向的位置,然后将b[t[sa[i]-1]]更新为b[t[sa[i]-1]]-1。

其中,c数组保存的是当前递归层已计算出的有序的lms后缀地址。因为lms后缀是最左s类型后缀,也就是说lms后缀属于s类型后缀,所以在推导s类型后缀的过程中,lms后缀也会被推导出,如果新推导出的lms后缀和c数组中的已有序的lms后缀顺序一致,则sa正确,否则错误。

实施例2

图2为一实施例的一种后缀数组的正确性验证系统的示意性结构图。如图2所示,一种后缀数组的正确性验证系统,包括:字符串读取模块1、l/s后缀识别模块2、lms后缀识别模块3、lms子串排序模块4、lms子串命名模块5、字符串收缩模块6、l型后缀排序模块7和s型后缀排序以及lms后缀验证模块8;字符串读取模块1,用于读取字符串;l/s后缀识别模块2,用于识别字符串后缀类型是l型或s型;lms后缀识别模块3,用于识别s型后缀中的lms后缀;lms子串排序模块4,用归纳排序的方法对lms子串进行排序;lms子串命名模块5,对lms子串进行命名。对有序的lms子串中相邻的lms子串进行比较,如果二者相同其命名也相同,否则命名加1;字符串收缩模块6,根据lms子串在t中的位置,用lms子串名替换lms子串形成新的字符串t1;l型后缀排序模块7,用有序的lms后缀归纳排序l型后缀;s型后缀排序以及lms后缀验证模块8,用有序的l型后缀归纳排序s型后缀,同时对lms型后缀正确性进行验证;其中,所述对lms型后缀正确性进行验证的过程为:在从右向左扫描sa,如果扫描到的后缀为lms类型,则将该后缀与验证信息模块中对应的lms后缀进行比较,如果所有扫描到的lms型后缀顺序与验证信息模块中保存的lms型后缀顺序一致,说明归纳排序计算出的sa正确,否则错误。

作为一优选实施例,还包括:后缀数组存取模块9,用于存取后缀数组;

作为一优选实施例,还包括:验证信息存取模块10,存取回溯过程中高层计算出的lms后缀的地址;

作为一优选实施例,还包括:判定器a11,判断字符串收缩模块生成的t1中的字符是否唯一,若是则直接计算其后缀,否则对t1执行递归;

作为一优选实施例,还包括:判定器b12,判断当前递归层是否是第0层,若是则不更新c数组,否则更新c数组;

作为一优选实施例,还包括:后缀直接计算模块13,直接根据字符大小来计算字符串后缀。

相同或相似的标号对应相同或相似的部件;

附图中描述位置关系的用于仅用于示例性说明,不能理解为对本专利的限制;

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

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1