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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

动态规划 搜索

發(fā)布時(shí)間:2023/11/28 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划 搜索 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

https://www.zhihu.com/question/39948290/answer/83942329

動(dòng)態(tài)規(guī)劃詳解

有點(diǎn)問題

動(dòng)態(tài)規(guī)劃的本質(zhì)不在于是遞推或是遞歸,也不需要糾結(jié)是不是內(nèi)存換時(shí)間。

理解動(dòng)態(tài)規(guī)劃并不需要數(shù)學(xué)公式介入,只是完全解釋清楚需要點(diǎn)篇幅…首先需要明白哪些問題不是動(dòng)態(tài)規(guī)劃可以解決的,才能明白為神馬需要?jiǎng)討B(tài)規(guī)劃。不過好處時(shí)順便也就搞明白了遞推貪心搜索和動(dòng)規(guī)之間有什么關(guān)系,以及幫助那些總是把動(dòng)規(guī)當(dāng)成搜索解的同學(xué)建立動(dòng)規(guī)的思路。當(dāng)然熟悉了之后可以直接根據(jù)問題的描述得到思路,如果有需要的話再補(bǔ)充吧。

動(dòng)態(tài)規(guī)劃是對(duì)于 某一類問題 的解決方法!!重點(diǎn)在于如何鑒定“某一類問題”是動(dòng)態(tài)規(guī)劃可解的而不是糾結(jié)解決方法是遞歸還是遞推!

怎么鑒定dp可解的一類問題需要從計(jì)算機(jī)是怎么工作的說起…計(jì)算機(jī)的本質(zhì)是一個(gè)狀態(tài)機(jī),內(nèi)存里存儲(chǔ)的所有數(shù)據(jù)構(gòu)成了當(dāng)前的狀態(tài),CPU只能利用當(dāng)前的狀態(tài)計(jì)算出下一個(gè)狀態(tài)(不要糾結(jié)硬盤之類的外部存儲(chǔ),就算考慮他們也只是擴(kuò)大了狀態(tài)的存儲(chǔ)容量而已,并不能改變下一個(gè)狀態(tài)只能從當(dāng)前狀態(tài)計(jì)算出來這一條鐵律)

當(dāng)你企圖使用計(jì)算機(jī)解決一個(gè)問題是,其實(shí)就是在思考如何將這個(gè)問題表達(dá)成狀態(tài)(用哪些變量存儲(chǔ)哪些數(shù)據(jù))以及如何在狀態(tài)中轉(zhuǎn)移(怎樣根據(jù)一些變量計(jì)算出另一些變量)。所以所謂的空間復(fù)雜度就是為了支持你的計(jì)算所必需存儲(chǔ)的狀態(tài)最多有多少,所謂時(shí)間復(fù)雜度就是從初始狀態(tài)到達(dá)最終狀態(tài)中間需要多少步!

太抽象了還是舉個(gè)例子吧:

比如說我想計(jì)算第100個(gè)非波那契數(shù),每一個(gè)非波那契數(shù)就是這個(gè)問題的一個(gè)狀態(tài),每求一個(gè)新數(shù)字只需要之前的兩個(gè)狀態(tài)。所以同一個(gè)時(shí)刻,最多只需要保存兩個(gè)狀態(tài),空間復(fù)雜度就是常數(shù);每計(jì)算一個(gè)新狀態(tài)所需要的時(shí)間也是常數(shù)且狀態(tài)是線性遞增的,所以時(shí)間復(fù)雜度也是線性的。

上面這種狀態(tài)計(jì)算很直接,只需要依照固定的模式從舊狀態(tài)計(jì)算出新狀態(tài)就行(a[i]=a[i-1]+a[i-2]),不需要考慮是不是需要更多的狀態(tài),也不需要選擇哪些舊狀態(tài)來計(jì)算新狀態(tài)。對(duì)于這樣的解法,我們叫遞推。

