關於LIS O n lgn 演算法的一點理解

2021-09-08 08:59:10 字數 1735 閱讀 4817

關於lis(least increasing subsequence,可譯為最長遞增子串行、最長上公升子串行),其o(n2)和o(nlgn)的演算法可以見博文[1][2]。

o(n2)的演算法很早之前就聽說,不算新鮮,但o(nlgn)的演算法還是第一次聽說,覺得很新鮮,也很牛。既然很多人都引用了這個演算法我相信這個演算法一定是正確的,但是引用這些演算法的博文卻並沒有給出這個演算法的乙個特別準確的描述,也沒有對其正確性進行證明。題目的出處(參見[3]的擴充套件1)對這個演算法的解釋較籠統,無法確知為何通過二分查詢能得到正確的結果,反而是複雜度較為容易理解。通過[1][2]的敘述,自己得到了一些本演算法為何正確的靈感,因此對這個演算法試圖更精確描述如下。

首先,引用[1]對演算法的敘述方式:

另外還有一種o(n log k)的演算法,其中k是實際lis的長度。演算法使用乙個公升序排列的序列a來儲存整個lis。a的初始狀態為1個負無窮大和n-1個正無窮大組成的陣列。我們要做的就是對整個序列來一次遍歷,然後把每個數放到a中去看它是否是屬於這個lis,如果是就把它插入其中。這裡所謂是否屬於就是指從a的第乙個非無窮大的數往前看,如果找到這個乙個位置,即前面的數小於這個待插入的數,且後乙個數大於那個數。插入的方法就是把後面的那個數替代掉即可。這種查詢使用的是binary search,它時間複雜度為o(log k)。所以最終整個演算法的時間複雜度為o(n log k)。下面給出乙個例子:

0123456

78a -7,10, 9, 2, 3, 8, 8, 1

a -i i, i, i, i, i, i, i, i

a -i -7, i, i, i, i, i, i, i (1

)a -i -7,10, i, i, i, i, i, i (2

)a -i -7, 9, i, i, i, i, i, i (3

)a -i -7, 2, i, i, i, i, i, i (4

)a -i -7, 2, 3, i, i, i, i, i (5

)a -i -7, 2, 3, 8, i, i, i, i (6

)a -i -7, 2, 3, 8, i, i, i, i (7

)a -i -7, 1, 3, 8, i, i, i, i (8)

在這個演算法中,關鍵的問題是陣列a如何理解。在這裡設定o(n2)的演算法為演算法1,o(nlgn)的演算法為演算法2。為了要證明演算法2的正確性,如果能證明演算法2的內層迴圈能完成和演算法1的一樣的功能,那麼即可得證。於是首先要知道的是演算法1的內層迴圈到底完成了乙個什麼樣的功能。用一句話描述如下:

對於當前第i個元素,找到結尾元素比a[i]小且d[k](陣列d為以第k元素為結尾的最長遞增子串行,k為1~i之間任意數字)最大的那個的元素。

那麼演算法2中a陣列儲存了什麼呢?用一句話描述可以為:

對於當前元素a[i],元素a[k]是在考慮了前i-1個元素後,長度為k的子串行結尾最小的元素。

其實可知,演算法2與演算法1中的記憶體迴圈完成的功能是一樣。因為a中儲存的是長度為k的子串行結尾最小元素,而演算法2的內層迴圈實際上是在尋找a陣列中小於當前元素的最大元素(暫且不考慮二分搜尋,而假設使用普通的線性掃瞄,後面會證明a陣列一定是有序的)。這個過程可以理解實際上是在找結尾小於當前元素的最大的k。這與演算法1是相同的。

接下來證明a陣列一定是遞增的。用反證法,假設對某個k,a[k+1]a[k],故陣列a為遞增。

對於遞增的陣列a,查詢可以使用二分,故演算法的複雜度為o(nlgn)。

[1] 

[2] 

[3] 

6

關於LIS O n lgn 演算法的一點理解

關於lis least increasing subsequence,可譯為最長遞增子串行 最長上公升子串行 其o n2 和o nlgn 的演算法可以見博文 1 2 o n2 的演算法很早之前就聽說,不算新鮮,但o nlgn 的演算法還是第一次聽說,覺得很新鮮,也很牛。既然很多人都引用了這個演算法我...

關於演算法的一點思考。。。

關於演算法的一點思考。在實踐過程中,我發現 有時候要解決乙個問題,可以設計幾個演算法分步完成任務,這樣處理起來比較簡單,但是情況並非總是如此,有時,我們需要將幾個步驟放在同乙個演算法內連帶處理,這樣才比較容易處理問題。我還發現,有時候,解決問題的演算法,是被發現出來的,並加以一步一步的檢驗才得以確定...

關於演算法的一點總結

分解問題的角度 fix 某一維度,嘗試另一維度上的所有可能 a.可能是array的 i,j pointers,b.可能是矩形的長與寬,c.可能是tree的每乙個subtree,d.可能是情景題的每一對pair 求所有解的,暴力上backtracking吧 如果問最短 最少的,先想bfs dp這對好 ...