发明名称 一种基于最长匹配子序列算法的哼唱计算机音乐检索方法
摘要 本发明公开了一种基于最长匹配子序列算法的哼唱计算机音乐检索方法,主要包括以下步骤:(1)基音频率提取;(2)音乐特征数据库的构建;(3)特征表达实现;(4)检索匹配;本发明的优点是提升了相似度计算的总体速度,提高了搜索引擎的搜索效率,为卡拉OK和基于内容搜索网络引擎及多功能智能移动终端平台构建了精确的音乐检索平台;可广泛地应用在网络搜索引擎的相关插件等领域,本发明所提供的音乐特征的提取、音乐特征的表达以及相似度的精确计算方法可提供哼唱检索系统的准确计算,使音乐的检索准确、轻松、愉快,具有较强的实用价值和现实意义。
申请公布号 CN102521281B 申请公布日期 2013.10.23
申请号 CN201110382159.0 申请日期 2011.11.25
申请人 北京师范大学 发明人 王醒策;陈卓然;周明全;武仲科
分类号 G06F17/30(2006.01)I;G10L15/08(2006.01)I;G10L15/02(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 北京中海智圣知识产权代理有限公司 11282 代理人 曾永珠
主权项 一种基于最长匹配子序列算法的哼唱计算机音乐检索方法,其特征在于,包括以下步骤:(1)基音频率序列提取及处理;1)对输入的WAV波形文件应用RAPT算法进行基音频率提取,从而得到基音频率序列;2)将原始的基音频率序列经过高通滤波器和低通滤波器处理,去除毛刺和噪声点,平滑基频曲线,人类的音域宽度范围一般在E2(82Hz)~C6(1047Hz)之间,根据人类自然发声范围,将高通滤波的阈值设置为80Hz,低通滤波的阈值设置为1100Hz,用以除去处在高低阈值之外的基频值;3)用线性平滑处理对基音频率序列进行线性滤波处理,去除基音频率序列中的噪声点并且对基音频率序列的曲线轮廓进一步平滑;4)将所得到的基音频率序列,通过中值滤波去除噪声点,有效地去除了基音频率序列中的噪声点,且完好地保留基音频率序列中连续曲线之间的阶跃变化;(2)音乐特征表达;1)基音频率曲线的特征表达;以半音作为单位,以相邻两个音之间的音程所构成的序列作为旋律特征,包含n个自然音符的旋律片断,被表达为n‑1个实数构成的音程序列,以量化的方式表达旋律特征,不同旋律的音乐特征具有区分度,为后续的相似度计算提供有效的结果;对整体音高整体偏移不敏感,允许用户在任意调式中哼唱,相同的旋律特征仍能被提取;具有良好的稳定性,对用户通过哼唱输入的音频信息,音程计算定义如公式(1)所示: <mrow> <mi>Pitch</mi> <mo> </mo> <msub> <mi>Interval</mi> <mi>n</mi> </msub> <mo>=</mo> <mn>12</mn> <mo>*</mo> <msub> <mi>log</mi> <mn>2</mn> </msub> <mrow> <mo>(</mo> <mfrac> <msub> <mi>freq</mi> <mrow> <mi>n</mi> <mo>+</mo> <mn>1</mn> </mrow> </msub> <msub> <mi>freq</mi> <mi>n</mi> </msub> </mfrac> <mo>)</mo> </mrow> <mo>-</mo> <mo>-</mo> <mo>-</mo> <mrow> <mo>(</mo> <mn>1</mn> <mo>)</mo> </mrow> </mrow>根据以上定义,将音高频率序列Fx=(freq1,freq2,freq3,…,freqn)映射到音程序列Pi=(pitch_interval1,pitch_interval2,pitch_interval3,…,pitch_intervaln‑1);对于音乐特征数据库中存储的MIDI文件,需要采用同样的旋律特征表达方式,使得从用户输入端和从数据库端提取的旋律特征具有相同的格式,对MIDI文件,音程计算定义如公式(2)所示,其中MIDI_noten+1和MIDI_noten代表MIDI文件中的音高值:Pitch Intervaln=MIDI_noten+1‑MIDI_noten        (2)经过以上转化,将不同调式下的同一旋律特征进行归一化,同时消除了不同哼唱调式对旋律特征提取的影响,不同调式中同一旋律的特征被成功的以归一化的方式提取出来,基于 相同的特征表达方式设计一个相似度评价机制,来完成检索信息与数据库中的特征信息的匹配,对经过处理的基音频率序列进行旋律建模,得到一组由离散点构成的旋律骨架;旋律骨架经过对数转化,输入的相邻音之间音程被提取出来,并以此作为输入音频的特征序列,最终提取出的旋律特征,被送入匹配模块与音乐特征数据库中的信息进行相似度计算,得到匹配结果;2)旋律的特征表达;通过基音频率提取、滤波的得到基音频率轮廓曲线,被拆分成为两种相互独立旋律成份的组合:宏观旋律成份和微观旋律成份;其定义分别如下:宏观旋律成份:反应语音信息中的声调模式,与基音频率的全局音高变化密切相关;微观旋律成份:反应语音信息中的音素成份,影响基音频率曲线的局部变化;同理,哼唱信息作为语音信息的一种,亦视为两种旋律成份的组合,对于人声哼唱的音乐旋律,音高变化只和其基频曲线的宏观旋律成份相关,而哼唱的音标、歌词等音素信息,则由其基音频率曲线微观旋律成份决定,利用二次样条函数,通过插值近似得到基音频率曲线的宏观旋律,所得到的宏观旋律以离散目标点序列的形式呈现,并代表了该基音频率序列对应的音高旋律特征,哼唱旋律特征基于音高序列而与音标、音素信息无关,所以,利用MOMEL算法对经过滤波的基音频率轮廓曲线进行处理,获取基音频率轮廓曲线中的宏观旋律序列,并作为后续旋律特征表达的基础;MOMEL算法输出的直接结果对于后续的旋律特征表达仍存在明显不足,因此再设置一个参数化的阈值,用以控制相邻音之间的音程,当两个音之间的音程低于此阈值的时候,这个音程会基于具体情况被删除或者与其他相邻音程进行合并;(3)相似度计算‑检索匹配算法(a)最长匹配子序列算法(Longest Matched Subsequence,LMS);基于特征提取方法所获得的旋律特征是一组实数序列,而音乐特征数据库中存储的旋律特征均为整数序列,此时,如果机械的利用最长公共子序列算法计算两个序列的相似度,那么很多原本可以匹配的元素就被遗漏;最长匹配子序列算法能够解决最长公共子序列算法(LCS)在应用中存在问题,最长匹配子序列算法作为对最长公共子序列算法的一种改进,其输出结果是独立的两个子序列A’、B’,分别是输入序列A、B的子序列;按照如下方式定义最长匹配子序列:给定输入序列A=(a1,a2,a3,…,an)和B=(b1,b2,b3,…,bm),即产生子序列A’=(a’1,a’2,a’3,…,a’l)和B’=(b’1,b’2,b’3,…,b’l);子序列A’、B’满足如下条件:其一,子序列A’、B’中的每个元素都在另一子序列中有与之匹配的元素,且符合如下条件:在子序列A’、B’中:A’的元素a’k对应A的元素ai;B’的元素b’k对应B的元素bj;满足:LD(ai,bj)≤δ,其中δ为给定局部相似度最大值;其二,子序列A’和B’分别在各自的原始序列中相对连续,即符合如下条件:在子序列A’、B’中:A’的元素a’k对应A的元素ai,A’的元素a’k+1对应A的元素as;B’的元素b’l对应B的元素bj,B’的的元素b’l+1对应B的元素at;满足:s–i≤L且t–j≤L,其中L为子序列中允许插入元素的最大值;其三,子序列A’和B’具有相同的长度,并且A’、B’分别是A、B所有满足条件1)和2)的子序列中最长的,即|A’|=|B’|=max{|Ak|,|Bl|};在最长匹配子序列算法中,元素相等的概念被匹配的概念所替换,与最长公共子序列算法不同,A’与B’并非机械地完全相等,而是A、B所有子序列中最长且拥有相似度最高的一组;(b)局部相似度计算;作为最长匹配子序列算法的基础,下面是局部相似度的计算方式;首先,定义实数序列的编辑距离算法:对给定输入的实数序列:X=(x1,x2,x3,…,xm)、Y=(y1,y2,y3,…,yn);按照公式(3)定义实数序列中元素之间相互转化的权值,其中δ为判定相等的阈值: <mrow> <mi>w</mi> <mrow> <mo>(</mo> <mi>a</mi> <mo>,</mo> <mi>b</mi> <mo>)</mo> </mrow> <mo>=</mo> <mfenced open='{' close=''> <mtable> <mtr> <mtd> <mn>0</mn> <mo>,</mo> <mi>if</mi> <mo>|</mo> <mi>a</mi> <mo>-</mo> <mi>b</mi> <mo>|</mo> <mo>&lt;</mo> <mi>&delta;</mi> </mtd> </mtr> <mtr> <mtd> <mo>|</mo> <mi>a</mi> <mo>-</mo> <mi>b</mi> <mo>|</mo> <mo>,</mo> <mi>if</mi> <mo>|</mo> <mi>a</mi> <mo>-</mo> <mi>b</mi> <mo>|</mo> <mo>&GreaterEqual;</mo> <mi>&delta;</mi> </mtd> </mtr> </mtable> </mfenced> <mo>-</mo> <mo>-</mo> <mo>-</mo> <mrow> <mo>(</mo> <mn>3</mn> <mo>)</mo> </mrow> </mrow>初始化编辑距离矩阵Dm,n,初始化条件如下所示:d0,0=0;di,0=di‑1,0+w(xi,0),其中1≤i≤m;d0,j=d0,j‑1+w(0,yj),其中1≤j≤n;对1≤i≤m且1≤j≤n的矩阵单元,计算编辑距离矩阵Dm,n,递归方程如公式(4)所示,其中Wdel、Wsub和Wins分别为删除、替换、插入三种操作的权值: <mrow> <msub> <mi>d</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>=</mo> <mi>min</mi> <mfenced open='{' close=''> <mtable> <mtr> <mtd> <msub> <mi>d</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>+</mo> <msub> <mi>W</mi> <mi>del</mi> </msub> <mo>*</mo> <mi>w</mi> <mrow> <mo>(</mo> <msub> <mi>x</mi> <mi>i</mi> </msub> <mo>,</mo> <mn>0</mn> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <msub> <mi>d</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>+</mo> <msub> <mi>W</mi> <mi>sub</mi> </msub> <mo>*</mo> <mi>w</mi> <mrow> <mo>(</mo> <msub> <mi>x</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>y</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <msub> <mi>d</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>+</mo> <msub> <mi>W</mi> <mi>ins</mi> </msub> <mo>*</mo> <mi>w</mi> <mrow> <mo>(</mo> <mn>0</mn> <mo>,</mo> <msub> <mi>y</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> </mtd> </mtr> </mtable> </mfenced> <mo>-</mo> <mo>-</mo> <mo>-</mo> <mrow> <mo>(</mo> <mn>4</mn> <mo>)</mo> </mrow> </mrow>最终,输入的实数序列X和Y之间的编辑距离ED(X,Y)从矩阵Dm,n的右下角dm,n得到,如公式(5)所示:ED(X,Y)=dm,n,        (5)然后,给出元素的局部相似度的具体定义:对给定输入的旋律特征序列:A=(a1,a2,a3,…,an),B=(b1,b2,b3,…,bm);从A、B中各取一个元素构成二元组(ai,bj),对于每一对二元组,其局部相似度定义如下,其中k为局部半径:定义局部子序列X=(ai‑k,…,ai,…,ai+k)和Y=(bj‑k,…,bj,…,bj+k);则二元组(ai,bj)附近的局部相似度LD(ai,bj)由局部子序列X和Y之间的编辑距离ED(X,Y)得到,如公式(6)所示:LD(ai,bj)=ED(X,Y);          (6)(c)动态规划计算最长匹配子序列;明确了原始序列A、B中元素ai、bj附近局部相似度的计算规则,利用动态规划(Dynamic Programming)的策略计算出符合定义的最长匹配子序列A’、B’;首先,利用动态规划结算最长公共子序列算法(LCS)的计算流程:给定输入的旋律特征序列A=(a1,a2,a3,…,am)和B=(b1,b2,b3,…,bn);构造LCS矩阵Cm,n,按照如下条件初始化该矩阵:ci,0=0,c0,j=0,其中0≤i≤m且0≤j≤n;利用公式(7)中的递归方程计算矩阵,其中1≤i≤m且1≤j≤n: <mrow> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>=</mo> <mfenced open='{' close=''> <mtable> <mtr> <mtd> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>+</mo> <mn>1</mn> <mo>,</mo> <msub> <mi>ifa</mi> <mi>i</mi> </msub> </mtd> </mtr> <mtr> <mtd> <mi>max</mi> <mrow> <mo>(</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>)</mo> </mrow> <mo>,</mo> <mi>else</mi> </mtd> </mtr> </mtable> </mfenced> <mo>-</mo> <mo>-</mo> <mo>-</mo> <mrow> <mo>(</mo> <mn>7</mn> <mo>)</mo> </mrow> </mrow>最终,最长公共子序列由Cm,n的右下角cm,n得出;最长匹配子序列算法(LMS)按如下方式计算:给定输入序列A=(a1,a2,a3,…,am)和B=(b1,b2,b3,…,bn);定义矩阵Cm,n、Rm,n和Sm,n,用以计算最长匹配子序列,详细定义分别如下:整形矩阵Cm,n,其单元ci,j储存子序列(a1,a2,a3,…,ai)和(b1,b2,b3,…,bj)之间的最长匹配子序列长度;整数矩阵Rm,n,其单元ri,j储存这两个子序列中不连续元素的个数;字符矩阵Sm,n,其单元si,j储存矩阵Cm,n、Rm,n的内部演算路径,对每一次计算记 录正常最长匹配子序列增长的方向;按照以下条件初始化这三个矩阵:ci,0=0,c0,j=0,r0,j=0,ri,0=0,s0,j=‘_’,si,0=‘_’,其中0≤i≤m且0≤j≤n;利用公式(8)中的递归方程计算矩阵Cm,n、Rm,n和Sm,n,其中1≤i≤m且1≤j≤n: <mrow> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>=</mo> <mfenced open='{' close=''> <mtable> <mtr> <mtd> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>+</mo> <mn>1</mn> <mo>,</mo> <mi>ifLD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>&le;</mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>&le;</mo> <mi>L</mi> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> <mo>,</mo> <mi>if LC</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>&le;</mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>></mo> <mi>L</mi> </mtd> </mtr> <mtr> <mtd> <mi>max</mi> <mrow> <mo>(</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>)</mo> </mrow> <mo>,</mo> <mi>if LC</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>L</mi> </mtd> </mtr> <mtr> <mtd> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>+</mo> <mn>1</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>&le;</mo> <mi>L</mi> <mo>&lt;</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>+</mo> <mn>1</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>L</mi> <mo>&lt;</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>></mo> <mi>L</mi> </mtd> </mtr> </mtable> </mfenced> <mo>-</mo> <mo>-</mo> <mo>-</mo> <mrow> <mo>(</mo> <mn>8</mn> <mo>)</mo> </mrow> </mrow> <mrow> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>=</mo> <mfenced open='{' close=''> <mtable> <mtr> <mtd> <mn>0</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>&le;</mo> <mi>&delta;</mi> </mtd> </mtr> <mtr> <mtd> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>+</mo> <mn>1</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;</mi> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>Land</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>></mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>+</mo> <mn>1</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;</mi> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>Land</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>&lt;</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <mi>min</mi> <mrow> <mo>(</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>)</mo> </mrow> <mo>+</mo> <mn>1</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;</mi> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>Lang</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>=</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>+</mo> <mn>1</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>&le;</mo> <mi>L</mi> <mo>&lt;</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>+</mo> <mn>1</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>L</mi> <mo>&lt;</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>></mo> <mi>L</mi> </mtd> </mtr> </mtable> </mfenced> <mo>-</mo> <mo>-</mo> <mo>-</mo> <mrow> <mo>(</mo> <mn>9</mn> <mo>)</mo> </mrow> </mrow> <mrow> <msub> <mi>s</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>=</mo> <mfenced open='{' close=''> <mtable> <mtr> <mtd> <mmultiscripts> <mi>S</mi> <none/> <mo>&prime;</mo> <mprescripts/> <none/> <mo>&prime;</mo> </mmultiscripts> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>&le;</mo> <mi>&delta;and</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>=</mo> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mmultiscripts> <mi>O</mi> <none/> <mo>&prime;</mo> <mprescripts/> <none/> <mo>&prime;</mo> </mmultiscripts> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>&le;</mo> <mi>&delta;and</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&NotEqual;</mo> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mmultiscripts> <mi>R</mi> <none/> <mo>&prime;</mo> <mprescripts/> <none/> <mo>&prime;</mo> </mmultiscripts> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;</mi> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>Land</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>></mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <mmultiscripts> <mi>D</mi> <none/> <mo>&prime;</mo> <mprescripts/> <none/> <mo>&prime;</mo> </mmultiscripts> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;</mi> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>Land</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>&lt;</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <mmultiscripts> <mi>R</mi> <none/> <mo>&prime;</mo> <mprescripts/> <none/> <mo>&prime;</mo> </mmultiscripts> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;</mi> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>&le;</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>Land</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>=</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <mmultiscripts> <mi>D</mi> <none/> <mo>&prime;</mo> <mprescripts/> <none/> <mo>&prime;</mo> </mmultiscripts> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;</mi> <mo>,</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>&le;</mo> <mi>Land</mi> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>=</mo> <msub> <mi>c</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <mmultiscripts> <mi>R</mi> <none/> <mo>&prime;</mo> <mprescripts/> <none/> <mo>&prime;</mo> </mmultiscripts> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> <mo>&le;</mo> <mi>L</mi> <mo>&lt;</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> </mtd> </mtr> <mtr> <mtd> <mmultiscripts> <mi>D</mi> <none/> <mo>&prime;</mo> <mprescripts/> <none/> <mo>&prime;</mo> </mmultiscripts> <mo>,</mo> <mi>if LD</mi> <mrow> <mo>(</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mo>,</mo> <msub> <mi>b</mi> <mi>j</mi> </msub> <mo>)</mo> </mrow> <mo>></mo> <mi>&delta;and</mi> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>-</mo> <mn>1</mn> <mo>,</mo> <mi>j</mi> </mrow> </msub> <mo>&le;</mo> <mi>L</mi> <mo>&lt;</mo> <msub> <mi>r</mi> <mrow> <mi>i</mi> <mo>,</mo> <mi>j</mi> <mo>-</mo> <mn>1</mn> </mrow> </msub> </mtd> </mtr> </mtable> </mfenced> <mo>-</mo> <mo>-</mo> <mo>-</mo> <mrow> <mo>(</mo> <mn>10</mn> <mo>)</mo> </mrow> </mrow>最终,最长匹配子序列算法的输出结果通过对符号矩阵Sm,n的记录的路径和Cm,n中储存的数值计算得到,而最长匹配子序列的长度则由cm,n直接获得。
地址 100875 北京市海淀区新街口外大街19号