中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
最長(zhǎng)上升子序列的最優(yōu)算法

1 問(wèn)題背景

最長(zhǎng)上升子序列問(wèn)題(Longest Increasing Subsequence)在算法教學(xué)中的經(jīng)典問(wèn)題,在學(xué)習(xí)動(dòng)態(tài)規(guī)劃(Dynamic Programming)相關(guān)內(nèi)容時(shí)經(jīng)常出現(xiàn)。在動(dòng)態(tài)規(guī)劃這一章節(jié)中出現(xiàn)的頻率只比最長(zhǎng)公共子序列(Longest Common Sequence)小。最長(zhǎng)上升子序列問(wèn)題的動(dòng)態(tài)規(guī)劃解法的時(shí)間復(fù)雜度為n2,而我們可以得到的最長(zhǎng)上升子序列的最優(yōu)化算法的復(fù)雜度為nlogn。最長(zhǎng)上升子序列在我們的課程中是作為動(dòng)態(tài)規(guī)劃的聯(lián)系來(lái)做的,這樣就誤導(dǎo)了大家,使得大家認(rèn)為最長(zhǎng)上升子序列問(wèn)題的最優(yōu)算法就是動(dòng)態(tài)規(guī)劃算法。這樣就違背另外算法研究的精神,所以我寫這篇文章,以正視聽。

設(shè)A=< x1,x2,··· ,xn >n個(gè)不等的整數(shù)構(gòu)成的序列,A的一個(gè)單調(diào)遞增子序列<

xi1,xi2,··· ,xik >使得i1 < i2 < ··· < ik,且xi1 < xi2 < ··· < xik.子序列< xi1,xi2,··· ,xik >的長(zhǎng)度是含有的整數(shù)個(gè)數(shù)k.例如A =< 1,5,3,8,10,6,4,9 >,他的長(zhǎng)為4的遞增子序列是:

< 1,5,8,10 >,< 1,5,8,9 >,···.設(shè)計(jì)一個(gè)算法求A的一個(gè)最長(zhǎng)的單調(diào)遞增子序列,分析算法的時(shí)間復(fù)雜度.

3 算法思想

設(shè)A[t]表示序列中的第t個(gè)數(shù)F[t]表示從1tt這一段中以t結(jié)尾的最長(zhǎng)上升子序列的長(zhǎng)度F[t] = 0(t = 1,2,··· ,len(A))。則有動(dòng)態(tài)規(guī)劃方程F[t] = max1,F[j] + 1(j = 1,2,...,t ?

1,A[j] < A[t]).

現(xiàn)在,我們仔細(xì)考慮計(jì)算F[t]時(shí)的情況。假設(shè)有兩個(gè)元素A[x]A[y]滿足一下情況.

  1. x < y < t
  2. A[x] < A[y] < A[t]
  3. F[x] = F[y]

此時(shí),選擇A[x]和選擇A[y]都可以得到同樣的F[t]值,那么,在最長(zhǎng)上升子序列的這個(gè)位置中,應(yīng)該選擇A[x]還是A[y]

很明顯,選擇A[x]比選擇A[y]要好。因?yàn)橛捎跅l件(2),在A[x + 1]···A[t ? 1]這一段中,如果存在A[z]?A[x] < A[z] < A[y],則與選擇A[y]相比,將會(huì)得到更長(zhǎng)的上升子序列。再根據(jù)條件(3),我們會(huì)得到一個(gè)啟示:根據(jù)F[]的值進(jìn)行分類。對(duì)于F[]的每一個(gè)取值k,我們只需要保留滿足F[t] = k的所有A[t]中的最小值。設(shè)D[k]記錄這個(gè)值,即D[k] = minA[t](F[t] = k)。

注意到D[]的兩個(gè)特點(diǎn):

利用D[],我們可以得到另外一種計(jì)算最長(zhǎng)上升子序列長(zhǎng)度的方法。設(shè)當(dāng)前已經(jīng)求出的最長(zhǎng)