非波那契那個(gè)例子過于簡(jiǎn)單,以至于讓人忽視了階段的概念,所謂階段是指隨著問題的解決,在同一個(gè)時(shí)刻可能會(huì)得到的不同狀態(tài)的集合。非波那契數(shù)列中,每一步會(huì)計(jì)算得到一個(gè)新數(shù)字,所以每個(gè)階段只有一個(gè)狀態(tài)。想象另外一個(gè)問題情景,假如把你放在一個(gè)圍棋棋盤上的某一點(diǎn),你每一步只能走一格,因?yàn)槟憧梢詵|南西北隨便走,所以你當(dāng)你同樣走四步可能會(huì)處于很多個(gè)不同的位置。從頭開始走了幾步就是第幾個(gè)階段,走了n步可能處于的位置稱為一個(gè)狀態(tài),走了這n步所有可能到達(dá)的位置的集合就是這個(gè)階段下所有可能的狀態(tài)。

現(xiàn)在問題來了,有了階段之后,計(jì)算新狀態(tài)可能會(huì)遇到各種奇葩的情況,針對(duì)不同的情況,就需要不同的算法,下面就分情況來說明一下:

假如問題有n個(gè)階段,每個(gè)階段都有多個(gè)狀態(tài),不同階段的狀態(tài)數(shù)不必相同,一個(gè)階段的一個(gè)狀態(tài)可以得到下個(gè)階段的所有狀態(tài)中的幾個(gè)。那我們要計(jì)算出最終階段的狀態(tài)數(shù)自然要經(jīng)歷之前每個(gè)階段的某些狀態(tài)。

好消息是,有時(shí)候我們并不需要真的計(jì)算所有狀態(tài),比如這樣一個(gè)弱智的棋盤問題:從棋盤的左上角到達(dá)右下角最短需要幾步。答案很顯然,用這樣一個(gè)弱智的問題是為了幫助我們理解階段和狀態(tài)。某個(gè)階段確實(shí)可以有多個(gè)狀態(tài),正如這個(gè)問題中走n步可以走到很多位置一樣。但是同樣n步中,有哪些位置可以讓我們?cè)诘趎+1步中走的最遠(yuǎn)呢?沒錯(cuò),正是第n步中走的最遠(yuǎn)的位置。換成一句熟悉話叫做“下一步最優(yōu)是從當(dāng)前最優(yōu)得到的”。所以為了計(jì)算最終的最優(yōu)值,只需要存儲(chǔ)每一步的最優(yōu)值即可,解決符合這種性質(zhì)的問題的算法就叫貪心。如果只看最優(yōu)狀態(tài)之間的計(jì)算過程是不是和非波那契數(shù)列的計(jì)算很像?所以計(jì)算的方法是遞推。

既然問題都是可以劃分成階段和狀態(tài)的。這樣一來我們一下子解決了一大類問題:一個(gè)階段的最優(yōu)可以由前一個(gè)階段的最優(yōu)得到。

如果一個(gè)階段的最優(yōu)無法用前一個(gè)階段的最優(yōu)得到呢?

什么你說只需要之前兩個(gè)階段就可以得到當(dāng)前最優(yōu)?那跟只用之前一個(gè)階段并沒有本質(zhì)區(qū)別。最麻煩的情況在于你需要之前所有的情況才行。

再來一個(gè)迷宮的例子。在計(jì)算從起點(diǎn)到終點(diǎn)的最短路線時(shí),你不能只保存當(dāng)前階段的狀態(tài),因?yàn)轭}目要求你最短,所以你必須知道之前走過的所有位置。因?yàn)榧幢隳惝?dāng)前再的位置不變,之前的路線不同會(huì)影響你的之后走的路線。這時(shí)你需要保存的是之前每個(gè)階段所經(jīng)歷的那個(gè)狀態(tài),根據(jù)這些信息才能計(jì)算出下一個(gè)狀態(tài)!

