国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解鎖動態(tài)規(guī)劃:從斐波那契到高效算法

這篇具有很好參考價值的文章主要介紹了解鎖動態(tài)規(guī)劃:從斐波那契到高效算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??作者介紹:10年大廠數(shù)據(jù)\經(jīng)營分析經(jīng)驗,現(xiàn)任大廠數(shù)據(jù)部門負(fù)責(zé)人。
會一些的技術(shù):數(shù)據(jù)分析、算法、SQL、大數(shù)據(jù)相關(guān)、python

歡迎加入社區(qū):碼上找工作
作者專欄每日更新:

LeetCode解鎖1000題: 打怪升級之旅
python數(shù)據(jù)分析可視化:企業(yè)實戰(zhàn)案例
備注說明:方便大家閱讀,統(tǒng)一使用python,帶必要注釋,公眾號 數(shù)據(jù)分析螺絲釘 一起打怪升級

動態(tài)規(guī)劃(Dynamic Programming, DP)是解決優(yōu)化問題的一種算法策略,它將一個復(fù)雜問題分解為更小的子問題,通過解決子問題來逐步找到復(fù)雜問題的最優(yōu)解。動態(tài)規(guī)劃適用于有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問題。接下來,我們通過一個經(jīng)典的動態(tài)規(guī)劃問題——斐波那契數(shù)列(Fibonacci Sequence)來詳細(xì)介紹動態(tài)規(guī)劃的思路和實現(xiàn)步驟。

問題定義

斐波那契數(shù)列是這樣一個序列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …,其中每個數(shù)字(從第三個數(shù)字起)都是前兩個數(shù)字的和。斐波那契數(shù)列的定義如下:

解鎖動態(tài)規(guī)劃:從斐波那契到高效算法,LeetCode解鎖1000題: 打怪升級之旅,動態(tài)規(guī)劃,算法,leetcode,python,數(shù)據(jù)結(jié)構(gòu)

我們的目標(biāo)是編寫一個函數(shù),輸入n,輸出斐波那契數(shù)列的第n項。

1. 遞歸解法(非DP解)

首先,我們嘗試使用遞歸解法,這種方法簡單直觀,但效率較低。

def fibonacci_recursive(n):
    if n <= 1:
        return n
    else:
        return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)

這個遞歸解法雖然簡單,但它進(jìn)行了大量重復(fù)計算,時間復(fù)雜度為O(2^n)。?

我們可以通過分析斐波那契數(shù)列的遞歸樹來直觀地看出重復(fù)計算的發(fā)生。

斐波那契數(shù)列的遞歸樹

考慮計算F(5)的過程,遞歸樹如下所示:

在這個樹狀結(jié)構(gòu)中,每個節(jié)點表示一個遞歸調(diào)用,節(jié)點的值是調(diào)用的參數(shù)。從這個樹中我們可以觀察到:

  1. 重復(fù)的子問題F(3)F(2)、F(1)F(0)被計算了多次。特別是F(2),在整個計算過程中被重復(fù)計算了三次。

  2. 增長的遞歸調(diào)用:隨著參數(shù)n的增加,遞歸調(diào)用的數(shù)量呈指數(shù)級增長。例如,F(n)的計算會導(dǎo)致F(n-1)F(n-2)的計算,而這些調(diào)用又會分別導(dǎo)致更多的遞歸調(diào)用。

分析重復(fù)計算的原因

重復(fù)計算的主要原因在于,遞歸解法中對每個子問題的解決都是獨立進(jìn)行的,它沒有考慮到在求解過程中,很多子問題實際上是相同的。由于遞歸方法沒有記錄已經(jīng)解決的子問題的結(jié)果,每次遇到這些子問題時,它都會重新進(jìn)行計算。

2. 動態(tài)規(guī)劃解法

為了提高效率,我們使用動態(tài)規(guī)劃的方法,避免重復(fù)計算。

步驟1:定義狀態(tài)