上升子序列長(zhǎng)度為len。我們利用t來(lái)遍歷A[],如果A[t]?D[len],則我們將A[t]接在D[len]后面,這樣我們就得到了一個(gè)更長(zhǎng)的上升子序列。此時(shí)更新len = len + 1,D[len] = A[t];否則在D[1],D[2],··· ,D[len]中尋找最小的j,使得D[j] > A[t],D[j]更新為A[t],其他不變。最后遍歷完整個(gè)A[]后,len就是A[]中最長(zhǎng)上升子序列的長(zhǎng)度。

4 算法正確性的證明

我們用數(shù)學(xué)歸納法來(lái)證明這個(gè)算法的確返回了A[]中最長(zhǎng)上升子序列的長(zhǎng)度。歸納命題如下:對(duì)于1 ≤ t n,當(dāng)我們處理完A[t]時(shí),lenA[1],A[2],··· ,A[t]最長(zhǎng)上升子序列的長(zhǎng)度。且對(duì)于1 ≤ i len,D[i]則是A[1],A[2],··· ,A[t]中所有長(zhǎng)度為i的上升序列的的最后一個(gè)數(shù)的最小值。

歸納基礎(chǔ): 當(dāng)t = 1時(shí),len = 1,D[1] = A[1]命題顯然成立。

歸納假設(shè):如果當(dāng)t = j時(shí)歸納命題成立,則我們現(xiàn)在來(lái)處理A[j + 1]。

  1. 1的上升子序列,所以該序列是A[1],A[2],··· ,A[j + 1]的最長(zhǎng)上升子序列。因此len + 1A[1],A[2],··· ,A[j + 1]的最長(zhǎng)上升子序列的最大長(zhǎng)度。我們把len更新為len + 1,同時(shí)把D[len]更新為A[j + 1]。而根據(jù)性質(zhì)2D[i]是不會(huì)變大的,所以原始的D[]不會(huì)受到任何影響。因此處理完A[j + 1]后,lenA[1],A[2],··· ,A[j + 1]最長(zhǎng)上升子序列的長(zhǎng)度且對(duì)于1 ≤ i len,D[i]則是A[1],A[2],··· ,A[j + 1]中所有長(zhǎng)度為i的上升序列的的最后一個(gè)數(shù)的最小值這個(gè)命題時(shí)成立。

  2. 如果A[j + 1] < D[len],根據(jù)歸納假設(shè),A[1],A[2],··· ,A[j]的最長(zhǎng)上升子序列的長(zhǎng)度為len,且所有的長(zhǎng)度為len的上升子序列的最后一個(gè)數(shù)的最小值為D[len]?,F(xiàn)在我們來(lái)證明A[1],A[2],··· ,A[j + 1]最長(zhǎng)上升子序列的長(zhǎng)度不可能是len + 1,這里我們采用反證法來(lái)證明。由于len是原序列中的最長(zhǎng)上升子序列的長(zhǎng)度,如果A[1],A[2],··· ,A[j +1]最長(zhǎng)上升子序列的長(zhǎng)度是len + 1,則A[j + 1]一定是這個(gè)最長(zhǎng)上升子序列的末尾。而又由于在A[1],A[2],··· ,A[j]中所有的長(zhǎng)度為len的上升子序列的最后一個(gè)數(shù)的最小值為D[len],且A[j + 1] < D[len],所以這個(gè)所謂的子序列并不是上升子序列。因此, A[1],A[2],··· ,A[j + 1]最長(zhǎng)上升子序列的長(zhǎng)度不可能是len + 1,len不需要更新處理。但是D[]中的元素可能需要更新為A[j + 1],為此我們首先在D[1],D[2],··· ,D[len]中尋找最小的i,使得D[i] > A[j + 1].由于性質(zhì)2,我們只能更新一個(gè)D[k],因?yàn)槿绻聝蓚€(gè)的話,D[]會(huì)有兩個(gè)值為A[j + 1],就不是一個(gè)單調(diào)遞增序列了。而且根據(jù)性質(zhì)1

    D[k]的值是不會(huì)變大的,所以我們只能更新k i的某一個(gè)D[k]。同時(shí)又由于性質(zhì)2,我們只能更新D[i],否則的話D[]中會(huì)出現(xiàn)逆序?qū)Α,F(xiàn)在我們證明更新D[i]是正確的,由于D[i ? 1] < A[j + 1],所以把A[j + 1]接在以D[i ? 1]結(jié)尾的最長(zhǎng)上升序列的末尾是可行的,這時(shí)得到的序列長(zhǎng)度為i,且為上升序列.又因?yàn)?/span>D[i] > A[j + 1],所以我們可以把D[i]更新為A[j +1].此時(shí),處理完A[j +1]后,lenA[1],A[2],··· ,A[j +1]最長(zhǎng)上升子序列的長(zhǎng)度且對(duì)于1 ≤ i len,D[i]則是A[1],A[2],··· ,A[j + 1]中所有長(zhǎng)度為i的上升序列的的最后一個(gè)數(shù)的最小值這個(gè)命題時(shí)成立。

