精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

求所有最大公共子序列的算法實現

開發 架構 算法
最近看了很多關于LCS(Longest common subsequence problem,最長公共子序列)的文章,大部分問題都只是求出最大公共子序列的長度,或者打印處其中的任意一個最大子序列即可,但是如何快速的打印出所有的最大長度子序列?這個問題好像看到的不多。本文給出了傳統的DP(dynamic programming,動態規劃)算法進行求解的過程,并用c語言實現。另外參考一篇論文實現了其中的一種打印所有最大公共子序列的算法,這個算法比起傳統的算法而言,時間復雜度大大降低.

 一:LCS解析

首先看下什么是子序列?定義就不寫了,直接舉例一目了然。如對于字符串:“student”,那么su,sud,sudt等都是它的子序列。它可以是連續的也可以不連續出現,如果是連續的出現,比如stud,一般稱為子序列串,這里我們只討論子序列。

什么是公共子序列?很簡單,有兩個字符串,如果包含共同的子序列,那么這個子序列就被稱為公共子序列了。如“student”和“shade”的公共子序列就有“s”或者“sd”或者“sde”等。而其中最長的子序列就是所謂的最長公共子序列(LCS)。當然,最長公共子序列也許不止一個,比如:“ABCBDAB”和“BDCABA”,它們的LCS為“BCBA”,“BCAB”,“BDAB”。知道了這些概念以后就是如何求LCS的問題了。

通常的算法就是動態規劃(DP)。假設現在有兩個字符串序列:X={x1,x2,...xi...xm},Y={y1,y2,...yj...yn}。如果我們知道了X={x1,x2,...xi-1}和Y={y1,y2,...yj-1}的***公共子序列L,那么接下來我們可以按遞推的方法進行求解:

1)如果xi==yj,那么{L,xi(或yj)}就是新的LCS了,其長度也是len(L)+1。這個好理解,即序列{Xi,Yj}的***解是由{Xi-1,Yj-1}求得的。

2)如果xiyj,那么可以轉換為求兩種情況下的LCS。

A: X={x1,x2,...xi}與Y={y1,y2,...yj-1}的LCS,假設為L1

B: X={x1,x2,...xi-1}與Y={y1,y2,...yj}的LCS,假設為L2

那么xiyj時的LCS=max{L1,L2},即取***值。同樣,實際上序列{Xi,Yj-1}和{Xi-1,Yj}都可以由{Xi-1,Yj-1}的***解求得。

怎么樣,是不是覺得這種方法很熟悉?當前問題的***解總是包含了一個同樣具有***解的子問題,這就是典型的DP求解方法。好了,直接給出上面文字描述解法中求LCS長度的公式:

這里用一個二維數組存儲LCS的長度信息,i,j分別表示兩個字符串序列的下標值。這是求***公共子序列長度的方法,如果要打印出***公共子序列怎么辦?我們還需要另外一個二維數組來保存求解過程中的路徑信息,方便***進行路徑回溯,找到LCS。如果看著很含糊,我下面給出其實現過程。

 

二:DP實現

很多博文上面都有,基本上是用兩個二維數組c[m][n]和b[m][n],一個用來存儲子字符串的LCS長度,一個用來存儲路徑方向,然后回溯。

其中二維數組b[i][j]的取值為1或2或3,其中取值為1時說明此時xi=yj,c[i][j]=c[i-1][j-1]+1。如果將二維數組看成一個矩陣,那么此時代表了一個從左上角到右下角的路徑。如果取值為2,說明xi≠yj,且c[i][j]=c[i-1][j],代表了一個從上到下的路徑,同理取值為3代表一個從左到右的路徑。

***我們可以根據c[m][n]的值知道***公共子序列的長度。然后根據b[i][j]回溯,可以打印一條LCS。其中b[i][j]=1的坐標點對應的字符同時在兩個序列中出現,所以依次回溯這個二維數組就可以找到LCS了。這里給出實現代碼:

 

[[98078]]View Code

 

我們給出一個測試:

