一种后缀数组和最长公共前缀的正确性验证方法及系统技术方案

技术编号:15938633 阅读:45 留言:0更新日期:2017-08-04 21:38
本发明专利技术涉及一种后缀数组和最长公共前缀的正确性验证方法及系统。该方法包括:从右向左扫描一遍T,按照后缀类型定义比较字符T[i]及其后继字符T[i+1]的大小,计算T的字符T[i]和后缀suf(T,i)的类型,记录于t[i]中;将SA1和LCPA1中的元素初始化为‑1。从左到右扫描一遍SA,根据数组t找出SA中所有LMS后缀及其LCP值,分别依次记录在SA1和LCPA1中;根据字符串T、数组t、SA1和LCPA1,对SA1中相邻LMS后缀及其LCP值进行正确性验证;根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的L型后缀及其LCP值;根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的S型后缀及其LCP值;顺序扫描SA、SA1、LCPA和LCPA1一次,比较SA与SA1和LCPA与LCPA1是否相同,如果两组比较全部相同则T的SA和LCPA正确。

Method and system for validating suffix array and longest common prefix

The invention relates to a method and a system for verifying the suffix array and the longest common prefix. The method includes: scanning from right to left over T, in accordance with the suffix type definition compare characters T[i] and its subsequent character T[i+1] size, the calculation of T characters T[i] and the suffix suf (T, I) type, recorded in the t[i]; SA1 and LCPA1 elements in the initialized to 1. From left to right SA scan, according to an array of t to find out all the LMS suffix and LCP value of SA, SA1 and LCPA1 respectively in the record; according to T, t, SA1 string array and LCPA1, LMS and LCP SA1 of the adjacent suffix value verification; according to T, t, B, string, array C, SA1 and LCPA1, L T and LCP suffixes categorized according to the string value; T, t, B, C, an array of SA1 and LCPA1, S and T type suffix categorized LCP; SA, SA1, LCPA scan and LCPA1, SA and SA1 and LCPA and LCPA1 the same, if the two groups are the same, T SA and LCPA.

