mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-20 07:21:02 +00:00
Fix multilingual content typos (#1958)
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
- 動態規劃也對問題進行遞迴分解,但與分治演算法的主要區別是,動態規劃中的子問題是相互依賴的,在分解過程中會出現許多重疊子問題。
|
||||
- 回溯演算法在嘗試和回退中窮舉所有可能的解,並透過剪枝避免不必要的搜尋分支。原問題的解由一系列決策步驟構成,我們可以將每個決策步驟之前的子序列看作一個子問題。
|
||||
|
||||
實際上,動態規劃常用來求解最最佳化問題,它們不僅包含重疊子問題,還具有另外兩大特性:最優子結構、無後效性。
|
||||
實際上,動態規劃常用來求解最佳化問題,它們不僅包含重疊子問題,還具有另外兩大特性:最優子結構、無後效性。
|
||||
|
||||
## 最優子結構
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
在此基礎上,動態規劃問題還有一些判斷的“加分項”。
|
||||
|
||||
- 問題包含最大(小)或最多(少)等最最佳化描述。
|
||||
- 問題包含最大(小)或最多(少)等最佳化描述。
|
||||
- 問題的狀態能夠使用一個串列、多維矩陣或樹來表示,並且一個狀態與其周圍的狀態存在遞推關係。
|
||||
|
||||
相應地,也存在一些“減分項”。
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
狀態 $[i, j]$ 對應的子問題:**將 $s$ 的前 $i$ 個字元更改為 $t$ 的前 $j$ 個字元所需的最少編輯步數**。
|
||||
|
||||
至此,得到一個尺寸為 $(i+1) \times (j+1)$ 的二維 $dp$ 表。
|
||||
至此,得到一個尺寸為 $(n+1) \times (m+1)$ 的二維 $dp$ 表。
|
||||
|
||||
**第二步:找出最優子結構,進而推導出狀態轉移方程**
|
||||
|
||||
|
||||
@@ -134,7 +134,7 @@ $$
|
||||
|
||||
### 空間最佳化
|
||||
|
||||
由於每個狀態都只與其上一行的狀態有關,因此我們可以使用兩個陣列滾動前進,將空間複雜度從 $O(n^2)$ 降至 $O(n)$ 。
|
||||
由於每個狀態都只與其上一行的狀態有關,因此我們可以使用兩個陣列滾動前進,將空間複雜度從 $O(n \times cap)$ 降至 $O(cap)$ 。
|
||||
|
||||
進一步思考,我們能否僅用一個陣列實現空間最佳化呢?觀察可知,每個狀態都是由正上方或左上方的格子轉移過來的。假設只有一個陣列,當開始走訪第 $i$ 行時,該陣列儲存的仍然是第 $i-1$ 行的狀態。
|
||||
|
||||
|
||||
@@ -21,5 +21,5 @@
|
||||
**編輯距離問題**
|
||||
|
||||
- 編輯距離(Levenshtein 距離)用於衡量兩個字串之間的相似度,其定義為從一個字串到另一個字串的最少編輯步數,編輯操作包括新增、刪除、替換。
|
||||
- 編輯距離問題的狀態定義為將 $s$ 的前 $i$ 個字元更改為 $t$ 的前 $j$ 個字元所需的最少編輯步數。當 $s[i] \ne t[j]$ 時,具有三種決策:新增、刪除、替換,它們都有相應的剩餘子問題。據此便可以找出最優子結構與構建狀態轉移方程。而當 $s[i] = t[j]$ 時,無須編輯當前字元。
|
||||
- 編輯距離問題的狀態定義為將 $s$ 的前 $i$ 個字元更改為 $t$ 的前 $j$ 個字元所需的最少編輯步數。當 $s[i-1] \ne t[j-1]$ 時,具有三種決策:新增、刪除、替換,它們都有相應的剩餘子問題。據此便可以找出最優子結構與構建狀態轉移方程。而當 $s[i-1] = t[j-1]$ 時,無須編輯當前字元。
|
||||
- 在編輯距離中,狀態依賴其正上方、正左方、左上方的狀態,因此空間最佳化後正序或倒序走訪都無法正確地進行狀態轉移。為此,我們利用一個變數暫存左上方狀態,從而轉化到與完全背包問題等價的情況,可以在空間最佳化後進行正序走訪。
|
||||
|
||||
Reference in New Issue
Block a user