定義dp數(shù)組,其中dp[i]表示斐波那契數(shù)列中第i個數(shù)的值。

步驟2:確定狀態(tài)轉(zhuǎn)移方程

根據(jù)斐波那契數(shù)列的定義,我們可以得到狀態(tài)轉(zhuǎn)移方程:dp[i] = dp[i-1] + dp[i-2]

步驟3:確定初始條件和邊界條件

dp[0] = 0, dp[1] = 1

步驟4:計算順序

從小到大計算dp數(shù)組的值。

動態(tài)規(guī)劃代碼實現(xiàn)
def fibonacci_dp(n):
    if n <= 1:
        return n
    dp = [0] * (n+1)
    dp[1] = 1
    for i in range(2, n+1):
        dp[i] = dp[i-1] + dp[i-2]
    return dp[n]

這種方法的時間復(fù)雜度為O(n),空間復(fù)雜度也為O(n)。

3. 動態(tài)規(guī)劃優(yōu)化

對于斐波那契數(shù)列問題,我們實際上不需要保存整個dp數(shù)組,只需要保存前兩個狀態(tài)即可。

優(yōu)化后的代碼
def fibonacci_dp_optimized(n):
    if n <= 1:
        return n
    prev, curr = 0, 1
    for i in range(2, n+1):
        prev, curr = curr, prev + curr
    return curr

這個優(yōu)化后的版本將空間復(fù)雜度降低到了O(1)。

4. 算法思考

1. 子問題

在動態(tài)規(guī)劃中,我們將原問題分解為較小的、相互關(guān)聯(lián)的子問題。對于斐波那契數(shù)列問題,求F(n)可以看作是一個原問題,它可以分解為求F(n-1)F(n-2)兩個子問題。而F(n-1)F(n-2)又可以繼續(xù)分解,直到F(1)F(0)。

2. 重疊子問題

動態(tài)規(guī)劃適用于那些有大量重疊子問題的情況,即不同的問題求解路徑中包含了許多相同的子問題。在遞歸求解斐波那契數(shù)列時,F(n-1)F(n-2)會重復(fù)計算F(n-3)、F(n-4)等更小的子問題。動態(tài)規(guī)劃通過記憶化(存儲)這些子問題的解來避免重復(fù)計算。

3. 最優(yōu)子結(jié)構(gòu)

斐波那契數(shù)列問題具有最優(yōu)子結(jié)構(gòu)的特點,即問題的最優(yōu)解包含了其子問題的最優(yōu)解。雖然斐波那契數(shù)列問題本身不涉及“最優(yōu)化”,但其解決方法體現(xiàn)了最優(yōu)子結(jié)構(gòu)的思想:F(n)的最優(yōu)解(即準(zhǔn)確解)可以通過組合F(n-1)F(n-2)的解得到。

4. 動態(tài)規(guī)劃表(DP Table)

在這個例子中,dp數(shù)組就是所謂的動態(tài)規(guī)劃表。它用來記錄每一步的結(jié)果(即每個F(i)的值),以便于后續(xù)的計算可以直接引用前面的結(jié)果,而不是重新計算。這種方法極大地提高了效率,因為每個子問題只被解決一次,并且一旦被解決,其結(jié)果就會被保存。

5. 狀態(tài)轉(zhuǎn)移方程

動態(tài)規(guī)劃的核心是狀態(tài)轉(zhuǎn)移方程。在斐波那契數(shù)列的例子中,狀態(tài)轉(zhuǎn)移方程是dp[i] = dp[i-1] + dp[i-2]。這個方程描述了問題狀態(tài)之間的關(guān)系,即如何從已知的子問題的解得到當(dāng)前問題的解。

