???? 周末了,實驗室的網速還是不給力啊,不知道doctors都在干啥,,,最近都在做算法作業,昨天晚上看了一部電影《將愛進行到底》,剛打開電影沒多久就聽到了很熟悉的旋律,讓我很是驚訝,這竟然就是電視版的那首主旋律,十幾年過去了,徐靜蕾從初出茅廬到現在成為了老徐,我也從黃毛丫頭到現在成為了男子漢,浮生若夢,歲月流沙。將愛電影的主題曲《因為愛情》很好聽,王菲的聲音空靈虛無縹緲,與陳奕迅共同演繹了一首溫馨甜蜜的歌曲。
??? 言歸正傳,到算法上來了,最長遞增子序列問題在這里不再啰嗦了,不懂的自己baidu去,不過我更喜歡google,呵呵。個人的愛好吧。
??? 最長遞增子序列有兩種解法,一種是借助前面的LCS算法,另外是本文要寫的另外一種方法。
?? 1.LCS
????? LCS算法比較的是任意兩個序列的最長公共子序列,在最長遞增子序列中,我們將原序列A首先升序排列得到B,然后將A和B求LCS就可以達到目的。在這里不再贅述,有關LCS算法,可以參見前面的文章。
?? 2.網上流傳兩種版本的最長遞增子序列算法,http://hi.baidu.com/newmyl/blog/item/12f15e97ac88b06854fb965d.html連接對這個算法進行了深入的分析。我個人比較贊同http://www.felix021.com/blog/read.php?1587&guid=5的分析(http://blog.csdn.net/fisher_jiang/archive/2008/05/13/2442348.aspx也對這個算法進行了分析但是本人覺得比較晦澀難懂,C++STL我不習慣,高手自己揣摩吧~~~~),摘錄如下:
|
個人覺得他的分析十分清晰明了,真正能讓我們知道動態規劃算法的過程。按照這種思路,我實現了Python版本的LIS算法:
#最長單調遞增子序列
def LIS(B, d, n):left = right = mid = len = 1B[0] = d[0] # //從0開始計數for i in range(1, n):left = 0right = lenwhile(left <= right):mid = (left + right) // 2if(B[mid] < d[i]):left = mid + 1 #二分查找d[i]的插入位置else:right = mid - 1B[left] = d[i] #插入if(left > len) :len = len +1 #更新lengthreturn lenif '__name__ = __main__' :d = [2 , 1 , 5 , 3 , 6, 4, 8, 9, 7] B=[0]*len(d) #初始化B數組print(LIS(B, d, len(d)))
? 輸出結果:
Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on CHENX, Threaded |
posted on 2011-03-20 22:16 追求卓越 挑戰極限 閱讀(...) 評論(...) 編輯 收藏