1     char str1[MAX_LEN] = "BADCDCBA"; 2     char str2[MAX_LEN] = "ABCDCDAB"; 3 
4     GetLCSLen(str1, str2, C, B, str1len+1, str2len+1); 5     TraceBack(str1, B, str1len+1, str2len+1);

詳細的代碼見文章結束處給出的鏈接。本測試output:BDCDB

問題:上面的方法中,我們沒有單獨考慮c[i-1][j]==c[i][j-1]的情況,所以在回溯的時候打印的字符只是其中一條***公共子序列,如果存在多條公共子序列的情況下。怎么解決?我們對b[i][j]二維數組的取值添加一種可能,等于4,這代表了我們說的這種多支情況,那么回溯的時候我們可以根據這個信息打印更多可能的選擇。這個過程就不寫代碼了,其實很簡單,以下面的路徑回溯圖舉例,你從(8,8)點開始按b[i][j]的值指示的方向回溯,把所有的路徑遍歷一遍,如果是能達到起點(0,0)的路徑,就是LCS了,有多少條打印多少條。可是,

又出現問題了:你發現沒有,在回溯路徑的時候,如果采用一般的全搜索,會進行了很多無用功。即重復了很多,且會遍歷了一些無效路徑,因為這些路徑最終不會到達終點(0,0),比如節點(6,3),(7,2),(8,1)。因此加大算法復雜度和時間消耗。那么如何解決?看下面的這個方法,正式進入本文正題。

 路徑回溯圖:

 加入狀態4后的狀態圖:

三:算法改進

 

上面提到路徑回溯過程中,一般的方法就是遍歷所有可能的路徑,但是一些不可能構成***公共子序列的跳躍點我們也會去計算。這里先解釋下什么叫跳躍點,就是導致公共子序列長度發生變化的節點,即b[i][j]=1對應的節點(i,j)。Ok,接下來的問題是,如何不去考慮這些無效跳躍點,降低算法復雜度?參考論文里提出了這樣一種方法:矩形搜索。

 

首先構造兩個棧數據結構store和print。故名思議,一個用來儲存節點,一個用來打印節點。棧的定義為:

 1 #define MAX_STACK_SIZE 1024
 2 typedef struct _Element  3 {  4     int nlcslen;  5     int nrow;  6     int ncolumn;  7 }Element;  8 typedef struct _Stack  9 { 10     int top; 11     Element data[MAX_STACK_SIZE]; 12 }Stack;

棧使用數組實現,并有一個指向頂點的下標值top。為了初始化需要,先構造了一個虛擬節點virtualnode,指向節點(m,n)的右下角,即(m+1,n+1),這個節點的LCS的長度假設為***公共子序列長度+1。將虛擬節點壓入棧store,然后然后執行下面的算法:

1)棧store為空嗎?是的話退出。

2)否則從store棧頂彈出節點。

3)如果這個節點為邊界元素(行或列的小標為1),則將此節點壓入棧print,打印棧print里面的所有節點(除virtualnode外)。查看此時store棧頂節點的LCS長度,并以這個長度為參考,彈出print棧里面所有LCS長度小于等于這個參考值的節點,跳轉到第1步。

4)如果不是邊界元素,那么以該節點的左上節點(i-1,j-1)為出發點,沿著該出發點指示的方向,找到***個跳躍點e1(即b[i][j]==1的點)。途中碰到分支節點(b[i][j]==4的點)時,沿著其上節點繼續探索。

5)找到***個跳躍點以后,重新回到第4步的出發點,沿著該節點指示的方向,找到第二個跳躍點e2。途中碰到分支節點(b[i][j]==4的點)時,沿著其左節點繼續探索

6)如果e1和e2節點為同一節點,將該節點壓入store棧,回到步驟1)。

7)如果不為同一節點,在e1和e2構成的矩形范圍內,搜索出所有的跳躍點,并全部壓入store棧,回到步驟1)。

 

不明白?不要緊,我們結合上面的矩陣圖一步步按照算法來,看看到底是如何計算的:

***步:壓入虛擬節點6(9,9)到棧store,這里6表示這個節點的LCS長度,(9,9)表示坐標值。 

