演算法題:最長公共子序列

五道口宅男瀟澗發表於2015-05-21

最長公共子序列(LCS)是典型的動態規劃問題,如果不理解動態規劃請移步先看這篇動態規劃的總結,否則本篇文章中的程式碼實現會不理解的喲!

LCS問題的一個變種就是求最長單調遞增子序列,它的一種簡易求解方法就是先將原序列A進行排序得到序列B,然後求解序列A和序列B的最長公共子序列。

1.問題描述

 

2.最優子結構和子問題重疊

 

3.5種實現方式

根據LCS的遞推公式

(1)從中可以看出計算c[i][j]時只需要2行即可,前一行(i-1)和當前行(i),每行的長度是min{m,n},首先初始化前一行都為0,然後計算當前行的值,當要計算下一行之前將當前行的值複製到前一行中即可。

(2)從遞推公式中還可以看出計算當前行i的話,其實只需要一行再加上O(1)的額外空間就行了。因為計算c[i][j]只需要前一行中c[i-1][k] (k>=j-1)的資料,對於k<j-1的資料都是沒有用的,而當前行c[i]l的資料都是有用的,要用來計算下一行的值,所以,可以在計算當前行的時候,將當前行的前面計算好的部分複製到前一行中對應位置上,但是c[i][j-1]除外,因為c[i-1][j-1]也是需要的,所以需要額外的O(1)的空間儲存c[i][j-1]。

LCS的五種實現:分別為0:直接遞迴;1:帶備忘錄的遞迴;2:使用二維陣列儲存結果的迭代;3:使用2個一維陣列儲存結果的迭代;4:使用1個一維陣列和額外的O(1)空間儲存結果的迭代。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

演算法題:最長公共子序列

相關文章