【技术实现步骤摘要】
一种后缀数组和最长公共前缀的正确性验证方法及系统
本专利技术涉及数组正确性验证领域,更具体地,涉及一种后缀数组和最长公共前缀的正确性验证方法及系统。
技术介绍
后缀数组SA为任意给定一个字符串T,从T的任意位置开始至其结尾的所有字符组成的字符串称为T的后缀。显然,长度为n的字符串包含n个后缀,对这n个后缀按字典顺序排序,并将其地址保存在一个整型数组中,该数组则称为字符串的后缀数组。最长公共前缀是后缀数组中相邻的两个后缀之间公共前缀的字符数。长度为n的字符串对应的最长公共前缀数组LCPA长度也为n,LCPA第一个元素为0,从第二个元素开始依次保存n个后缀对应的n-1个LCP值。后缀数组SA和最长公共前缀数组LCPA二者结合起来可以实现数据的全文索引,广泛应用于字符串处理、数据压缩、模式匹配、基因重组等领域。在SA和LCPA构造完成后,为了避免可能存在的缺陷或计算错误,对二者进行正确性验证是必需的。目前已知的SA和LCPA正确性验证方法是两个相互独立的过程,先验证SA的正确性,然后再验证LCPA的正确性。比如,现有的SA正确性验证方法是在SA构造完成以后,执行两轮整数排序来验证SA的正确性。LCPA的正确性验证通常是采用暴力的方法依次对后缀数组中相邻两个后缀的公共前缀进行比较来验证。在数据集规模较大的情况下,由于两个验证过程相互独立,时间和空间开销相对较大。
技术实现思路
本专利技术提供一种后缀数组和最长公共前缀的正确性验证方法及系统,以克服后缀数组和最长公共前缀的正确性验证不能同时进行的问题。本专利技术旨在至少在一定程度上解决上述技术问题。为了达到上述技术效果,本专利技术的技术方案如下:一种后缀数组和最长公共前缀的正确性验证方法,包括:从右向左扫描一遍T,按照后缀类型定义比较字符T[i]及其后继字符T[i+1]的大小,计算T的字符T[i]和后缀suf(T,i)的类型,记录于t[i]中;将SA1和LCPA1中的元素初始化为-1。从左到右扫描一遍SA,根据数组t找出SA中所有LMS后缀及其LCP值,分别依次记录在SA1和LCPA1中;根据字符串T、数组t、SA1和LCPA1,对SA1中相邻LMS后缀及其LCP值进行正确性验证;根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的L型后缀及其LCP值;根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的S型后缀及其LCP值;顺序扫描SA、SA1、LCPA和LCPA1一次,比较SA与SA1和LCPA与LCPA1是否相同,如果两组比较全部相同则T的SA和LCPA正确,否则错误。优选地,根据字符串T、数组t、SA1和LCPA1,对SA1中相邻LMS后缀及其LCP值进行正确性验证,包括:计算FP(SA1[i],SA1[i]+LCPA1[i+1]-1)的指纹值,其中i∈[0,n1-2],并保存字符T[SA1[i]+LCPA1[i+1]];计算FP(SA1[j],SA1[j]+LCPA1[j]-1)的指纹值,其中j∈[1,n1-1],并保存字符T[SA1[j]+LCPA1[j]];逐次将指纹值FP(SA1[i],SA1[i]+LCPA1[i+1]-1)与FP(SA1[j],SA1[j]+LCPA1[j]-1)和字符T[SA1[i]+LCPA1[i+1]]与T[SA1[j]+LCPA1[j]]进行比较,如果指纹值相同且字符不同,说明LMS后缀及其LCP值正确。优选地,根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的L型后缀及其LCP值,包括:(1)计算SA1中各字符桶的结束位置,保存在B数组中。从右向左扫描SA1,如果当前元素SA1[i]为-1,则继续扫描下一个元素,否则将SA1[i]保存至SA1中B[T[SA1[i]]]所指向的位置,同时将LCPA1[i]保存至LCPA1中B[T[SA1[i]]]所指向的位置,然后将SA1[i]字符桶的结束位置左移一步,将B[T[SA1[i]]]更新为B[T[SA[i]]]-1,最后将SA1[i]和LCPA1[i]设置为-1。其中,SA1和LCPA1都是整型数组,分别保存了有序的LMS后缀及其LCP值,SA1与LCPA1的元素之间存在一一对应的关系。由于LMS后缀个数小于n,SA1和LCP1数组中只有部分空间有数据,其余空间的元素为-1。在从右向左扫描过程中,如果SA1元素不为-1,则将该元素填入SA1中对应字符桶的尾部,同时将该元素置为-1,该元素对应的LCPA1中的值也执行相同的移动和修改操作。(2)计算SA1中各字符桶的开始位置,保存在B数组中。从左向右扫描SA1,如果当前元素SA1[i]在T中的前继T[SA1[i]-1]为S型或SA1[i]为-1,继续扫描下一个,否则将SA1[i]-1保存在SA1中B[T[SA1[i]-1]]指向的位置;接着计算SA1[B[T[SA1[i]-1]]]与其左侧最近的非-1元素SA1[j](0≤j<B[T[SA1[i]-1]])的LCP值,如果两者指向的T中的字符不同则LCPA1[B[T[SA1[i]-1]]]=0,如果两者指向的T中的字符和字符类型都相同则LCPA1[B[T[SA1[i]-1]]]=C[T[SA1[i]-1]]+1;最后将B[T[SA1[i]-1]]更新为B[T[SA1[i]-1]]+1,即指向T[SA1[i]-1]字符桶的后一个位置。其中,C数组保存的是当前元素SA1[i]与其左侧非-1元素SA1[k](k∈[0,i-1])的最长公共前缀,即LCPA1在区间[k+1,i]的RMQ值,其中k满足条件是:T[SA1[k]-1]与T[SA1[i]-1]相同,且在SA1的区间[k+1,i-1]中,没有元素在T中的前缀字符与T[SA1[i]-1]相同。优选地,其特征在于,根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的S型后缀及其LCP值,包括:计算SA1中各字符桶的结束位置,保存在B数组。从右向左扫描SA1,如果当前元素SA1[i]在T中的前继T[SA1[i]-1]为L型后缀,继续扫描下一个元素,否则将SA1[i]-1保存在SA1中B[T[SA1[i]-1]]指向的位置;接着计算SA1[B[T[SA1[i]-1]]]与其右侧相邻元素SA1[B[T[SA1[i]-1]]+1]的LCP值,如果两者指向的T中的字符不相同则LCPA1[B[T[SA1[i]-1]]+1]=0,如果两者指向的T中的字符和字符类型都相同则LCPA1[B[T[SA1[i]-1]]+1]=C[T[SA1[i]-1]]]+1;最后,单独计算各字符桶中最右侧的L型和最左侧的S型元素的LCP值,同时将B[T[SA1[i]-1]]更新为B[T[SA1[i]-1]]-1,即指向T[SA1[i]-1]字符桶的前一个位置。其中,C数组保存的是当前扫描元素SA1[i]与其右侧元素SA1[k](k∈[i+1,n-1])的最长公共前缀,即LCPA1数组中区间[i+1,k]的RMQ值,其中k的位置满足条件是:T[SA1[k]-1]与T[SA1[i]-1]相同,且在SA1的区间[i+1,k-1]中,没有元素在T中的前缀字符与T[SA1[i]-1]相同。一种后缀数组和最长公共前缀的正确性验证系统,包括:文件本文档来自技高网...
一种后缀数组和最长公共前缀的正确性验证方法及系统