通過這個斐波那契數(shù)列的例子,你可以看到,盡管我們使用的是簡單的數(shù)組來存儲每一步的結(jié)果,但這個過程完全體現(xiàn)了動態(tài)規(guī)劃的思想:分解問題、解決子問題、存儲子問題的解以避免重復(fù)計算。這就是dp數(shù)組與動態(tài)規(guī)劃思想關(guān)聯(lián)的方式,它是實現(xiàn)動態(tài)規(guī)劃策略的一個工具。

總結(jié)

動態(tài)規(guī)劃中的應(yīng)用體現(xiàn)了動態(tài)規(guī)劃的核心思想:存儲中間結(jié)果,避免重復(fù)計算。這里的dp數(shù)組正是用來存儲每個子問題的解,即斐波那契數(shù)列中每個位置的數(shù)值。讓我們更深入地理解它與動態(tài)規(guī)劃思想的關(guān)聯(lián):文章來源地址http://www.zghlxwxcb.cn/news/detail-852633.html

到了這里,關(guān)于解鎖動態(tài)規(guī)劃:從斐波那契到高效算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 動態(tài)規(guī)劃02-斐波那契類型二

    給你一個整數(shù)數(shù)組 cost ,其中 cost[i] 是從樓梯第 i 個臺階向上爬需要支付的費用。一旦你支付此費用,即可選擇向上爬一個或者兩個臺階。 你可以選擇從下標(biāo)為 0 或下標(biāo)為 1 的臺階開始爬樓梯。 請你計算并返回達(dá)到樓梯頂部的最低花費。 真題點擊此處:746.使用最小花費爬樓

    2024年01月16日
    瀏覽(15)
  • 動態(tài)規(guī)劃01-斐波那契類型一

    斐波那契數(shù) (通常用 F(n) 表示)形成的序列稱為 斐波那契數(shù)列 。該數(shù)列由 0 和 1 開始,后面的每一項數(shù)字都是前面兩項數(shù)字的和。也就是: F(0) = 0,F(xiàn)(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n 1 給定 n ,請計算 F(n) 。 真題點擊此處:509.斐波那契數(shù) 解題方法:動態(tài)規(guī)劃 思路:斐波

    2024年02月04日
    瀏覽(17)
  • 【算法學(xué)習(xí)】斐波那契數(shù)列模型-動態(tài)規(guī)劃

    【算法學(xué)習(xí)】斐波那契數(shù)列模型-動態(tài)規(guī)劃

    ? ? ? ? 我在算法學(xué)習(xí)過程中,針對斐波那契數(shù)列模型的動態(tài)規(guī)劃的例題進(jìn)行了一個整理,并且根據(jù)標(biāo)準(zhǔn)且可靠一點的動態(tài)規(guī)劃解題思路進(jìn)行求解類似的動歸問題,來達(dá)到學(xué)習(xí)和今后復(fù)習(xí)的必要。 ? ? ? ? 所謂的斐波那契數(shù)列模型,即當(dāng)前狀態(tài)的值等于前兩種狀態(tài)的值之和。

    2024年02月04日
    瀏覽(27)
  • 算法:動態(tài)規(guī)劃---斐波那契和最短路徑

    算法:動態(tài)規(guī)劃---斐波那契和最短路徑

    從本篇開始總結(jié)的是動態(tài)規(guī)劃的一些內(nèi)容,動態(tài)規(guī)劃是算法中非常重要的一個版塊,因此也是學(xué)習(xí)算法中的一個重點,在學(xué)習(xí)動態(tài)規(guī)劃前應(yīng)當(dāng)要把動態(tài)規(guī)劃的基礎(chǔ)知識學(xué)習(xí)一下 動態(tài)規(guī)劃既然是一個新的算法,這個名字也是新名字,那么就要首先明確這個算法的名字代表什么含

    2024年01月25日
    瀏覽(23)
  • 動態(tài)規(guī)劃之 509斐波那契數(shù)(第1道)

    動態(tài)規(guī)劃之 509斐波那契數(shù)(第1道)

    題目: 斐波那契數(shù)?(通常用? 表示)形成的序列稱為 斐波那契數(shù)列 。該數(shù)列由?0 和 1 開始,后面的每一項數(shù)字都是前面兩項數(shù)字的和。也就是: , ,其中 n 1 給定?n ,請計算 。 題目鏈接:509. 斐波那契數(shù) - 力扣(LeetCode) 示例: 解法:

    2024年02月12日
    瀏覽(24)
  • 【動態(tài)規(guī)劃專欄】專題一:斐波那契數(shù)列模型--------1.第N個泰波那契數(shù)

    【動態(tài)規(guī)劃專欄】專題一:斐波那契數(shù)列模型--------1.第N個泰波那契數(shù)

    本專欄內(nèi)容為:算法學(xué)習(xí)專欄,分為優(yōu)選算法專欄,貪心算法專欄,動態(tài)規(guī)劃專欄以及遞歸,搜索與回溯算法專欄四部分。 通過本專欄的深入學(xué)習(xí),你可以了解并掌握算法。 ??博主csdn個人主頁:小小unicorn ?專欄分類:動態(tài)規(guī)劃專欄 ??代碼倉庫:小小unicorn的代碼倉庫??

    2024年02月21日
    瀏覽(23)
  • C++算法 —— 動態(tài)規(guī)劃(1)斐波那契數(shù)列模型

    C++算法 —— 動態(tài)規(guī)劃(1)斐波那契數(shù)列模型

    每一種算法都最好看完第一篇再去找要看的博客,因為這樣會幫你梳理好思路,看接下來的博客也就更輕松了。當(dāng)然,我也會盡量在寫每一篇時都可以讓不懂這個算法的人也能邊看邊理解。 動規(guī)的思路有五個步驟,且最好畫圖來理解細(xì)節(jié),不要怕麻煩。當(dāng)你開始畫圖,仔細(xì)閱

    2024年02月10日
    瀏覽(23)
  • 【算法優(yōu)選】 動態(tài)規(guī)劃之斐波那契數(shù)列模型

    動態(tài)規(guī)劃相關(guān)題目都可以參考以下五個步驟進(jìn)行解答: 狀態(tài)表? 狀態(tài)轉(zhuǎn)移?程 初始化 填表順序 返回值 后面題的解答思路也將按照這五個步驟進(jìn)行講解。 泰波那契序列 Tn 定義如下: T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的條件下 Tn+3 = Tn + Tn+1 + Tn+2 給你整數(shù) n,請返回第 n 個泰波那契

    2024年02月05日
    瀏覽(25)
  • 動態(tài)規(guī)劃入門:斐波那契數(shù)列模型以及多狀態(tài)(C++)

    動態(tài)規(guī)劃入門:斐波那契數(shù)列模型以及多狀態(tài)(C++)

    ????動態(tài)規(guī)劃(Dynamic programming,簡稱 DP)是一種解決多階段決策問題的算法思想。它將問題分解為多個階段,并通過保存中間結(jié)果來避免重復(fù)計算,從而提高效率。 動態(tài)規(guī)劃的解題步驟一般分為以下幾步: 思考狀態(tài)表示,創(chuàng)建dp表(重點) 分析出狀態(tài)轉(zhuǎn)移方程(重點) 初始化 確定

    2024年02月11日
    瀏覽(25)
  • 動態(tài)規(guī)劃入門篇——斐波那契數(shù)列與爬樓梯問題

    ? ? ? ?動態(tài)規(guī)劃(Dynamic Programming,簡稱DP)是運籌學(xué)的一個分支,也是求解多階段決策過程最優(yōu)化問題的一種方法。它主要用來解決一類最優(yōu)化問題,通過將復(fù)雜問題分解成若干個子問題,并綜合子問題的最優(yōu)解來得到原問題的最優(yōu)解。動態(tài)規(guī)劃的核心在于對問題的狀態(tài)進(jìn)

    2024年03月14日
    瀏覽(39)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包