一個數組求其最長遞增子序列(LIS)


一個數組求其最長遞增子序列(LIS)

例如數組{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},長度為5,假設數組長度為N,求數組的LIS的長度,

 

需要一個額外的數組 LIS 來記錄

 長度從1 到 n 慢慢變長求解的過程中 對應長度的 最長遞增子序列的最小的末尾元素

 

解決方法

長度為1時 {3}:

將3放入LIS中,表示長度為1的時候,{3}數組的最長遞增子序列的最小微元素

LIS:{3}

只有一個元素,所以 最長遞增子序列就是 {3},最長遞增子序列的最小尾元素 就是3

 

長度為2時 {3,1}:

新加入的元素1<3 長度增加變成2時,新加入的元素1比長度為1的時候的 最長遞增子序列的最小尾元素還小,所以新加入元素1不會引起最長遞增子序列變長,所以需要將1 插入 LIS中,在LIS中找到最小的比1大的元素,替換該元素,完成長度為2 的時候 最長遞增子序列的尋找,

LIS:{1}

1替換掉3 表示 在長度為2的時候{3,1}的最長遞增子序列的最小尾元素是1,驗證 最長遞增子序列{1}或{3}

 

長度為3時 {3,1,4}:

新加入的元素4>1,新加入的元素,比長度為2時的最長遞增序列的最小尾元素大,說明新加入元素可以引起最長遞增序列的增長,加入新元素4得:

LIS:{1,4}

 驗證 最長遞增序列 {3,4} 或者 {1,4}

 

長度為4時 {3,1,4,2}:

新加入元素2<4, 比長度為3時的最長遞增子序列的最小尾元素小,說明不引起最長遞增序列的增長,需要在LIS中找到替換的元素 找到第一個比2大的元素4替換,這樣在保證遞增序列數量不變的情況下,將遞增序列的范圍往小值方向移動。得

LIS:{1,2}

驗證 最長遞增序列 {3,4} 或者 {1,2}

 

長度為5時 {3,1,4,2,3}:

新加入元素3>2, 比長度為4時的最長遞增子序列的最小尾元素大,說明引起最長遞增序列的增長,得

LIS:{1,2,3}

驗證 最長遞增序列 {1,2,3}

 

長度為6時 {3,1,4,2,3,9}:

新加入元素9>3, 比長度為5時的最長遞增子序列的最小尾元素大,說明引起最長遞增序列的增長,得

LIS:{1,2,3,9}

驗證 最長遞增序列 {1,2,3,9}

 

 

長度為7時 {3,1,4,2,3,9,4}:

新加入元素4<9, 比長度為3時的最長遞增子序列的最小尾元素小,說明不引起最長遞增序列的增長,需要在LIS中找到替換的元素 找到第一個比4大的元素9替換,這樣在保證遞增序列數量不變的情況下,將增序列的范圍往小值方向移動。得

LIS:{1,2,3,4}

驗證 最長遞增序列  {1,2,3,4}

 

長度為8時 {3,1,4,2,3,9,4,6}:

新加入元素6>4, 比長度為7時的最長遞增子序列的最小尾元素大,說明引起最長遞增序列的增長,得

LIS:{1,2,3,4,6}

驗證 最長遞增序列  {1,2,3,4,6}

 

需要注意:

LIS保存的是 求解的過程中 對應長度的 最長遞增子序列的最小的末尾元素 不一定就是最長遞增序列原來的序列

 

插入新元素尋找替換位置的時候 有序查找可以使用二分查找 時間復雜度 o(LogN)

所以該解決方法的時間復雜度NlogN

空間復雜度 N


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM