? ? 1初識動態規劃
? ? ? ? 這節課的內容不涉及動態規劃的理論,而是通過兩個例子:0-1背包問題、0-1背包問題升級版,展示了動態規劃是如何解決問題的。這兩個例子都是非常經典的動態規劃問題,只要真正搞懂它們,基本上動態規劃已經入門一半了。
? ? ? ? 從例子中我們可以發現,大部分動態規劃能解決的問題,都可以通過回溯法來解決,只不過回溯算法解決起來效率比較低,時間復雜度是指數級的。動態規劃算法,在執行效率方面,要高很多。盡管執行效率提高了,但是動態規劃的空間復雜度也提高了,所以很多時候,我們會說動態規劃是一種空間換時間的算法思想。
? ? 2動態規劃理論
? ? ? ? 什么樣的問題適合用動態規劃解決呢?這些問題可以總結概括為“一個模型三個特征”。其中,“一個模型”指的是,問題可以抽象成分階段決策最優解模型。“三個特征”指的是最優子節、無后效性和重復性子問題。
? ? ? ? 動態規劃的解題思路有兩種,分別是狀態轉移表法和狀態轉移方程法。其中,狀態轉移表法解題思路大致可以概括為,回溯算法實現-定義狀態-畫遞歸樹-找重復子問題-畫狀態轉移表-根據遞推關系填表-將填表過程翻譯成代碼。狀態轉移方程法的大致思路可以概括為,找最優子結構-寫狀態轉移方程-將狀態轉移方程翻譯成代碼。
? ? ? ? 對比之前講過的四種算法思想,貪心、回溯、動態規劃可以解決的問題模型類似,都可以抽象成多階段決策最優解模型。盡管分治算法也能解決最優問題,但是大部分問題的背景都不適合抽象成多階段決策模型。
? ? 3動態規劃實戰
? ? ? ? 這節課講了一個例子:如何實現搜索引擎中的拼寫糾錯功能。
? ? ? ? 我們引入了編輯距離這個概念,它用來量化兩個字符串的相似度,從而進行最合適的糾錯提示。編輯距離有多種不同的計算方式,比較著名的有萊文斯坦距離和最長公共子串長度。
? ? ? ? 當然,真正用于商用的的搜索引擎,拼寫糾錯功能沒有我們例子中講的那么簡單,它有很多種優化思路。