序列比對(25)編輯距離
- 2019 年 10 月 4 日
- 筆記
本文介紹兩個字元串的編輯距離並給出程式碼。
編輯距離

編輯距離的求解過程和全局比對是十分相似的(關於全局比對,可以參見前文《序列比對(一)全局比對Needleman-Wunsch演算法》),都需要全部符號參與比對,都允許插入、缺失和錯配。所以,編輯距離可以用動態規劃演算法求解,其迭代公式是:

效果如下:

編輯距離與最長公共子序列
在只允許插入和缺失而不允許錯配的情況下,兩個字元串的編輯距離可以通過最長公共子序列的長度(關於最長公共子序列,可以參看前文《序列比對(24)最長公共子序列》)間接算出來。

解編輯距離的程式碼
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSEQ 1000 #define GAP_CHAR '-' #define min(a, b) ((a) < (b) ? (a) : (b)) #define diff(a, b) ((a) == (b) ? 0 : 1) struct Unit { int W1; // 是否往上回溯一格 int W2; // 是否往左上回溯一格 int W3; // 是否往左回溯一格 int M; // 得分矩陣第(i, j)這個單元的分值,即序列s(1,...,i)與序列r(1,...,j)比對的最低得分 }; typedef struct Unit *pUnit; void strUpper(char *s); void printAlign(pUnit** a, const int i, const int j, char* s, char* r, char* saln, char* raln, int n); void align(char *s, char *r); int main() { char s[MAXSEQ]; char r[MAXSEQ]; printf("The 1st seq: "); scanf("%s", s); printf("The 2nd seq: "); scanf("%s", r); align(s, r); return 0; } void strUpper(char *s) { while (*s != '