演算法導論15 4 6 最長單調遞增子串行

2021-06-11 03:25:40 字數 1110 閱讀 5269

參考資料:

《程式設計之美》2.16

題目:給出乙個o(nlogn)的演算法,使之能夠找出乙個n個數的序列中最長的單調遞增子串行。

o(n2)的比較好理解,沒有仔細研究,研究了下o(nlogn)的解答和好多大神的分析才明白一些,發現玄妙無限呀~

對於序列sn,考慮其長度為i的單調子列(1<=i<=m)。我們選取這些子列的最後乙個元素的最小值。用li表示。則有l1

<=l2

<=…<=lm。

序列a1, a2, …, an,從左至右掃瞄序列(可用二分法),對於每乙個ai,它可能

(1)    ai

1,那麼l1=ai

(2)    ai>=lm,那麼lm+1=ai,m=m+1 (其中m是當前見到的最大的l下標)

(3)    ls

<=ai

s+1,那麼ls+1=ai

以上就是binarysrh中完成的主要任務。

陣列a:1 3 5 2 3

1、修改後二分查詢可得最長子序列的長度,得陣列maxl:1 2 3。最終maxl的長度len即表示最長遞增子串行的長度。這個我也只能理解,但不知道怎麼證明。

2、如果要得到子串行的內容應該怎麼做呢?

可以在遍歷過程中,用mem陣列記錄數字j,j表示當前數字是長度為j的子串行的尾數字。遍歷結束後,從後往前遍歷mem即可得到長度為len, len-1, len-2, ... 1的所有子串行的結尾數字,這樣就得到了最長遞增子串行。

#includeusing namespace std;

int binarysrh( int *s, int len, int x ) #二分查詢

cout << "max length: " << len << endl;

cout << "longest subsequence: ";

int currmaxlen = len-1;

for( int i=0; i=0&&currmaxlen>=0; i-- )

} cout << endl;

return 0;

}

演算法導論 最長遞增子串行

華電北風吹 日期 2016 2 20 問題描述 例如陣列arr 1,5,8,2,3,4 的最長遞增子串行是1,2,3,4 動態規劃求解。對於陣列中的每個元素,從前往後計算每個元素的狀態 到這個元素為止所構成的最長遞增子串行。時間複雜度 n2 include include using namespa...

最長單調遞增子串行

單調子串行包含有單調遞增子串行和遞減子串行,不失一般性,這裡只討論單調遞增子串行。首先,從定義上明確我們的問題。給定序列a1,a2,an,如果存在滿足下列條件的子串行 ai1 ai2 aim,其中i1即稱為乙個原序列的長度為m的單調遞增子串行,那麼,現在的問題是我們要找出乙個序列的最長的單調遞增子串...

最長單調遞增子串行

設計乙個o n2 時間的演算法,找出由n個數組成的序列的最長單調遞增子串行。輸入 第1個整數n 0分析 用陣列b 0 i 記錄以a i 0 i a k 並且 b k max b j 1 j i 1 所以 b i b k 1.如果存在k b k b k 並且 a i a k 即 b i 不是滿足條件的...