演算法——動態規劃演算法求解字串的編輯距離
當有人讓你用遞迴演算法求解斐波那契數列以及字串的編輯距離時,所設的陷阱都是一致的(遞迴呼叫時的重複計算),解決方案也是一致的(引入備忘錄概念)。觀察樹形的層級呼叫關係,我們可以發現動態規劃隱式地嵌入了一種剪枝機制。
動態規劃版求解菲波那切數列
關於樸素遞迴求解菲波那切數列存在的重複計算的說明:
紅色部分均是重複計算項,當遞迴呼叫的層次更多時,重複計算的問題更為嚴重。
unsigned __int64 memo[1000];
unsigned __int64 fib(size_t n)
{
if (n<=1)
return n;
if (memo[n])
return memo[n];
return memo[n] = fib(n-1) + fib(n-2);
// 賦值運算(=)的也存在返回值,返回值是`=`號左側的值
// 對於第一次計算得到的值進行記錄備份,
// 下次如果想得到該值,先進性判斷是否已經計算過了
// 如果是,直接返回,見第二個if
}
動態規劃版求解字串編輯距離
我們來看樸素遞迴來求解字串編輯距離時可能出現的重複計算的問題(5, 5:表示的是,源字串和目標字串各自的長度為5):
現在我們應用動態規劃的思想對樸素遞迴演算法進行改造,所謂動態規劃,其核心有二:
狀態的概念
為遞迴介面增加狀態標識引數
i i和j j:int editDist(char* src, char* dst);
改造為(引入狀態的概念):
int editDist(char* src, char* dst, int i, int j);
備忘錄概念
通過定義相關的結構體實現
typedef struct tagMemoRecord { int dist; int refCount; }MEMO_RECORD; // 作為全域性變數 vector<vector<MEMO_RECORD>> memo(100, vector<MEMO_RECORD>(100));
int editDist(char* src, char* dst, int i, int j)
{
if (memo[i][j].refCount)
{
++memo[i][j].refCount;
return memo[i][j].dist;
}
int dist = 0;
if (strlen(src+i) == 0)
{
dist = strlen(dst+j);
}
else if(strlen(dst+j) == 0)
{
dist = strlen(src+i);
}
else
{
if (src[i] == dst[j])
{
dist = editDist(src, dst, i+1, j+1);
}
else
{
int editIns = editDist(src, dst, i, j+1) + 1;
int editDel = editDist(src, dst, i+1, j) + 1;
int editRep = editDist(src, dst, i+1, j+1) + 1;
dist = std::min({editIns, editDel, editRep});
}
}
memo[i][j].refCount = 1;
return memo[i][j].dist = dist;
}
相關文章
- 怎樣衡量兩個字串的相似度(編輯距離動態規劃求解)字串動態規劃
- 動態規劃-編輯距離動態規劃
- 演算法:編輯距離問題(動態規劃,詳細解答)演算法動態規劃
- Leetcode 編輯距離(動態規劃)LeetCode動態規劃
- 編輯距離及編輯距離演算法演算法
- 【動態規劃】字串最小編輯距離Java實現動態規劃字串Java
- 編輯距離演算法演算法
- 最短編輯距離演算法演算法
- 字串相似度演算法(編輯距離演算法 Levenshtein Distance)(轉)字串演算法
- 【演算法】動態規劃-優化編輯器問題演算法動態規劃優化
- 計算字串編輯距離字串
- Levenshtein:計算字串的編輯距離字串
- 字串編輯距離問題詳解字串
- 動態規劃演算法動態規劃演算法
- 演算法_動態規劃演算法動態規劃
- 演算法-動態規劃演算法動態規劃
- 前端演算法 - 動態規劃前端演算法動態規劃
- 動態規劃演算法(轉)動態規劃演算法
- Hetao P2071 打字遊戲 題解 [ 綠 ] [ 最小生成樹 ] [ 動態規劃 ] [ 編輯距離 ]遊戲動態規劃
- 演算法系列-動態規劃(1):初識動態規劃演算法動態規劃
- 【DP】編輯距離
- 【每日演算法】動態規劃四演算法動態規劃
- 初級演算法-動態規劃演算法動態規劃
- Python演算法:動態規劃Python演算法動態規劃
- 演算法---貪心演算法和動態規劃演算法動態規劃
- “最長公共字串子序列”問題的動態規劃法演算法字串動態規劃演算法
- 資料對齊-編輯距離演算法詳解(Levenshtein distance)演算法
- 演算法(七):圖解動態規劃演算法圖解動態規劃
- 演算法之動態規劃總結演算法動態規劃
- Java 演算法-最大矩形(動態規劃)Java演算法動態規劃
- 演算法-動態規劃-完全揹包演算法動態規劃
- 演算法提高 數的劃分 動態規劃 無序演算法動態規劃
- 動態規劃演算法——裝最多水的容器動態規劃演算法
- “插花問題”的動態規劃法演算法動態規劃演算法
- 插花問題的“動態規劃法”演算法動態規劃演算法
- 線性dp:編輯距離
- 動態規劃之最長公共子序列求解動態規劃
- 演算法筆記之動態規劃(4)演算法筆記動態規劃