第二步:store棧不為空,則彈出store棧頂,壓入print棧,這時候的兩個棧的狀態如下面的左圖。沿出發點(8,8)出發,這是個分支節點,因為b[8][8]==4,所以選擇向上走,搜索到e1跳躍點(7,8),搜索路徑為:(8,8)->(7,8)。然后回到(8,8)找e2點,這時選擇向左走,找到e2跳躍點(8,7)。這兩個跳躍點不同,所以以e1,e2為對角線方向圍成的矩形內搜索所有跳躍點,這里只有e1,和e2本身兩個節點,然后將它們壓入棧store。此時兩個棧的狀態見下面的有圖。藍色底的節點表示有store棧彈出然后壓到print棧,綠色底表示新壓入到store棧的跳躍點,下面所有的圖都這樣表示。

   

第三步:彈出5(7,8)到print棧,搜索到新的兩跳躍節點。

   

第四步:

    

第五步:

 

第六步:

 

第七步:關鍵步驟來了,因為此時從store棧彈出的節點是邊界元素1(1,2),所以我們打印print棧的所有元素(紅色字體節點),而這些元素恰好構成了一個最長公共子序列(自己揣摩一下)。打印完了以后,我們要對print棧進行清理,去除不需要的節點,按照步驟2,此時store棧頂節點的LCS為1,所以print棧中彈出的節點只有1(1,2)。彈完以后,print棧的狀態如圖所示。虛線框節點表示已彈出,下同。

  

第八步:繼續彈出store棧頂,發現又是邊界元素,繼續壓入print棧,打印print棧。清理print棧。

 

第九步:清理完后,繼續步驟2.

 

好了,下面的過程就是重復進行上面的這些步驟了,自己動手畫一下就一目了然了。

 

四:代碼實現

用c語言實現關鍵代碼:

[[98078]]View Code

同樣的測試,這種算法能打印出全部的最長公共子序列。

五:總結 

該算法能將傳統算法的指數級復雜度降低到max{O(mn),O(ck)},k為***公共子序列的個數。詳細證明見論文。因為用兩個棧存儲了所有有效跳躍點,使得許多重復比較被忽略。棧的有序性也能巧妙的得到任意一條***公共子序列。

本算法的全部實現代碼下載路徑:http://pan.baidu.com/share/link?shareid=125428&uk=285541510

歡迎討論。

參考論文:

《利用矩陣搜索求所有最長公共子序列的算法》,宮潔卿,安徽工程科技學院學報,vol23,No.4,Dec.,2008

責任編輯:彭凡 來源: 博客園
相關推薦

2014-03-20 16:33:34

編程最大公約數

2016-12-29 15:58:00

字符串子串算法

2016-04-25 17:58:46

數字鴻溝最大公共WI-Fi

2015-08-11 09:32:53

面試微信網易

2016-12-13 10:03:50

公共云存儲

2011-01-19 11:14:45

程序員

2009-12-04 09:42:44

Google免費公共D

2013-03-19 10:29:12

2016-09-14 10:01:41

2015-06-02 15:37:21

2022-12-11 10:37:15

動態規劃字符串超序列

2013-09-17 11:06:12

序列排序

2021-01-30 11:10:51

算法回溯組合

2023-09-12 07:24:07

Java序列化接口

2021-11-12 09:44:03

字符串算法復雜度

2020-03-26 10:06:07

公共云云計算

2023-03-10 16:32:48

公共云計算云遷移

2021-11-18 11:48:46

ObjectInputJava

2021-09-28 06:28:51

二叉樹公共祖先

2023-10-16 23:49:29

點贊
收藏

51CTO技術棧公眾號