每個(gè)階段的狀態(tài)或許不多,但是每個(gè)狀態(tài)都可以轉(zhuǎn)移到下一階段的多個(gè)狀態(tài),所以解的復(fù)雜度就是指數(shù)的,因此時(shí)間復(fù)雜度也是指數(shù)的。哦哦,剛剛提到的之前的路線會(huì)影響到下一步的選擇,這個(gè)令人不開心的情況就叫做有后效性。

剛剛的情況實(shí)在太普遍,解決方法實(shí)在太暴力,有沒有哪些情況可以避免如此的暴力呢?

契機(jī)就在于后效性。

有一類問題,看似需要之前所有的狀態(tài),其實(shí)不用。不妨也是拿最長(zhǎng)上升子序列的例子來說明為什么他不必需要暴力搜索,進(jìn)而引出動(dòng)態(tài)規(guī)劃的思路。

假裝我們年幼無知想用搜索去尋找最長(zhǎng)上升子序列。怎么搜索呢?需要從頭到尾依次枚舉是否選擇當(dāng)前的數(shù)字,每選定一個(gè)數(shù)字就要去看看是不是滿足“上升”的性質(zhì),這里第i個(gè)階段就是去思考是否要選擇第i個(gè)數(shù),第i個(gè)階段有兩個(gè)狀態(tài),分別是選和不選。哈哈,依稀出現(xiàn)了剛剛迷宮找路的影子!咦慢著,每次當(dāng)我決定要選擇當(dāng)前數(shù)字的時(shí)候,只需要和之前選定的一個(gè)數(shù)字比較就行了!這是和之前迷宮問題的本質(zhì)不同!這就可以縱容我們不需要記錄之前所有的狀態(tài)啊!既然我們的選擇已經(jīng)不受之前狀態(tài)的組合的影響了,那時(shí)間復(fù)雜度自然也不是指數(shù)的了啊!雖然我們不在乎某序列之前都是什么元素,但我們還是需要這個(gè)序列的長(zhǎng)度的。所以我們只需要記錄以某個(gè)元素結(jié)尾的LIS長(zhǎng)度就好!因此第i個(gè)階段的最優(yōu)解只是由前i-1個(gè)階段的最優(yōu)解得到的,然后就得到了DP方程
LIS(i)=max{LIS(j)+1}
\ \ \ \
j<i and a[j] < a[i]

所以一個(gè)問題是該用遞推、貪心、搜索還是動(dòng)態(tài)規(guī)劃,完全是由這個(gè)問題本身階段間狀態(tài)的轉(zhuǎn)移方式?jīng)Q定的!

每個(gè)階段只有一個(gè)狀態(tài)->遞推;
每個(gè)階段的最優(yōu)狀態(tài)都是由上一個(gè)階段的最優(yōu)狀態(tài)得到的->貪心;
每個(gè)階段的最優(yōu)狀態(tài)是由之前所有階段的狀態(tài)的組合得到的->搜索;
每個(gè)階段的最優(yōu)狀態(tài)可以從之前某個(gè)階段的某個(gè)或某些狀態(tài)直接得到而不管之前這個(gè)狀態(tài)是如何得到的->動(dòng)態(tài)規(guī)劃。

每個(gè)階段的最優(yōu)狀態(tài)可以從之前某個(gè)階段的某個(gè)或某些狀態(tài)直接得到
這個(gè)性質(zhì)叫做最優(yōu)子結(jié)構(gòu);

而不管之前這個(gè)狀態(tài)是如何得到的
這個(gè)性質(zhì)叫做無后效性。

