字串的相似度計算

2021-06-26 13:31:10 字數 2264 閱讀 8529



一、基於編輯距離的字串相似度計算

**:兩個字串之間的相似度可以用編輯距離來定義。所謂編輯,指的是,對字串中的任一字元進行插入刪除替換這三種操作。經過一定步驟的編輯,乙個字串可以變換為另乙個字串,那麼最少的編輯步數稱為兩個字串的編輯距離。

這是乙個遞迴或動態規劃的問題。比如長度分別為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...