【技术保护点】
一种后缀数组和最长公共前缀的正确性验证方法,其特征在于,包括:从右向左扫描一遍T,按照后缀类型定义比较字符T[i]及其后继字符T[i+1]的大小,计算T的字符T[i]和后缀suf(T,i)的类型,记录于t[i]中;将SA1和LCPA1中的元素初始化为‑1,从左到右扫描一遍SA,根据数组t找出SA中所有LMS后缀及其LCP值,分别依次记录在SA1和LCPA1中;根据字符串T、数组t、SA1和LCPA1,对SA1中相邻LMS后缀及其LCP值进行正确性验证;根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的L型后缀及其LCP值;根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的S型后缀及其LCP值;顺序扫描SA、SA1、LCPA和LCPA1一次,比较SA与SA1和LCPA与LCPA1是否相同,如果两组比较全部相同则T的SA和LCPA正确,否则错误。

【技术特征摘要】
1.一种后缀数组和最长公共前缀的正确性验证方法,其特征在于,包括:从右向左扫描一遍T,按照后缀类型定义比较字符T[i]及其后继字符T[i+1]的大小,计算T的字符T[i]和后缀suf(T,i)的类型,记录于t[i]中;将SA1和LCPA1中的元素初始化为-1,从左到右扫描一遍SA,根据数组t找出SA中所有LMS后缀及其LCP值,分别依次记录在SA1和LCPA1中;根据字符串T、数组t、SA1和LCPA1,对SA1中相邻LMS后缀及其LCP值进行正确性验证;根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的L型后缀及其LCP值;根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的S型后缀及其LCP值;顺序扫描SA、SA1、LCPA和LCPA1一次,比较SA与SA1和LCPA与LCPA1是否相同,如果两组比较全部相同则T的SA和LCPA正确,否则错误。2.根据权利要求1所述的后缀数组和最长公共前缀的正确性验证方法,其特征在于,根据字符串T、数组t、SA1和LCPA1,对SA1中相邻LMS后缀及其LCP值进行正确性验证,包括:计算FP(SA1[i],SA1[i]+LCPA1[i+1]-1)的指纹值,其中i∈[0,n1-2],并保存字符T[SA1[i]+LCPA1[i+1]];计算FP(SA1[j],SA1[j]+LCPA1[j]-1)的指纹值,其中j∈[1,n1-1],并保存字符T[SA1[j]+LCPA1[j]];逐次将指纹值FP(SA1[i],SA1[i]+LCPA1[i+1]-1)与FP(SA1[j],SA1[j]+LCPA1[j]-1)和字符T[SA1[i]+LCPA1[i+1]]与T[SA1[j]+LCPA1[j]]进行比较,如果指纹值相同且字符不同,说明LMS后缀及其LCP值正确。3.根据权利要求1所述的后缀数组和最长公共前缀的正确性验证方法,其特征在于,根据字符串T、数组t、B、C、SA1和LCPA1,归纳排序T的L型后缀及其LCP值,包括:计算SA1中各字符桶的结束位置,保存在B数组中;从右向左扫描SA1,如果当前元素SA1[i]为-1,则继续扫描下一个元素,否则将SA1[i]保存至SA1中B[T[SA1[i]]]所指向的位置,同时将LCPA1[i]保存至LCPA1中B[T[SA1[i]]]所指向的位置,然后将SA1[i]字符桶的结束位置左移一步,将B[T[SA1[i]]]更新为B[T[SA[i]]]-1,最后将SA1[i]和LCPA1[i]设置为-1;其中,SA1和LCPA1都是整型数组,分别保存了有序的LMS后缀及其LCP值,SA1与LCPA1的元素之间存在一一对应的关系;由于LMS后缀个数小于n,SA1和LCP1数组中只有部分空间有数据,其余空间的元素为-1,在从右向左扫描过程中,如果SA1元素不为-1,则将该元素填入SA1中对应字符桶的尾部,同时将该元素置为-1,该元素对应的LCPA1中的值也执行相同的移动和修改操作;计算SA1中各字符桶的开始位置,保存在B数组中,从左向右扫描SA1,如果当前元素SA1[i]在T中的前继T[SA1[i]-1]为S型或SA1[i]为-1,继续扫描下一个,否则将SA1[i]-1保存在SA1中B[T[SA1[i]-1]]指向的位置;接着计算SA1[B[T[SA1[i]-1]]]与其左侧最近的非-1元素SA1[j](0≤j<B[T[SA1[i]-1]])的LCP值,如果两者指向的T中的字符不同则LCPA1[B[T[SA1[i]-1]]]=0,如果两者指向的T中的字符和字符类型都...

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

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

1