另:其實(shí)動(dòng)態(tài)規(guī)劃中的最優(yōu)狀態(tài)的說法容易產(chǎn)生誤導(dǎo),以為只需要計(jì)算最優(yōu)狀態(tài)就好,LIS問題確實(shí)如此,轉(zhuǎn)移時(shí)只用到了每個(gè)階段“選”的狀態(tài)。但實(shí)際上有的問題往往需要對(duì)每個(gè)階段的所有狀態(tài)都算出一個(gè)最優(yōu)值,然后根據(jù)這些最優(yōu)值再來找最優(yōu)狀態(tài)。比如背包問題就需要對(duì)前i個(gè)包(階段)容量為j時(shí)(狀態(tài))計(jì)算出最大價(jià)值。然后在最后一個(gè)階段中的所有狀態(tài)種找到最優(yōu)值。

作者:徐凱強(qiáng) Andy
鏈接:https://www.zhihu.com/question/23995189/answer/35324479

動(dòng)態(tài)規(guī)劃迷思
本題下其他用戶的回答跟動(dòng)態(tài)規(guī)劃都有或多或少的聯(lián)系,我也講一下與本答案的聯(lián)系。

a. “緩存”,“重疊子問題”,“記憶化”:
這三個(gè)名詞,都是在闡述遞推式求解的技巧。以Fibonacci數(shù)列為例,計(jì)算第100項(xiàng)的時(shí)候,需要計(jì)算第99項(xiàng)和98項(xiàng);在計(jì)算第101項(xiàng)的時(shí)候,需要第100項(xiàng)和第99項(xiàng),這時(shí)候你還需要重新計(jì)算第99項(xiàng)嗎?不需要,你只需要在第一次計(jì)算的時(shí)候把它記下來就可以了。
上述的需要再次計(jì)算的“第99項(xiàng)”,就叫“重疊子問題”。如果沒有計(jì)算過,就按照遞推式計(jì)算,如果計(jì)算過,直接使用,就像“緩存”一樣,這種方法,叫做“記憶化”,這是遞推式求解的技巧。這種技巧,通俗的說叫“花費(fèi)空間來節(jié)省時(shí)間”。都不是動(dòng)態(tài)規(guī)劃的本質(zhì),不是動(dòng)態(tài)規(guī)劃的核心。

b. “遞歸”:
遞歸是遞推式求解的方法,連技巧都算不上。

c. “無后效性”,“最優(yōu)子結(jié)構(gòu)”:
上述的狀態(tài)轉(zhuǎn)移方程中,等式右邊不會(huì)用到下標(biāo)大于左邊i或者k的值,這是"無后效性"的通俗上的數(shù)學(xué)定義,符合這種定義的狀態(tài)定義,我們可以說它具有“最優(yōu)子結(jié)構(gòu)”的性質(zhì),在動(dòng)態(tài)規(guī)劃中我們要做的,就是找到這種“最優(yōu)子結(jié)構(gòu)”。
在對(duì)狀態(tài)和狀態(tài)轉(zhuǎn)移方程的定義過程中,滿足“最優(yōu)子結(jié)構(gòu)”是一個(gè)隱含的條件(否則根本定義不出來)。對(duì)狀態(tài)和“最優(yōu)子結(jié)構(gòu)”的關(guān)系的進(jìn)一步解釋,什么是動(dòng)態(tài)規(guī)劃?動(dòng)態(tài)規(guī)劃的意義是什么? - 王勐的回答 寫的很好,大家可以去讀一下。

需要注意的是,一個(gè)問題可能有多種不同的狀態(tài)定義和狀態(tài)轉(zhuǎn)移方程定義,存在一個(gè)有后效性的定義,不代表該問題不適用動(dòng)態(tài)規(guī)劃。這也是其他幾個(gè)答案中出現(xiàn)的邏輯誤區(qū):
動(dòng)態(tài)規(guī)劃方法要尋找符合“最優(yōu)子結(jié)構(gòu)“的狀態(tài)和狀態(tài)轉(zhuǎn)移方程的定義,在找到之后,這個(gè)問題就可以以“記憶化地求解遞推式”的方法來解決。而尋找到的定義,才是動(dòng)態(tài)規(guī)劃的本質(zhì)。

                                </div>

總結(jié)

以上是生活随笔為你收集整理的动态规划 搜索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。