在线亚洲一区观看| а√天堂在线官网| 日韩视频免费| 国产一区二区av| 亚洲男人天堂2021| 97蜜桃久久| 国产日韩av一区二区| 国产精品入口免费视频一| 免费成年人视频在线观看| 99精品国产高清一区二区麻豆| 红桃av永久久久| 亚洲精品久久久久久一区二区| 国产www视频| 久久久xxx| 欧美成人精品一区二区| free性中国hd国语露脸| 亚洲综合资源| 色综合夜色一区| 女女百合国产免费网站| 日本成人一区| 国产成人精品三级麻豆| 午夜精品三级视频福利| 美女网站视频色| 香蕉久久精品| 日韩精品中文字幕在线一区| 无码日韩人妻精品久久蜜桃| 欧美大片黄色| 亚洲欧洲精品天堂一级| 欧美13一14另类| 免费看黄色一级视频| 免费不卡在线视频| 欧美一区二区三区艳史| 欧美日韩在线视频免费播放| 成人精品视频| 日韩精品在线观| zjzjzjzjzj亚洲女人| 免费视频观看成人| 色94色欧美sute亚洲线路一久| 日韩精品视频在线观看视频| 免费av在线| 国产色产综合产在线视频| 国产日本一区二区三区| www.综合色| 黑人巨大精品欧美一区| 国产精品国产三级国产aⅴ9色| 日本中文字幕网| 欧美一区亚洲| 久久久精品在线观看| 日本美女bbw| 国产精品三级| 亚洲美女自拍视频| 男男做爰猛烈叫床爽爽小说 | 国产福利资源在线| 免播放器亚洲一区| 国产精品午夜一区二区欲梦| 国产专区第一页| 午夜一区在线| 欧洲精品毛片网站| 日本黄色一级视频| 米奇777在线欧美播放| 欧美一级视频一区二区| 99精品视频99| 乱人伦精品视频在线观看| 51ⅴ精品国产91久久久久久| 日韩色图在线观看| 久久一二三四| 国产精品日韩在线一区| 精品一区二区无码| 久久99久久99| 91在线观看免费| 国产成人精品一区二三区四区五区 | 国产乱码77777777| 免费观看日韩av| 91精品久久久久久久久久久久久| 国产精品无码久久久久成人app| 精品一区二区三区香蕉蜜桃| 91九色视频在线观看| 午夜精品久久久久久久第一页按摩| 国产精品99久久久久久有的能看| 成人午夜黄色影院| www五月婷婷| 99国产精品99久久久久久| 欧美xxxx黑人又粗又长密月| 国产精品久久久久久久龚玥菲| 国产精品久久久久久久久晋中 | 国产久一一精品| av网站免费大全| 国产aⅴ精品一区二区三区色成熟| 国产精品一 二 三| 国产福利在线| 亚洲精品伦理在线| 99精品在线免费视频| 校园春色亚洲色图| 在线播放91灌醉迷j高跟美女| 无码人妻少妇色欲av一区二区| 哺乳挤奶一区二区三区免费看| 日韩乱码在线视频| 五月综合色婷婷| 亚洲国产99| 国产主播欧美精品| 日批视频在线播放| 国产精品久久三| 成人午夜精品久久久久久久蜜臀| 成人日韩精品| 亚洲а∨天堂久久精品喷水| 1024在线看片| 一本久道久久综合婷婷鲸鱼| 国产精品视频区| 天堂在线视频免费观看| 中文字幕制服丝袜成人av| 欧美性潮喷xxxxx免费视频看| se01亚洲视频| 亚洲精品一区二区三区四区高清| 自拍偷拍第9页| 国产精品久久久免费| 亚洲va欧美va国产综合剧情| 免费黄网站在线观看| 一区二区三区免费在线观看| 一区二区在线播放视频| 国产成人精品亚洲线观看| 中文国产成人精品久久一| 国产乱码久久久久久| 老司机午夜精品| 免费99视频| 99爱在线观看| 日韩欧美国产综合| 日韩成人短视频| 蜜臀av一级做a爰片久久| 国产一区在线观| 少妇视频在线| 欧美日韩成人在线| 老熟妇一区二区| 亚洲综合电影一区二区三区| av资源站久久亚洲| www红色一片_亚洲成a人片在线观看_| 色狠狠一区二区| 国产网站无遮挡| 韩日欧美一区| 成人区精品一区二区| av在线播放网站| 91久久人澡人人添人人爽欧美| 黑丝av在线播放| 伊人影院久久| 国产伦精品一区二区三区免 | 国产美女免费看| 欧美国产成人在线| 成人精品小视频| 九一国产精品| 日韩av123| 免费一级在线观看| 色94色欧美sute亚洲13| 我和岳m愉情xxxⅹ视频| 国产精品一级| 欧美黑人xxxxx| 国产精品专区免费| 亚洲欧美日韩在线一区| 日批视频免费在线观看| 久久精品一区二区三区四区| 欧美一级片中文字幕| 亚洲涩涩av| 国产91在线播放精品91| 国产资源在线看| 在线观看成人小视频| 中文字幕免费在线看线人动作大片| 美女尤物久久精品| 亚洲国产精品一区二区第四页av| 成人在线视频免费看| 丝袜情趣国产精品| 国产高清免费av| 亚洲一二三四在线| 国产精品无码电影| 日韩电影免费在线观看网站| 色综合666| 四虎地址8848精品| 欧美国产一区二区三区| 五月婷婷狠狠干| 色乱码一区二区三区88| 一本色道久久88| 国产麻豆9l精品三级站| 欧美国产日韩激情| 国产一区二区观看| 91精品视频免费观看| 欧美1—12sexvideos| 日韩精品在线免费观看视频| 无码视频在线观看| 亚洲欧美视频在线观看视频| 亚洲香蕉中文网| 久久久久在线| 97超碰人人爱| 香蕉久久夜色精品国产使用方法| 国产精品草莓在线免费观看| 国产日产一区二区| 日韩精品中文字幕在线| 一级片在线观看视频| 亚洲国产另类精品专区| 久久久久久久久久久久| 国产一区二区成人久久免费影院| 日本少妇高潮喷水视频| 91视频综合| 蜜桃av噜噜一区二区三区| 日韩福利影视| 91国偷自产一区二区三区的观看方式| 最新电影电视剧在线观看免费观看 | 日韩欧美国产综合在线| 日韩理论片av| 九色91国产| 亚洲国产欧美国产第一区| 欧美性在线视频| 成人毛片av在线| 亚洲精品自在久久| 精品久久久久中文慕人妻| 91精品福利视频| 国产亚洲精久久久久久无码77777| 久久精品亚洲精品国产欧美| 亚洲无人区码一码二码三码| 蜜臀av国产精品久久久久| 日韩av三级在线| 久久久久久久久丰满| 欧美一区二区视频17c| 日韩在线精品强乱中文字幕| 国产精品免费久久久久久| 成人在线黄色电影| 久久国产精品电影| 超碰97在线免费观看| 亚洲精品国产综合久久| 国产黄色一区二区| 欧美久久久一区| 91porny九色| 狠狠色狠色综合曰曰| 波多野结衣爱爱视频| 亚洲欧洲国产日韩| 夫妇交换中文字幕| 26uuu国产在线精品一区二区| 日本不卡视频一区| 丰满岳乱妇一区二区三区| 日韩视频在线观看一区二区三区| 奇米在线7777在线精品| 92看片淫黄大片一级| 国产日韩欧美一区| 国产av人人夜夜澡人人爽麻豆| 欧美另类亚洲| 欧美做受777cos| 亚洲精品成人影院| 中文字幕欧美日韩一区二区| 欧美第一精品| 亚洲高清123| 日韩av在线播放网址| 欧美午夜精品久久久久久蜜| 亚洲电影一级片| 免费99视频| 精品国产99| 新呦u视频一区二区| 精品国产乱码久久久久久果冻传媒 | 欧美大奶子在线| 国产色在线观看| 久久国产精品电影| 欧美xxxx黑人又粗又长| 九九热精品视频国产| 欧美videosex性欧美黑吊| 欧美日韩高清在线观看| 女同视频在线观看| 国内精品久久久久| 国模精品视频| 日本精品久久久久影院| 日韩三区在线| 国产有码在线一区二区视频| 日韩三级成人| 91视频在线免费观看| 超碰在线亚洲| 老牛影视免费一区二区| 成人三级视频| 四虎影院一区二区| 韩日欧美一区| 免费裸体美女网站| 理论电影国产精品| 图片区偷拍区小说区| 97久久超碰国产精品电影| 亚洲永久精品ww.7491进入| 国产精品毛片高清在线完整版| www色aa色aawww| 精品成人av一区| 亚洲精品91天天久久人人| 欧美精品一卡二卡| 日韩在线视频免费| 中文字幕国产日韩| 神马午夜伦理不卡 | 黄色网址在线免费看| 激情欧美日韩| 99免费视频观看| 国产麻豆日韩欧美久久| 添女人荫蒂视频| 国产精品久久午夜夜伦鲁鲁| 国产精品自拍视频一区| 色婷婷av一区二区三区软件| 国产精品一区二区免费视频| 精品国产网站在线观看| 成人欧美亚洲| 九色91av视频| 黄色精品视频网站| 国内精品久久国产| 亚洲国产不卡| 久久人妻精品白浆国产| 国产精品一区一区| 微拍福利一区二区| 亚洲国产美国国产综合一区二区| 欧美另类高清videos的特点| 精品久久久久一区| 香港伦理在线| 日本高清不卡的在线| 亚洲国产中文在线二区三区免| 日本精品视频一区| 一区二区日本视频| 少妇愉情理伦片bd| 国产精品乱码人人做人人爱| 亚洲欧美在线观看视频| 69堂亚洲精品首页| 大片免费播放在线视频| 韩日欧美一区二区| 日韩高清一区| 在线成人性视频| 日韩高清电影一区| 国产亚洲色婷婷久久99精品91| 最好看的中文字幕久久| 一级一片免费看| 日韩电影大片中文字幕 | 欧美亚洲一区在线| 亚洲一区二区免费在线观看| 亚洲国产精品一区二区第一页| 欧美亚洲一区| 国产又粗又猛又色| 亚洲福利视频三区| 亚洲国产精彩视频| 久久亚洲私人国产精品va| 成人性片免费| 日韩欧美在线电影| 日韩制服丝袜av| 香蕉网在线播放| 欧美日韩国产一区二区| 农村少妇久久久久久久| 色综合久久中文字幕综合网小说| 少妇高潮一区二区三区99| 日韩资源av在线| 久久亚洲欧洲| 播金莲一级淫片aaaaaaa| 天天综合天天做天天综合| 亚洲乱码在线观看| 欧美激情乱人伦| 伊人久久大香线蕉av超碰| 成人在线观看毛片| 丰满亚洲少妇av| 99免费在线观看| 亚洲精品成人av| 夜鲁夜鲁夜鲁视频在线播放| 精品国产乱码久久久久久蜜柚| 亚洲第一精品影视| 99久久国产精| 在线观看一区二区视频| 9i精品一二三区| 国产美女91呻吟求| 91精品国产麻豆国产在线观看| 欧美国产在线一区| 一区二区三区欧美激情| 亚洲欧美激情另类| 2019中文字幕在线观看| 加勒比久久综合| 午夜剧场在线免费观看| 亚洲人成在线观看一区二区| 国产成人三级在线播放| 久久久久女教师免费一区| 欧美偷窥清纯综合图区| 成人免费xxxxx在线视频| 国产精品乱人伦中文| 国产免费一区二区三区免费视频| 欧美国产激情18| 九九视频免费观看视频精品| 9久久婷婷国产综合精品性色| 亚洲色图一区二区三区| 亚洲精品97久久中文字幕| 668精品在线视频| 奇米影视亚洲| 无码人妻一区二区三区免费n鬼沢 久久久无码人妻精品无码 | 日韩一级不卡| 少妇太紧太爽又黄又硬又爽小说| 4438亚洲最大| 岛国av在线网站| 亚洲精品在线视频观看| 国产成人啪午夜精品网站男同| 欧美一二三区视频| 最近2019年好看中文字幕视频| 日韩一级淫片| 成人在线观看黄| 一区二区三区四区在线免费观看 | 欧洲亚洲精品久久久久| 日韩欧美视频免费在线观看| 91丨九色丨蝌蚪富婆spa| 亚洲系列在线观看| 91精品国产91久久久久福利| 成人激情电影在线| 影音先锋黄色资源| 欧美精品一级二级|