根據(jù)上面的兩種情況的分析,我們可以得出以下結(jié)論,當(dāng)t = j歸納命題成立時(shí),t = j+1命題

也成立。由上面的分析可以推出:對(duì)于1 ≤ t n,當(dāng)我們處理完A[t]時(shí),lenA[1],A[2],··· ,A[t]

長(zhǎng)上升子序列的長(zhǎng)度。且對(duì)于1 ≤ i len,D[i]則是A[1],A[2],··· ,A[t]中所有長(zhǎng)度為i的上升序列的的最后一個(gè)數(shù)的最小值。

在上述算法中,若使用樸素的順序查找在D[1],··· ,D[len]查找,由于共有O(n)個(gè)元素需要計(jì)算,每次計(jì)算時(shí)的復(fù)雜度是O(n),則整個(gè)算法的時(shí)間復(fù)雜度為O(n2),與原來(lái)的算法相比沒(méi)有任何進(jìn)步。但是由于D[]的特點(diǎn)(2),我們?cè)?/span>D[]中查找時(shí),可以使用二分查找高效地完成,則整個(gè)算法的時(shí)間復(fù)雜度下降為O(nlogn),有了非常顯著的提高。

上面所說(shuō)的算法可以在O(nlogn)時(shí)間內(nèi)得到A[]的最長(zhǎng)上升子序列的長(zhǎng)度,但是我們得到的最后的D[]序列一般來(lái)說(shuō)并不是符合條件的最長(zhǎng)上升子序列。為了得到一個(gè)最長(zhǎng)上升子序列,我們需要對(duì)原有的算法做一點(diǎn)修正,即用F[t]來(lái)記錄A[1],··· ,A[t]的最長(zhǎng)上升子序列的長(zhǎng)度。這個(gè)操作可以在每次處理完A[t]之后,進(jìn)行F[t] = len這個(gè)賦值操作來(lái)完成。我們可以在O(n)時(shí)間內(nèi)得到F[],在我們得到F[]后,我們可以在O(n)的時(shí)間內(nèi)找到一個(gè)最長(zhǎng)上升子序列,方法如下。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
動(dòng)態(tài)規(guī)劃
常見(jiàn)排序算法的實(shí)現(xiàn)_排序算法_中國(guó)IT實(shí)驗(yàn)室專題
4分鐘學(xué)會(huì)桶排序
漫畫算法:無(wú)序數(shù)組排序后的最大相鄰差值
Gilbreath原理中的數(shù)學(xué)與魔術(shù)(二)——Ultimate Gilbreath 原理 & Mandelbrot 集合
2012年高考數(shù)學(xué)按章節(jié)分類匯編(人教A必修四):第一章三角函數(shù)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服