CN106777920A - 确定最长公共子序列的方法和装置 - Google Patents
确定最长公共子序列的方法和装置 Download PDFInfo
- Publication number
- CN106777920A CN106777920A CN201611075708.9A CN201611075708A CN106777920A CN 106777920 A CN106777920 A CN 106777920A CN 201611075708 A CN201611075708 A CN 201611075708A CN 106777920 A CN106777920 A CN 106777920A
- Authority
- CN
- China
- Prior art keywords
- current
- array
- character
- value
- character string
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G16—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR SPECIFIC APPLICATION FIELDS
- G16Z—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR SPECIFIC APPLICATION FIELDS, NOT OTHERWISE PROVIDED FOR
- G16Z99/00—Subject matter not provided for in other main groups of this subclass
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提出一种确定最长公共子序列的方法和装置,其中,该确定最长公共子序列的方法包括:获取待匹配的第一字符序列和第二字符序列,根据所述第一字符序列构建以所述第一字符序列中的字符为关键字,并以对应字符的位置值为哈希值的哈希表;根据预设规则、所述第二字符序列和所述哈希表更新一维动态数组和二维动态数组,并获取遍历所述第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,根据所述第一字符序列、所述目标一维数组和所述目标二维数组确定最长公共子序列。由此,提出了一种新的确定最长公共子序列的方式,利用哈希表和动态数组计算最长公共子序列,对LCS算法的时间进行优化,提高了确定最长公共子序列的效率。
Description
技术领域
本发明涉及互联网技术领域,特别涉及一种确定最长公共子序列的方法和装置。
背景技术
LCS(Longest Common Subsequence,最长公共子序列)算法是计算机科学领域比较经典的算法,用来比较序列的相似程度,具体说是用来寻找多个序列(一般是两个)最长公共子序列的一种算法。
相关技术中,通常采用动态规划算法或者一些优化的动态规划算法来确定两个序列之间的最长公共子序列。例如,节省内容的LCS算法,该算法在原有动态规划算法的基础上,对算法空间优化,以减少算法所占的空间。然而,相关的动态规范算法在最长公共子序列查找的最坏和最好时间复杂度都是O(mn),(其中m,n分别为2个匹配串的长度),在大部分实际数据的运算中时间较慢,不适合大规模计算。
发明内容
本发明旨在至少在一定程度上解决上述技术问题。
为此,本发明的第一个目的在于提出一种确定最长公共子序列的方法,提出了一种新的确定最长公共子序列的方式,该方法利用哈希表和动态数组计算最长公共子序列,对LCS算法的时间进行优化,降低了运算时间,提高了确定最长公共子序列的效率。
本发明的第二个目的在于提出一种确定最长公共子序列的装置。
为达上述目的,根据本发明第一方面实施例提出了一种确定最长公共子序列的方法,包括以下步骤:获取待匹配的第一字符序列和第二字符序列,其中,所述第一字符序列的长度为m,所述第二字符序列的长度为n,m大于或者等于n;根据所述第一字符序列构建以所述第一字符序列中的字符为关键字,并以对应字符的位置值为哈希值的哈希表;根据预设规则、所述第二字符序列和所述哈希表更新一维动态数组和二维动态数组,并获取遍历所述第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,其中,所述目标一维数组的长度N为所述第一字符序列与第二字符序列的最长公共子序列的长度,所述目标一维数组用于保存长度为i的公共子序列中最后一个字符最小的位置值,所述目标二维数组的第j行用于保存长度为j的公共子序列中最后一个字符所有的位置值,其中,i和j均为大于零,且小于或者等于N的整数;根据所述第一字符序列、所述目标一维数组和所述目标二维数组确定最长公共子序列。
根据本发明实施例的确定最长公共子序列的方法,在确定第一字符序列和第二字符序列的最长公共子序列的过程中,根据第一字符序列构建一个以字符为关键字,以字符对应的位置值为哈希值的哈希表,并根据预设规则、第二字符序列和哈希表更新一维动态数组和二维动态数组,并获取遍历第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,以及根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列。由此,提出了一种新的确定最长公共子序列的方式,该方法利用哈希表和动态数组计算最长公共子序列,对LCS算法的时间进行优化,降低了运算时间,提高了确定最长公共子序列的效率。
为达上述目的,本发明第二方面实施例提出了一种确定最长公共子序列的装置,包括:获取模块,用于获取待匹配的第一字符序列和第二字符序列,其中,所述第一字符序列的长度为m,所述第二字符序列的长度为n,m大于或者等于n;构建模块,用于根据所述第一字符序列构建以所述第一字符序列中的字符为关键字,并以对应字符的位置值为哈希值的哈希表;处理模块,用于根据预设规则、所述第二字符序列和所述哈希表更新一维动态数组和二维动态数组,并获取遍历所述第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,其中,所述目标一维数组的长度N为所述第一字符序列与第二字符序列的最长公共子序列的长度,所述目标一维数组用于保存长度为i的公共子序列中最后一个字符最小的位置值,所述目标二维数组的第j行用于保存长度为j的公共子序列中最后一个字符所有的位置值,其中,i和j均为大于零,且小于或者等于N的整数;确定模块,用于根据所述第一字符序列、所述目标一维数组和所述目标二维数组确定最长公共子序列。
根据本发明实施例的确定最长公共子序列的装置,在确定第一字符序列和第二字符序列的最长公共子序列的过程中,根据第一字符序列构建一个以字符为关键字,以字符对应的位置值为哈希值的哈希表,并根据预设规则、第二字符序列和哈希表更新一维动态数组和二维动态数组,并获取遍历第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,以及根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列。由此,提出了一种新的确定最长公共子序列的方式,该方法利用哈希表和动态数组计算最长公共子序列,对LCS算法的时间进行优化,降低了运算时间,提高了确定最长公共子序列的效率。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
图1为根据本发明一个实施例的确定最长公共子序列的方法的流程图;
图2为根据本发明一个实施例的根据预设规则、第二字符序列和哈希表更新一维动态数组和二维动态数组的细化流程图;
图3为根据本发明一个实施例的根据当前哈希值和当前一维动态数组中最后一个元素的取值更新当前一维动态数组和当前二维动态数组的细化流程图;
图4为根据本发明一个实施例的根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列的细化流程图;
图5为根据本发明一个实施例的确定最长公共子序列的装置的结构示意图;
图6为根据本发明一个实施例的处理模块的结构示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
在本发明的描述中,需要理解的是,术语“多个”指两个或两个以上;术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。
下面参考附图描述根据本发明实施例的确定最长公共子序列的方法和装置。
图1为根据本发明一个实施例的确定最长公共子序列的方法的流程图。
如图1所示,根据本发明实施例的确定最长公共子序列的方法,包括以下步骤。
S11,获取待匹配的第一字符序列和第二字符序列。
其中,第一字符序列的长度为m,第二字符序列的长度为n,m大于或者等于n。
S12,根据第一字符序列构建以第一字符序列中的字符为关键字,并以对应字符的位置值为哈希值的哈希表。
举例而言,假设待匹配的第一字符序列为ABCBDAB,第二字符序列为BDCABA,根据第一字符序列构建的哈希表的形式如下所示:
A—>[0,5]
B—>[1,3,6]
C—>[2]
D—>[4]
其中,A—>[0,5]表示关键字A对应的哈希值为0和5,即,位置值0和5对应的字符均为A。
S13,根据预设规则、第二字符序列和哈希表更新一维动态数组和二维动态数组,并获取遍历第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组。
其中,目标一维数组的长度N为第一字符序列与第二字符序列的最长公共子序列的长度。
其中,目标一维数组用于保存长度为i的公共子序列中最后一个字符最小的位置值。
其中,目标二维数组的第j行用于保存长度为j的公共子序列中最后一个字符所有的位置值。
其中,需要说明的是,上述i和j均为大于零,且小于或者等于N的整数。
在本发明的一个实施例中,根据预设规则、第二字符序列和哈希表更新一维动态数组和二维动态数组的过程,如图2所示,可以包括以下步骤:
S21,按顺序遍历第二字符序列中的每个字符,判断哈希表中是否存在当前字符的哈希值。
S22,若判断哈希表中存在当前字符的哈希值,则进一步判断当前字符的哈希值的个数是否为多个。
其中,需要理解的是,如果哈希表中不存在当前字符,则确定当前字符不是第一字符序列和第二字符序列中共存的字符,并继续遍历下一个字符。
S23,若判断当前字符的哈希值的个数为多个,则按照哈希值从大到小的顺序遍历当前字符的哈希值。
其中,需要说明的是,若判断当前字符的哈希值的个数为一个,则直接执行步骤S24。
S24,在遍历当前字符的每个哈希值时,判断当前一维动态数组是否为空。
S25,如果判断当前一维动态数组为空,则根据当前字符的当前哈希值更新当前一维动态数组和当前二维动态数组。
其中,需要理解的是,初始时,一维动态数组和二维动态数组中均没有数组元素。
S26,如果判断当前一维动态数组为非空,则根据当前哈希值和当前一维动态数组中最后一个元素的取值更新当前一维动态数组和当前二维动态数组。
在本发明的一个实施例中,根据当前哈希值和当前一维动态数组中最后一个元素的取值更新当前一维动态数组和当前二维动态数组的具体过程,如图3所示,可以包括:
S261,判断当前哈希值是否大于当前一维动态数组中最后一个元素的取值。
S262,若判断当前哈希值大于当前一维动态数组中最后一个元素的取值,则将当前哈希值添加至当前一维动态数组中最后一个元素之后,并为当前二维动态数组新增加一行以及将当前哈希值增加到新增加的行中。
S263,若判断当前哈希值小于或者等于当前一维动态数组中最后一个元素的取值,则根据当前哈希值对当前一维动态数组进行二分查找,以获取二分查找返回的下标值,并用当前哈希值替换一维动态数组中下标值对应的元素,并根据返回的下标值确定当前二维动态数组中相应的行数,并在当前二维动态数组中相应的行中增加当前哈希值,并将当前哈希值作为当前二维动态数组中相应的行的第一个元素。
举例而言,假设待匹配的第一字符序列为ABCBDAB,第二字符序列为BDCABA,根据第一字符序列构建的哈希表的形式如下所示:A—>[0,5]B—>[1,3,6]C—>[2]D—>[4],在顺序遍历第二字符序列中的字符的过程中,在遍历第二字符序列中的第一个字符B时,通过查询哈希表,可以确定字符B对应三个哈希值,分别为1,3,6。此时,按照哈希值从大到小的顺序遍历当前字符的哈希值,假设用vec表示一维动态数组的数组名,用vec2vec表示二维动态数组的数组名,由于初始时一维动态数组vec为空,在当前哈希值为6时,可判断出一维数组vec为空,根据当前哈希值更新一维动态数组和二维动态数组后,vec[0]=6,vec2vec[0]=6;在当前哈希值为3时,由于一维数组vec中为非空,进一步判断当前哈希值与一维数组vec中最后一个元素的取值,可确定3小于6,以3为值二分查找一维数组vec,二分查找返回的下标值为0,则根据当前哈希值更新一维动态数组和二维动态数组后,一维动态数组vec[0]=3,在二维动态数组vec2vec[0]={3,6}。在当前哈希值为1时,根据当前哈希值更新当前一维动态数组和当前二维动态数组后,一维动态数组vec[0]=1,二维动态数组vec2vec[0]={1,3,6}。基于上述预设规则,在遍历D之后,一维动态数组vec={1,4},二维动态数组vec2vec={{1,3,6},{4}};在遍历C之后,一维动态数组vec={1,2},二维动态数组vec2vec={{1,3,6},{2,4}};在遍历A之后,一维动态数组vec={0,2,5},二维动态数组vec2vec={{0,1,3,6},{2,4},{5}},在遍历B之后,一维动态数组vec={0,1,3,6},二维动态数组vec2vec={{0,1,3,6},{1,2,4},{3,5},{6}},在遍历A之后,一维动态数组vec={0,1,3,5},二维动态数组vec2vec={{0,1,3,6},{1,2,4},{3,5},{5,6}}。在遍历A之后所获得的一维动态数组vec={0,1,3,5}即为目标一维数组,二维动态数组vec2vec={{0,1,3,6},{1,2,4}{3,5}{5,6}}即为目标二维数组。
S14,根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列。
在本发明的一个实施例中,根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列的过程,如图4所示,可以包括:
S41,将N-1作为中间变量k的取值。
S42,将目标一维数组中最后一个元素的取值作为位置阈值。
S43,根据目标一维数组中最后一个元素的取值,从第一字符序列中获取对应位置值上的字符,并将所获取的字符作为第一最长公共子序列的第一个元素。
S44,将中间变量k的取值减1之后所获得的取值作为中间变量k的当前取值。
S45,判断中间变量k的当前取值是否大于或者等于零,若是,则执行步骤S46至S47之后,返回步骤S44,若否,则执行步骤S48。
S46,根据中间变量k的当前取值确定目标二维元素的行数,并从目标二维数组中对应行中查找小于位置阈值的元素,并根据小于位置阈值的元素中的最大值更新位置阈值。
在本发明的一个实施例中,为了可以快速定位出小于位置阈值的元素的最大值,可以位置阈值为值,二分查找目标二维数组中对应行中小于位置阈值的元素的最大值,并通过最大值更新位置阈值。
S47,根据更新后的位置阈值,从第一字符序列中获取对应位置值上的字符,并将所获取的字符添加至第一最长公共子序列中。
S48,将当前获得的第一最长公共子序列进行反序处理,并将反序处理的结果作为最长公共子序列。
举例而言,假设待匹配的第一字符序列为ABCBDAB,第二字符序列为BDCABA,根据第一字符序列构建的哈希表的形式如下所示:A—>[0,5]B—>[1,3,6]C—>[2]D—>[4],遍历第二字符序列之后,所获得的所获得的目标一维数组vec={0,1,3,5},目标二维数组vec2vec={{0,1,3,6},{1,2,4}{3,5}{5,6}},可计算出一维数组的长度N为4,即,最长公共子序列的长度为4,第一次处理时,k=3,位置阈值use_threshold=vec[len(vec)-1]=5,第一最长公共子序列lcs+=(m[5]=A)。
第二次处理时,k=2,vec2vec[2]=[3,5],vec2vec[2]中<(位置阈值use_threshold=5)的最大值为3,根据最大值更新位置阈值,更新后的位置阈值use_threshold=3,lcs+=(m[3]=B),lcs=AB。
第三次处理时,k=1,vec2vec[1]=[1,2,4],vec2vec[1]中<(位置阈值use_threshold=3)的最大值为2,根据最大值更新位置阈值,更新后的位置阈值use_threshold=2,lcs+=(m[2]=C),lcs=ABC。
第四次处理时,k=0,vec2vec[0]=[0,1,3,6],vec2vec[0]中<(use_threshold=2)的最大值为1,根据最大值更新位置阈值,更新后的位置阈值use_threshold=1,lcs+=(m[1]=B),lcs=ABCB,对lcs进行反序处理后,所得的反序结果为BCAB,BCAB即为第一字符序列和第二字符序列的最长公共子序列。
综上可以看出,在该实施例的确定最长公共子序列的方法,利用哈希表和动态数组计算最长公共子序列,能够优化LCS查找的最坏时间复杂度到O(k*lg(N)+N*lg(m))、最好时间复杂度为O(k*lg(N)),其中n<=m,N为最长公共子序列长度,k为2个字符序列共存的单字符对数量,例如:第一字符序列为ABCBDAB,第二字符序列为:BDCABA,共存单字符对A:2*2=4,B:2*3=6,C:1*1=1,D:1*1=1,k=12。另外,在第一字符序列中不存重复单字符情况下,可计算出最好时间复杂度为O(k*lg(N)),这时k<=n。
根据本发明实施例的确定最长公共子序列的方法,在确定第一字符序列和第二字符序列的最长公共子序列的过程中,根据第一字符序列构建一个以字符为关键字,以字符对应的位置值为哈希值的哈希表,并根据预设规则、第二字符序列和哈希表更新一维动态数组和二维动态数组,并获取遍历第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,以及根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列。由此,提出了一种新的确定最长公共子序列的方式,该方法利用哈希表和动态数组计算最长公共子序列,对LCS算法的时间进行优化,降低了运算时间,提高了确定最长公共子序列的效率。
为了实现上述实施例,本发明还提出一种确定最长公共子序列的装置。
图5为根据本发明一个实施例的确定最长公共子序列的装置的结构示意图。
如图5所示,根据本发明实施例的确定最长公共子序列的装置,包括:获取模块110、构建模块120、处理模块130和确定模块140,其中:
获取模块110用于获取待匹配的第一字符序列和第二字符序列。
其中,第一字符序列的长度为m,第二字符序列的长度为n,m大于或者等于n。
构建模块120用于根据第一字符序列构建以第一字符序列中的字符为关键字,并以对应字符的位置值为哈希值的哈希表。
处理模块130用于根据预设规则、第二字符序列和哈希表更新一维动态数组和二维动态数组,并获取遍历第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组。
其中,目标一维数组的长度N为第一字符序列与第二字符序列的最长公共子序列的长度。
其中,目标一维数组用于保存长度为i的公共子序列中最后一个字符最小的位置值。
其中,目标二维数组的第j行用于保存长度为j的公共子序列中最后一个字符所有的位置值。
其中,i和j均为大于零,且小于或者等于N的整数。
确定模块140用于根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列。
在本发明的一个实施例中,如图6所示,处理模块130可以包括第一判断单元131、第二判断单元132、遍历单元133、第三判断单元134、第一更新单元135和第二更新单元136,其中:
第一判断单元131用于按顺序遍历第二字符序列中的每个字符,判断哈希表中是否存在当前字符的哈希值。
第二判断单元132用于在若判断哈希表中存在当前字符的哈希值时,进一步判断当前字符的哈希值的个数是否为多个。
遍历单元133用于在判断当前字符的哈希值的个数为多个,则按照哈希值从大到小的顺序遍历当前字符的哈希值。
第三判断单元134用于在遍历当前字符的每个哈希值时,判断当前一维动态数组是否为空。
第一更新单元135用于在判断当前一维动态数组为空时,根据当前字符的当前哈希值更新当前一维动态数组和当前二维动态数组。
第二更新单元136用于在判断当前一维动态数组为非空时,根据当前哈希值和当前一维动态数组中最后一个元素的取值更新当前一维动态数组和当前二维动态数组。
在本发明的一个实施例中,第二更新单元136具体用于:判断当前哈希值是否大于当前一维动态数组中最后一个元素的取值,若判断当前哈希值大于当前一维动态数组中最后一个元素的取值,则将当前哈希值添加至当前一维动态数组中最后一个元素之后,并为当前二维动态数组新增加一行以及将当前哈希值增加到新增加的行中;若判断当前哈希值小于或者等于当前一维动态数组中最后一个元素的取值,则根据当前哈希值对当前一维动态数组进行二分查找,以获取二分查找返回的下标值,用当前哈希值替换一维动态数组中下标值对应的元素,并根据返回的下标值确定当前二维动态数组中相应的行数,并在当前二维动态数组中相应的行中增加当前哈希值,并将当前哈希值作为当前二维动态数组中相应的行的第一个元素。
在本发明的一个实施例中,确定模块140通过步骤S41至S48确定最长公共子序列,其中:S41,将N-1作为中间变量k的取值。S42,将目标一维数组中最后一个元素的取值作为位置阈值。S43,根据目标一维数组中最后一个元素的取值,从第一字符序列中获取对应位置值上的字符,并将所获取的字符作为第一最长公共子序列的第一个元素。S44,将中间变量k的取值减1之后所获得的取值作为中间变量k的当前取值。S45,判断中间变量k的当前取值是否大于或者等于零,若是,则执行步骤S46至S47之后,返回步骤S44,若否,则执行步骤S48。S46,根据中间变量k的当前取值确定目标二维元素的行数,并从目标二维数组中对应行中查找小于位置阈值的元素,并根据小于位置阈值的元素中的最大值更新位置阈值。S47,根据更新后的位置阈值,从第一字符序列中获取对应位置值上的字符,并将所获取的字符添加至第一最长公共子序列中。S48,将当前获得的第一最长公共子序列进行反序处理,并将反序处理的结果作为最长公共子序列。其中,确定模块140根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列的具体过程,如图4所示,此处不再赘述。
在本发明的一个实施例中,确定模块140具体用于:以位置阈值为值,二分查找目标二维数组中对应行中小于位置阈值的元素的最大值,并通过最大值更新位置阈值。
其中,需要说明的是,前述对确定最长公共子序列的方法的解释说明也适用于该实施例的确定最长公共子序列的装置,此处不再赘述。
根据本发明实施例的确定最长公共子序列的装置,在确定第一字符序列和第二字符序列的最长公共子序列的过程中,根据第一字符序列构建一个以字符为关键字,以字符对应的位置值为哈希值的哈希表,并根据预设规则、第二字符序列和哈希表更新一维动态数组和二维动态数组,并获取遍历第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,以及根据第一字符序列、目标一维数组和目标二维数组确定最长公共子序列。由此,提出了一种新的确定最长公共子序列的方式,该方法利用哈希表和动态数组计算最长公共子序列,对LCS算法的时间进行优化,降低了运算时间,提高了确定最长公共子序列的效率。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,"计算机可读介质"可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDROM)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
Claims (10)
1.一种确定最长公共子序列的方法,其特征在于,包括以下步骤:
获取待匹配的第一字符序列和第二字符序列,其中,所述第一字符序列的长度为m,所述第二字符序列的长度为n,m大于或者等于n;
根据所述第一字符序列构建以所述第一字符序列中的字符为关键字,并以对应字符的位置值为哈希值的哈希表;
根据预设规则、所述第二字符序列和所述哈希表更新一维动态数组和二维动态数组,并获取遍历所述第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,其中,所述目标一维数组的长度N为所述第一字符序列与第二字符序列的最长公共子序列的长度,所述目标一维数组用于保存长度为i的公共子序列中最后一个字符最小的位置值,所述目标二维数组的第j行用于保存长度为j的公共子序列中最后一个字符所有的位置值,其中,i和j均为大于零,且小于或者等于N的整数;
根据所述第一字符序列、所述目标一维数组和所述目标二维数组确定最长公共子序列。
2.如权利要求1所述的方法,其特征在于,所述根据预设规则、所述第二字符序列和所述哈希表更新一维动态数组和二维动态数组,包括:
按顺序遍历所述第二字符序列中的每个字符,判断所述哈希表中是否存在当前字符的哈希值;
若判断所述哈希表中存在当前字符的哈希值,则进一步判断当前字符的哈希值的个数是否为多个;
若判断当前字符的哈希值的个数为多个,则按照哈希值从大到小的顺序遍历所述当前字符的哈希值;
在遍历当前字符的每个哈希值时,判断当前一维动态数组是否为空;
如果判断当前一维动态数组为空,则根据所述当前字符的当前哈希值更新当前一维动态数组和当前二维动态数组;
如果判断当前一维动态数组为非空,则根据当前哈希值和当前一维动态数组中最后一个元素的取值更新当前一维动态数组和当前二维动态数组。
3.如权利要求2所述的方法,其特征在于,所述根据当前哈希值和当前一维动态数组中最后一个元素的取值更新当前一维动态数组和当前二维动态数组,包括:
判断当前哈希值是否大于当前一维动态数组中最后一个元素的取值;
若判断当前哈希值大于当前一维动态数组中最后一个元素的取值,则将当前哈希值添加至当前一维动态数组中最后一个元素之后,并为当前二维动态数组新增加一行以及将当前哈希值增加到新增加的行中;
若判断当前哈希值小于或者等于当前一维动态数组中最后一个元素的取值,则根据当前哈希值对当前一维动态数组进行二分查找,以获取二分查找返回的下标值,用当前哈希值替换一维动态数组中下标值对应的元素,并根据返回的下标值确定当前二维动态数组中相应的行数,并在当前二维动态数组中相应的行中增加当前哈希值,并将当前哈希值作为当前二维动态数组中相应的行的第一个元素。
4.如权利要求1所述的方法,其特征在于,所述根据所述第一字符序列、所述目标一维数组和所述目标二维数组确定最长公共子序列,包括:
S41,将N-1作为中间变量k的取值;
S42,将所述目标一维数组中最后一个元素的取值作为位置阈值;
S43,根据所述目标一维数组中最后一个元素的取值,从所述第一字符序列中获取对应位置值上的字符,并将所获取的字符作为第一最长公共子序列的第一个元素;
S44,将中间变量k的取值减1之后所获得的取值作为中间变量k的当前取值;
S45,判断中间变量k的当前取值是否大于或者等于零,若是,则执行步骤S46至S47之后,返回步骤S44,若否,则执行步骤S48;
S46,根据中间变量k的当前取值确定所述目标二维元素的行数,并从所述目标二维数组中对应行中查找小于位置阈值的元素,并根据小于位置阈值的元素中的最大值更新位置阈值;
S47,根据更新后的位置阈值,从所述第一字符序列中获取对应位置值上的字符,并将所获取的字符添加至第一最长公共子序列中;
S48,将当前获得的第一最长公共子序列进行反序处理,并将反序处理的结果作为所述最长公共子序列。
5.如权利要求4所述的方法,其特征在于,所述从所述目标二维数组中对应行中查找小于位置阈值的元素,并根据小于位置阈值的元素中的最大值更新位置阈值,包括:
以位置阈值为值,二分查找所述目标二维数组中对应行中小于位置阈值的元素的最大值,并通过最大值更新位置阈值。
6.一种确定最长公共子序列的装置,其特征在于,包括:
获取模块,用于获取待匹配的第一字符序列和第二字符序列,其中,所述第一字符序列的长度为m,所述第二字符序列的长度为n,m大于或者等于n;
构建模块,用于根据所述第一字符序列构建以所述第一字符序列中的字符为关键字,并以对应字符的位置值为哈希值的哈希表;
处理模块,用于根据预设规则、所述第二字符序列和所述哈希表更新一维动态数组和二维动态数组,并获取遍历所述第二字符序列中最后一个字符之后所获得的目标一维数组和目标二维数组,其中,所述目标一维数组的长度N为所述第一字符序列与第二字符序列的最长公共子序列的长度,所述目标一维数组用于保存长度为i的公共子序列中最后一个字符最小的位置值,所述目标二维数组的第j行用于保存长度为j的公共子序列中最后一个字符所有的位置值,其中,i和j均为大于零,且小于或者等于N的整数;
确定模块,用于根据所述第一字符序列、所述目标一维数组和所述目标二维数组确定最长公共子序列。
7.如权利要求6所述的装置,其特征在于,所述处理模块,包括:
第一判断单元,用于按顺序遍历所述第二字符序列中的每个字符,判断所述哈希表中是否存在当前字符的哈希值;
第二判断单元,用于在若判断所述哈希表中存在当前字符的哈希值时,进一步判断当前字符的哈希值的个数是否为多个;
遍历单元,用于在判断当前字符的哈希值的个数为多个,则按照哈希值从大到小的顺序遍历所述当前字符的哈希值;
第三判断单元,用于在遍历当前字符的每个哈希值时,判断当前一维动态数组是否为空;
第一更新单元,用于在判断当前一维动态数组为空时,根据所述当前字符的当前哈希值更新当前一维动态数组和当前二维动态数组;
第二更新单元,用于在判断当前一维动态数组为非空时,根据当前哈希值和当前一维动态数组中最后一个元素的取值更新当前一维动态数组和当前二维动态数组。
8.如权利要求7所述的装置,其特征在于,所述第二更新单元,具体用于:
判断当前哈希值是否大于当前一维动态数组中最后一个元素的取值;
若判断当前哈希值大于当前一维动态数组中最后一个元素的取值,则将当前哈希值添加至当前一维动态数组中最后一个元素之后,并为当前二维动态数组新增加一行以及将当前哈希值增加到新增加的行中;
若判断当前哈希值小于或者等于当前一维动态数组中最后一个元素的取值,则根据当前哈希值对当前一维动态数组进行二分查找,以获取二分查找返回的下标值,用当前哈希值替换一维动态数组中下标值对应的元素,并根据返回的下标值确定当前二维动态数组中相应的行数,并在当前二维动态数组中相应的行中增加当前哈希值,并将当前哈希值作为当前二维动态数组中相应的行的第一个元素。
9.如权利要求6所述的装置,其特征在于,所述确定模块通过步骤S41至S48确定最长公共子序列,其中:
S41,将N-1作为中间变量k的取值;
S42,将所述目标一维数组中最后一个元素的取值作为位置阈值;
S43,根据所述目标一维数组中最后一个元素的取值,从所述第一字符序列中获取对应位置值上的字符,并将所获取的字符作为第一最长公共子序列的第一个元素;
S44,将中间变量k的取值减1之后所获得的取值作为中间变量k的当前取值;
S45,判断中间变量k的当前取值是否大于或者等于零,若是,则执行步骤S46至S47之后,返回步骤S44,若否,则执行步骤S48;
S46,根据中间变量k的当前取值确定所述目标二维元素的行数,并从所述目标二维数组中对应行中查找小于位置阈值的元素,并根据小于位置阈值的元素中的最大值更新位置阈值;
S47,根据更新后的位置阈值,从所述第一字符序列中获取对应位置值上的字符,并将所获取的字符添加至第一最长公共子序列中;
S48,将当前获得的第一最长公共子序列进行反序处理,并将反序处理的结果作为所述最长公共子序列。
10.如权利要求9所述的装置,其特征在于,所述确定模块,具体用于:以位置阈值为值,二分查找所述目标二维数组中对应行中小于位置阈值的元素的最大值,并通过最大值更新位置阈值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611075708.9A CN106777920A (zh) | 2016-11-28 | 2016-11-28 | 确定最长公共子序列的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611075708.9A CN106777920A (zh) | 2016-11-28 | 2016-11-28 | 确定最长公共子序列的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106777920A true CN106777920A (zh) | 2017-05-31 |
Family
ID=58898486
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611075708.9A Pending CN106777920A (zh) | 2016-11-28 | 2016-11-28 | 确定最长公共子序列的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106777920A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109697224A (zh) * | 2017-10-24 | 2019-04-30 | 腾讯科技(深圳)有限公司 | 一种账单消息处理方法、装置和存储介质 |
CN110162487A (zh) * | 2019-04-15 | 2019-08-23 | 深圳壹账通智能科技有限公司 | 一种快速统计重复次数方法、装置及存储介质 |
CN111753888A (zh) * | 2020-06-10 | 2020-10-09 | 重庆市规划和自然资源信息中心 | 智能环境下多粒度时空事件相似度匹配工作方法 |
CN113239037A (zh) * | 2021-05-06 | 2021-08-10 | 西安电子科技大学 | 一种基于分支定界的大规模最长公共子序列问题求解方法 |
CN113297295A (zh) * | 2021-05-27 | 2021-08-24 | 湖南大学 | 一种rpa系统中基于符号抽象的流程挖掘方法和系统 |
-
2016
- 2016-11-28 CN CN201611075708.9A patent/CN106777920A/zh active Pending
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109697224A (zh) * | 2017-10-24 | 2019-04-30 | 腾讯科技(深圳)有限公司 | 一种账单消息处理方法、装置和存储介质 |
CN109697224B (zh) * | 2017-10-24 | 2023-04-07 | 腾讯科技(深圳)有限公司 | 一种账单消息处理方法、装置和存储介质 |
CN110162487A (zh) * | 2019-04-15 | 2019-08-23 | 深圳壹账通智能科技有限公司 | 一种快速统计重复次数方法、装置及存储介质 |
CN111753888A (zh) * | 2020-06-10 | 2020-10-09 | 重庆市规划和自然资源信息中心 | 智能环境下多粒度时空事件相似度匹配工作方法 |
CN111753888B (zh) * | 2020-06-10 | 2021-06-15 | 重庆市规划和自然资源信息中心 | 智能环境下多粒度时空事件相似度匹配工作方法 |
CN113239037A (zh) * | 2021-05-06 | 2021-08-10 | 西安电子科技大学 | 一种基于分支定界的大规模最长公共子序列问题求解方法 |
CN113297295A (zh) * | 2021-05-27 | 2021-08-24 | 湖南大学 | 一种rpa系统中基于符号抽象的流程挖掘方法和系统 |
CN113297295B (zh) * | 2021-05-27 | 2023-05-23 | 湖南大学 | 一种rpa系统中基于符号抽象的流程挖掘方法和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106777920A (zh) | 确定最长公共子序列的方法和装置 | |
CN107609098B (zh) | 搜索方法及装置 | |
He et al. | Hashing as tie-aware learning to rank | |
JP2022524662A (ja) | 蒸留を用いたそれぞれのターゲット・クラスを有するモデルの統合 | |
CN105589838B (zh) | 一种基于文件比较的电子公文痕迹保留方法 | |
JP2022514842A (ja) | エンティティ意味関係分類 | |
Nunthanid et al. | Discovery of variable length time series motif | |
CN106980656B (zh) | 一种基于二值码字典树的搜索方法 | |
CN112368697A (zh) | 经由对偶分解评估损失函数或损失函数的梯度的系统和方法 | |
CN112633309A (zh) | 基于贝叶斯优化的查询高效的黑盒对抗攻击 | |
CN104112005B (zh) | 分布式海量指纹识别方法 | |
Rodpongpun et al. | Selective subsequence time series clustering | |
EP3314465A1 (en) | Match fix-up to remove matching documents | |
CN114943017B (zh) | 一种基于相似性零样本哈希的跨模态检索方法 | |
CN100377089C (zh) | 二进制翻译中经由跳转表的多目标分支语句的识别方法 | |
WO2016209952A1 (en) | Reducing matching documents for a search query | |
CN107807989A (zh) | 小文件处理方法及装置 | |
CN105630763A (zh) | 用于提及检测中的消歧的方法和系统 | |
CN103577598B (zh) | 模式串与文本串的匹配方法和装置 | |
CN109376362A (zh) | 一种纠错文本的确定方法以及相关设备 | |
Kotsiantis et al. | Local boosting of decision stumps for regression and classification problems. | |
US11755671B2 (en) | Projecting queries into a content item embedding space | |
KR20190040863A (ko) | 네트워크에서의 랭킹 및 연결 예측을 위한 지도식 확장 랜덤 워크를 제공하는 방법 및 장치 | |
Wang et al. | Dual contrastive learning framework for incremental text classification | |
US8543574B2 (en) | Partial-matching for web searches |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20170531 |