一种后缀数组的正确性验证方法及系统技术方案

技术编号:15938631 阅读:43 留言:0更新日期:2017-08-04 21:38
本发明专利技术涉及一种后缀数组的正确性验证方法和系统,所述方法包括:从右向左扫描一遍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数组。

Method and system for verifying correctness of suffix array

To validate the correctness of the method and system of the present invention relates to a suffix array, the method includes: scanning from right to left over T, in accordance with the definition of suffix type of comparison of current scanning characters T[i] and successive character size of T[i+1], T and suf calculated the character T[i] (T, I) type, recorded in the t[i] from left to right; scan T, find all the LMS characters appear, to get all the LMS the first character string pointer array P1 to record; according to P1, B and SA array, using the method of induction of the LMS promoter T sort string sort results stored in the array SA1; from scan left to right SA, if SA[i] is LMS, SA[i] will save to SA1; to judge whether the character in T1 only, if it is directly under the name of T1 SA1 were calculated, and the use of SA1 to update the C array; according to T1 and SA1 induction T suffix number calculation Group SA, which uses the C array to validate the correctness of the SA during the calculation, and updates the C array with SA if SA is correct.

【技术实现步骤摘要】
一种后缀数组的正确性验证方法及系统
本专利技术涉及后缀数组的验证领域,更具体地,涉及一种后缀数组的正确性验证方法及系统。
技术介绍
后缀数组是指可以在更小的空间内实现等同后缀树的数据结构,是后缀树的紧凑型替代,广泛应用于字符串处理、生物信息检索、数据压缩和模式匹配等诸多领域。任意给定一个字符串,从其中的任意位置开始至其结尾的所有字符组成的字符子串称为字符串的后缀(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数组。优选地,还包括:后缀直接本文档来自技高网...
一种后缀数组的正确性验证方法及系统

【技术保护点】
一种后缀数组的正确性验证方法,其特征在于,包括:从右向左扫描一遍字符串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后缀地址。

【技术特征摘要】
1.一种后缀数组的正确性验证方法,其特征在于,包括:从右向左扫描一遍字符串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后缀地址。2.根据权利要求1所述的后缀数组的正确性验证方法,其特征在于,根据数组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。3.根据权利要求1所述的后缀数组的正确性验证方法,其特征在于,根据SA1中保存的LMS子串的地址信息,对LMS子串进行比较和命名,用新的名字替换T中LMS子串,形成新的字符串T1的步骤包括:从左向右扫描SA1中已排序的LMS子串,第一个扫描到的LMS子串命名为0,依次比较相邻的LMS子串是否相同,相同则命名不变,不同则命名加1;其中,相邻LMS子串的比较过程为:先比较两个LMS子串的字符是否相同,然后比较字符类型是否相同;如果字符和字符类型完全相同,则相邻LMS字串相同,否则不同;扫描字符串T,将扫描到的LMS子串中新的命名替换,形成新的字符串T1。4.根据权利要求1所述的后缀数组的正确性验证方法,其特征在于,归纳计算和验证T的后缀数组SA的步骤包括:初始化SA所有元素的值为-1;计算SA中各字符桶的结束位置,保存在数组B;从右向左扫描SA1,将SA1的值保存至SA中B[T[SA1[i]]]指向的位置,将B[T[SA1[i]]]更新为B[T[SA...

【专利技术属性】
技术研发人员:韩凌波农革徐文涛
申请(专利权)人:广东顺德中山大学卡内基梅隆大学国际联合研究院中山大学
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1