參考資料:
《程式設計之美》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 不是滿足條件的...