日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最长不下降子序列的O(n^2)算法和O(nlogn)算法

發布時間:2025/6/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最长不下降子序列的O(n^2)算法和O(nlogn)算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉帖 最長不下降子序列的O(n^2)算法和O(nlogn)算法?

最長不下降子序列(LIS:Longest Increasing Subsequence)

//用句通俗的話說,我講的很通俗易懂~~

問題描述:給出n個數,求出其最長不下降子序列的長度,比如n=5,5個數是{4,6,5,7,3};其最長下降子序列就是{4,6,7},長度為3。

一、簡單的O(n^2)的算法

???????? 很容易想到用動態規劃做。設lis[]用于保存第1~i元素元素中最長不下降序列的長度,則lis[i]=max(lis[j])+1,且num[i]>num[j],i>j。然后在lis[]中找到最大的一個值,時間復雜度是O(n^2)。

???????? 代碼實現:

????????? int Longest_Increasing(int num[],int n){

???????????????????? int lis[n],i,j;

??????????????????? for(i=0;i<n;i++){

?????????????????????????? lis[i]=1;

????????????????????????? for(j=0;j<i;j++)

???????????????????????????????? if(num[i]>num[j]&&lis[j]+1>lis[i])

???????????????????????????????????????????? lis[i]=lis[j]+1;

?????????????????????? }

?????????????????????? int maxn=0;

?????????????????????? for(i=0;i<n;i++) if(maxn<lis[i]) maxn=lis[i];

??????????????????????? return maxn;

?????????????? }

二、復雜點的O(nlogn)算法

?????????????? 概述:O(nlogn)的算法關鍵是它建立了一個數組b[],b[i]表示長度為i的不下降序列中結尾元素的最小值,用K表示數組目前的長度,算法完成后K的值即為最長不下降子序列的長度。

?????????????? 具體點來講:

??????????????? 設當前的以求出的長度為K,則判斷a[i]和b[k]:

??????????????? 1.如果a[i]>=b[k],即a[i]大于長度為K的序列中的最后一個元素,這樣就可以使序列的長度增加1,即K=K+1,然后現在的b[k]=a[i];

?????????????????2.如果a[i]<b[k],那么就在b[1]...b[k]中找到最大的j,使得b[j]<a[i],然后因為b[j]<a[i],所以a[i]大于長度為j的序列的最后一個元素,那么就可以更新長度為j+1的序列的最后一個元素,即b[j+1]=a[i]。

???????????????? 算法復雜度的分析:

?????????????? 因為共有n個元素要進行計算;每次計算又要查找n次,所以復雜度是O(n^2),但是,注意到b[]數組里的元素的單調遞增的,所以我們可以用二分法,查找變成了logn次。這樣算法的復雜度就變成了O(nlogn)。具體算法實現請看代碼(7-13update:以前的blog用不了了,所以重新弄過了)。

?????????????? 下面這段代碼解決的是一道OI的題。

??????????????????????http://www.rqnoj.cn/Problem_Show.asp?PID=167

??????????? #include<iostream>
??????????? using namespace std;
??????????? long f[100001]={0},l=1,r,m,t=0,a;
??????????? inline void BinarySearch(){
?? ????????????????? while(l<=r){
?? ??????????????????????? m=(l+r)>>1;
?? ??????????????????????? if(f[m]==a){l=m;return;}
?? ??????????????????????? else
?? ???? ????????????????????????? if(f[m]>a)l=m+1;
?? ???? ???????????????????????? else r=m-1;
?? ????????????????? }
???????????? }
???????????? main(){
?? ??????????????????? long n;
?? ??????????????????? cin>>n;
?? ??????????????????? for(int i=1;i<=n;i++){
?? ???????????????????????? cin>>a;
?? ???????????????????????? if(a==0)continue;
?? ???????????????????????? l=1,r=t;
?? ???????????????????????? BinarySearch();
?? ??? ?? if(l<=t)f[l]=a;
?? ???????????????????????? else t++,f[t]=a;
?? ??????????????????? }
?? cout<<t;
?????????? }

//若仍然不能深刻理解可參考http://blog.sina.com.cn/s/reader_4ec7d3fc01000aet.html或跟我討論

總結

以上是生活随笔為你收集整理的最长不下降子序列的O(n^2)算法和O(nlogn)算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。