一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种求解大规模多序列最长公共子序列问题的高效方法

2022-12-31 14:37:49 来源:中国专利 TAG:
1.本发明涉及信息查询和知识挖掘
技术领域
:,具体为一种求解大规模多序列最长公共子序列问题的高效方法。
背景技术
::2.目前,多序列最长公共子序列(mlcs)问题的求解方法分为两类:即:基于动态规划的mlcs求解方法和基于支配点的mlcs求解方法。3.基于动态规划的mlcs求解方法是采用动态规划思想,通过构建评分矩阵的方式来求解序列的最长公共子序列。具体而言,对于给定两个序列x=x1x2…xn,y=y1y2…ym,基于动态规划的方法将迭代地构造一个(n 1)*(m 1)的评分矩阵l,其中l[i,j]是序列x’=x1x2…xi和y’=y1y2…yj的最长公共子序列的长度。一旦l构建完成,通过回溯l[n,m]到l[0,0]的元素,便可以得到x和y的所有最长公共子序列。对于长为m和n的两个序列,基于动态规划的方法的时间和空间复杂度均为o(mn)。通过快速计算序列的编辑距离,可以将该方法的时间复杂度降低到o(n2/logn)(假设序列长度均为n)。为了对多序列(3个及以上)问题进行求解,基于动态规划的求解模型可以通过将评分矩阵l推广到d个序列,进而解决多序列问题,但其时间和空间复杂度均高达o(nd)(假设每个序列长都为n)。并且,随着序列个数的增加,计算时间和空间消耗呈指数级增长,完全无法应用于大规模序列mlcs求解的现实情况。[0004]基于支配点的mlcs求解方法的主要思想是,建立一个有向无环图(dag:directedacyclicgraph)模型,将mlcs的求解转化为求此有向无环图从起点到终点的最长路径。该模型只计算评分矩阵l中的支配点而非l中的所有元素。给定序列集之后,算法首先生成第0层支配点集d0,然后基于第k层支配点集dk,算法通过扩展dk中所有节点的后续节点得到dk 1,如此迭代,直到k=|mlcs|-1。最后,通过回溯d|mlcs|-1到d0中的元素,算法便可找出序列集的所有最长公共子序列。由于支配点的数量远小于l中元素的总数量,基于支配点的算法要优于基于动态规划的算法。wangq,korkind,shangy.在其发表的论文“afastmultiplelongestcommonsubsequence(mlcs)algorithm”(ieeetransactionsonknowledge&dataengineering,2011,23(3):321-334)中提出了一种称为quick-dppar的方法,使用“分而治之”的策略来删除被支配点(dominatedpoint)从而加速mlcs问题的求解。此外,还采用了一种被称为后继表(successortable)的数据结构用来在常量时间内产生一个节点的所有后继节点。liy,wangy,zhangz等在其发表的文章“anovelfastandmemoryefficientparallelmlcsalgorithmforlongandlarge-scalesequencesalignments”(ieee,internationalconferenceondataengineering.ieee,2016:1170-1181)中提出了一种基于支配点模型的改进方法“top-mlcs”,它使用了被称为“无冗余公共子序列图”(irredundantcommonsubsequencegraph,简称为ncsg)的新的图模型,采用对dag图进行分支构造及对序列集进行分段等策略,使得该图模型在构建过程中能够减少冗余节点的产生。同时该方法还采用了正向或反向拓扑排序、或采用层次递推排序等策略来寻找图中的最长路径。上述这些基于支配点模型的这些方法的时空复杂度均与图中所包含的节点数量密切相关,在求解mlcs时会产生数量巨大的支配点,计算量过大,冗余节点很多且不能够适时动态删除,求解的时空复杂度仍然较大,算法性能不高,仍无法有效求解大规模多序列最长公共子序列问题。[0005]yangj,xuy,shangy等在其发表的论文“aspace-boundedanytimealgorithmforthemultiplelongestcommonsubsequenceproblem”(ieeetransactionsonknowledge&dataengineering,2014,26(11):2599-2609)中提出了另外两种称为sa-mlcs和sla-mlcs的求解方法。sa-mlcs使用了一种称为“iterativebeamwidening”的搜索策略来减少迭代过程中的空间消耗。基于sa-mlcs空间受限型方法sla-mlcs,可以确保在求解过程中计算机运行时的内存开销不超过预先设定的值。该方法能够应用于大规模多序列最长公共子序列问题的求解。但它们都是近似算法,是以牺牲求解问题的精度为代价,所求最终解不能保证是全局最优解。[0006]综上所述,现有的mlcs模型和求解方法,在处理大规模多序列最长公共子序列问题时的效率低、耗费时间长。因此,需要研究针对大规模多序列最长公共子序列问题的新的模型和设计开发求解这些模型的高效方法。技术实现要素:[0007]本发明的目的在于提供一种求解大规模多序列最长公共子序列问题的高效方法,以解决上述
背景技术
:中提出的问题。[0008]技术方案[0009]本发明提供如下技术方案:一种大规模多序列最长公共子序列问题的求解方法,包括以下步骤:[0010](1)初始化:[0011](1a)根据给定的d个序列创建后继表sti(1≤i≤d)和距离表dti(1≤i≤d),设定两个特殊节点,即:起始节点o=(0,0,…,0)和终结节点∞=(∞,∞,…,∞);[0012](1b)根据启发式算法估算从起始节点o到终结节点∞最长路径的下限长度lmin;[0013](1c)令节点结合h={o},其中h是哈希表,利用该哈希表的数据结构判定一个节点是否存在于h中;[0014](1d)创建层级集合dk={o},层级集合其中k=0,令起始节点的层级值o.lev=0;[0015](2)从集合dk中取出一个节点p,根据后继表sti(1≤i≤d)计算p的后继点集合successor(p);[0016](3)从successor(p)取出一个元素q;判断q是否已经存在于h中,若是,执行步骤(4);否则,执行步骤(5);[0017](4)将h中的q取出,并判断q的lev值与k 1的大小关系:[0018](4a)若q.lev<k 1,说明从o点到q点的最长路径长度小与从o点经过p点到q的最长路径的长度,因此,以前的从o点到q点的路径将不再是最长路径,将它们删除;同时,更新q的lev值为q.lev=k 1,将节点q移动到层级集合dk 1中:dk 1=dk 1∪{q},记录p和q之间的前驱后继关系:q.precursor={p};转到步骤(8)继续执行;[0019](4b)若q.lev==k 1,这种情况说明从o点经过p点到q的路径也是一条最长路径并且其长度为k 1,因此,仅需记录p和q之间的前驱后继关系:q.precursor={p};转到步骤(8)继续执行;[0020](5)设定q的lev值:q.lev=k 1,估算节点q到终结点∞最长路径的上限长度lmax。[0021](6)如果从o点到q点路径长度q.lev与节点q到终结点∞最长路径的上限长度lmax之和小于起始节点o到终结节点∞最长路径的下限长度lmin,即q.lev lmax<lmin,则可以推断出经过q节点的所有路径均不是最长路径,q节点不会坐落在最长路径上,删除q,执行步骤(8);否则,执行步骤(7);[0022](7)将节点q添加到哈希表h中:h=h∪{q},将q添加到层级集合dk 1中:dk 1=dk 1∪{q};同时记录节点p和q之间的前驱后继关系:q.precursor={p};[0023](8)若集合successor(p)中的还有元素未被访问,执行步骤(3);否则执行步骤(9);[0024](9)若集合dk还有元素未被访问,执行步骤(2);否则,执行步骤(10);[0025](10)判断集合dk 1是否为空,若为空,说明已经没有新的节点在层级dk 1中,图的构建已经完成,执行步骤(11);否则,令变量k的值加1:k=k 1,执行步骤(2);[0026](11)从终结节点∞根据节点的前驱指针(.precursor)通过深度遍历即可获得图中的所有最长路径;[0027](12)最长路径上的每个节点都对应一个公共字符,把这些字符链接起即是这个d个序列的最长公共子序列。[0028]优选的,步骤(1)的具体实现步骤如下:[0029]步骤1.1,根据给定的d个序列s1,s2,…,sd,按照下式(1)创建后继表sti(1≤i≤d):[0030]sti[j,k]=min{m|cm=σj,m>k,1≤j≤|∑|,0≤k≤n}.ꢀꢀꢀ式(1)[0031]从上述式(1)可以看出,sti(1≤i≤d)是一个|∑|×(n 1)的矩阵,其中,σj是∑中的第jth个字符,|∑|代表字符集的个数,n是序列的长度;[0032]同时根据下式(2)构建距离表dti(1≤i≤d):[0033]dti[j,k]=|{m|cm=σj,m>k,1≤k≤n,0≤j≤|∑|}|.ꢀꢀꢀ式(2)[0034]步骤1.2,定义两个特殊节点,起始节点o=(0,0,…,0)和终结节点∞=(∞,∞,…,∞);[0035]根据启发式算法估算从起始节点o到终结节点∞最长路径的下限长度lmin,具体的执行步骤如下:[0036](i)设定lmin=0,给定一个整数θ>0,令集合currentset={o},[0037](ii)计算集合currentset中每个节点后继点,并选择θ个坐标值之和最小的节点放入nextset中;[0038](iii)若nextset不空,令lmin=lmin 1,currentset=nextset,转到(ii)继续执行;否则,返回lmin的值,并结束启发式算法。[0039]步骤1.3,令节点结合h={o},其中h是哈希表,利用该哈希表的数据结构判定一个节点是否存在于h中;[0040]步骤1.4,创建层级集合dk={o},层级集台其中k=0,令起始节点的层级值0.lev=0。[0041]优选的,步骤(2)中的计算后继集合的方法为:[0042]计算p的后继点集合successor(p),假设节点p为p=(p1,p2,…,pd),按照下式(3)计算:[0043]successor(p)={(st1[1,p1],st2[1,p2],…,std[1,pd]),(st1[2,p1],st2[2,p2],…,std[2,pd]),…,(st1[1,p1],st2[1,p2],…,std[1,pd])}[0044][0045]4、如权利要求1的方法,其特征在于,的步骤(6)中求解节点q到终结点∞最长路径的上限长度lmax(q)的方法是:[0046]假设节点q=(q1,q2,…,qd),按照下式(4)计算lmax(q):[0047][0048]有益效果[0049]与现有技术相比,本发明提供了一种求解大规模多序列最长公共子序列问题的高效方法,具备以下有益效果:[0050]1、该求解大规模多序列最长公共子序列问题的高效方法,通过深入分析大规模多序列最长公共子序列问题的本质属性,找到了一种能够有效控制有向无环图规模的技术,利用该技术可以使构建的有向无环图的规模很小,从而降低解决此问题的时空间开销。[0051]2、该求解大规模多序列最长公共子序列问题的高效方法,通过在构建有向无环图的过程中,根据设计的公式q.lev lmax<lmin可以判断节点q是否坐落于最长路径上,并及时地将那些未坐落在最长路径上的节点辨别出来,从而可以将它们和经过它们的非最长路径全部删除,这样构建的有向无环图更为简洁、规模小、构建过程简单。附图说明[0052]附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。[0053]图1为本发明的大规模多序列最长公共子序列问题的求解方法流程图。具体实施方式[0054]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。[0055]实施例:[0056]请参阅图1,本发明提供一种技术方案:[0057]步骤1,初始化:[0058]步骤1.1,根据给定的d个序列s1,s2,…,sd,按照下式(1)创建后继表sti(1≤i≤d):[0059]sti[j,k]=min{m|cm=σj,m>k,1≤j≤|∑|,0≤k≤n}.ꢀꢀꢀ式(1)[0060]从上述公式可以看出,sti(1≤i≤d)是一个|∑|×(n 1)的矩阵,其中,σj是∑中的第jth个字符,|∑|代表字符集的个数,n是序列的长度。[0061]同时根据下式(2)构建距离表dti(1≤i≤d):[0062]dti[j,k]=|{m|cm=σj,m>k,1≤k≤n,0≤j≤|∑|}|.ꢀꢀꢀ式(2)[0063]步骤1.2,定义两个特殊节点,起始节点o=(0,0,…,0)和终结节点∞=(∞,∞,…,∞);[0064]根据启发式算法估算从起始节点o到终结节点∞最长路径的下限长度lmin,具体的执行步骤如下:[0065](i)设定lmin=0,给定一个整数θ>0,令集合currentset={o},[0066](ii)计算集合currentset中每个节点后继点,并选择θ个坐标值之和最小的节点放入nextset中;[0067](iii)若nextset不空,令lmin=lmin 1,currentset=nextset,,转到(ii)继续执行;否则,返回lmin的值,并结束启发式算法。[0068]步骤1.3,令节点结合h={o},其中h是哈希表,利用该哈希表的数据结构可快速判定一个节点是否存在于h中;[0069]步骤1.4,创建层级集合dk={o},层级集合其中k=0,令起始节点的层级值o.lev=0;[0070]步骤2,从集合dk中取出一个节点p,根据后继表sti(1≤i≤d)计算p的后继点集合successor(p);假设节点p为p=(p1,p2,…,pd),可按照下式(3)计算出successor(p):[0071]successor(p)={(st1[1,p1],st2[1,p2],…,std[1,pd]),(st1[2,p1],st2[2,p2],…,std[2,pd]),…,(st1[1,p1],st2[1,p2],…,std[1,pd])}[0072][0073]步骤3,从successor(p)取出一个元素q;判断q是否已经存在于h中,若是,执行步骤4;否则,执行步骤5;[0074]步骤4,将h中的q取出,并判断q的lev值与k 1的大小关系:[0075]步骤4.1,若q.lev<k 1,说明从o点到q点的最长路径长度小与从o点经过p点到q的最长路径的长度,因此,以前的从o点到q点的路径将不再是最长路径了,将它们删除。同时,更新q的lev值为q.lev=k 1,将节点q移动到层级集合dk 1中:dk 1=dk 1∪{q},记录p和q之间的前驱后继关系:q.precursor={p};转到步骤8继续执行;[0076]步骤4.2,若q.lev==k 1,这种情况说明从0点经过p点到q的路径也是一条最长路径并且其长度为k 1,因此,仅需记录p和q之间的前驱后继关系:q.precursor={p};转到步骤8继续执行;[0077]步骤5,设定q的lev值:q.lev=k 1,估算节点q到终结点∞最长路径的上限长度lmax(q)。[0078]步骤6,如果从o点到q点路径长度q.lev与节点q到终结点∞最长路径的上限长度lmax(q)之和小于起始节点o到终结节点∞最长路径的下限长度lmin,即q.lev lmax(q)<lmin,则可以推断出经过q节点的所有路径均不是最长路径,q节点不会坐落在最长路径上,删除q,执行步骤8;否则,执行步骤7;[0079]在该步骤中需要求解节点q到终结点∞最长路径的上限长度lmax(q),假设节点q=(q1,q2,…,qd),可以按照下式(4)计算得出lmax(q):[0080][0081]步骤7,将节点q添加到哈希表h中:h=h∪{q},将q添加到层级集合dk 1中:dk 1=dk 1∪{q};同时记录节点p和q之间的前驱后继关系:q.precursor={p};[0082]步骤8,若集合successor(p)中的还有元素未被访问,执行步骤3;否则执行步骤9;[0083]步骤9,若集合dk还有元素未被访问,执行步骤2;否则,执行步骤10;[0084]步骤10,判断集合dk 1是否为空,若为空,说明已经没有新的节点在层级dk 1中,图的构建已经完成,执行步骤11;否则,令变量k的值加1:k=k 1,执行步骤2;[0085]步骤11,从终结节点∞根据节点的前驱指针(.precursor)通过深度遍历即可获得图中的所有最长路径;[0086]步骤12,最长路径上的每个节点都对应一个匹配零字符,把这些字符链接起即是这个d个序列的最长公共子序列。当前第1页12当前第1页12
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献