一、基於編輯距離的字串相似度計算
**:兩個字串之間的相似度可以用編輯距離來定義。所謂編輯,指的是,對字串中的任一字元進行插入,刪除和替換這三種操作。經過一定步驟的編輯,乙個字串可以變換為另乙個字串,那麼最少的編輯步數稱為兩個字串的編輯距離。
這是乙個遞迴或動態規劃的問題。比如長度分別為m,n的字串str1和str2,其編輯距離為d(m,n), 則顯然有
d(m,n) = min((str1[m]==str2[n])?d(m-1,n-1):d(m-1,n-1)+1,
d(m,n-1)+1,
d(m-1,n)+1)
其意思是,編輯距離只與三種情況有關。假設將str1轉化為str2:
第一種情況,讓str1的前m-1個字元和str2的前n-1個字元進行轉化,str1最後乙個字元替換成str2最後乙個字元。這樣
(str1[m]==str2[n])?d(m-1,n-1):d(m-1,n-1)+1這一句就好理解了。即兩字串最後乙個字元相等的話,就用不著替換,否則就要替換。
第二種情況,將str1轉化為str2的前n-1個字元,然後插入str2最後乙個字元,變成str2。其編輯步驟數顯然是d(m,n-1)+1。
第三種情況,和第二種情況類似,將str1的前m-1個字元轉化為str2,然後刪除str1最後乙個字元。
這三種情況各得到乙個編輯步驟數,取其最小值即可。
這樣,我們得到乙個遞迴式。其初始條件是
d(0,k)=k, 1<=k<=n
d(k,0)=k, 1<=k<=m
初始條件也是顯然的,0個字元轉化為任何字串只有一直插入的份。
因此,我們就可以據此遞推式構造乙個動態規劃過程,假設兩個字串分別為"china"和"unix",則ch
ina012345
u1123
45n22
233
4i33
32
34x
4443
34
圖中黑色加粗部分是初始值,而紅色部分是一條可能的路徑。若將"china"變成"unix",則可能的步驟是
c->u, h->n, delete n, a->x
程式設計實現時,可以直接在乙個矩陣中進行。但為節約空間,也可以只用兩個陣列,每次更新一行。但要注意,較長的字串要置於水平方向。
#include#includeusing namespace std;
int min(int x,int y, int z)
int stringdistance(const char* str1, const char* str2)else
int *dist1 = new int[longlen+1];
int *newdist = new int[longlen+1];
for(int i=1;i<=longlen;i++)
dist1[0] = 0;
for(int j=0;j<=longlen;j++)
cout << endl;
for(int i=1;i<=shortlen; i++)
cout << endl;
memcpy(dist1, newdist, sizeof(int)*(longlen+1));
}int result = dist1[longlen];
delete dist1;
delete newdist;
return result;
}int main(int argc, char* argv)
cout << "edit distance is: " << stringdistance(argv[1],argv[2]) << endl;
return 0;
}
二、**《基於編輯距離的字串相似連線的研究》
三、**《ed-ejoin一種優化的字串相似連線演算法》
計算字串的相似度
程式設計之美223頁的題目。如果他們的第乙個字元相同,那麼計算接下來的字串的距離。如果他們的第乙個字元不同,那麼 1 刪除a的第乙個字元,計算a接下來的字串和b的距離 2 刪除b的第乙個字元,計算b接下來的字串和a的距離 3 修改a的第乙個字元為b的第乙個字元,計算a接下來的字串和b接下來的字串距離...
計算字串的相似度
程式設計之美 3.3節 計算字串的相似度 問題 對於給定的兩個字串,用最少的操作 插入 刪除和替換,使得兩個字串相同。找出這個最少需要操作的步數。解法 1 一步操作後,再將a 2 end 和b 2 end 程式設計相同的字串 2 一步操作後,再將a 1 end 和b 2 end 程式設計相同的字串 ...
Matlab計算字串相似度
執行環境 matlab 單純的計算字串的相似度,並沒有計算詞性,如tf idf之類的 如下 計算字串相似度 乙個source字串通過插入 刪除 替換而變成target字串的操作次數越少,則兩個字串越相近。function strsim mystrsim target,source x為字串 len1...