這篇我們看看最長公共子串行的另乙個版本,求字串相似度(編輯距離),我也說過了,這是乙個非常實用的演算法,在dna對比,網
頁聚類等方面都有用武之地。
一:概念
對於兩個字串a和b,通過基本的增刪改將字串a改成b,或者將b改成a,在改變的過程中我們使用的最少步驟稱之為「編輯距離」。
二:解析
可能大家覺得有點複雜,不好理解,我們試著把這個大問題拆分掉,將"字串 vs 字串「,分解成」字元 vs 字串「,再分解
成」字元 vs 字元「。
<1> 」字元「vs」字元「
這種情況是最簡單的了,比如」a「與」b「的編輯距離很顯然是1。
<2> 」字元」vs"字串"
」a「改成」ab「的編輯距離為1,「a」與「aba」的編輯距離為2。
<3>「字串」vs「字串」
「aba」和「bba」的編輯距離為1,仔細發現我們可以得出如下結論,」aba「是由23個子序列與」bba「字串求的的編輯距離集
子串行」a「和」bba「與」b「和」bba「之間的編輯距離中選出乙個最小值,然而序列a和序列b早之前我已經計算過了,這種重複計算
的問題有點像」斐波那契」,正好滿足「動態規劃」中的最優子結構和重疊子問題,所以我們決定採用動態規劃來解決。
三:公式
跟「最長公共子串行」一樣,我們採用乙個二維陣列來儲存字串x和y當前的位置的最小編輯距離。
現有兩個序列x=,y=,
設乙個c[i,j]: 儲存xi與yj的當前最小的ld。
①: 當 xi = yi 時,則c[i,j]=c[i-1,j-1];
②:當 xi != yi 時, 則c[i,j]=min;
最終我們的c[i,j]一直儲存著最小的ld。
四:**
1 using system;2 4 和 的編輯距離為:\n", str1, str2, ld());
24 }
25 }
26 27 /// 28 /// 計算字串的編輯距離
29 ///
30 ///
31 public static int ld()
32
38 39 for (int j = 0; j <= str2.length; j++)
40
43 44 //矩陣的 x 座標
45 for (int i = 1; i <= str1.length; i++)
46
55 else
56
65 }
66 }
67 68 //返回字串的編輯距離
字串相似度
這個演算法 於網上,但忘記了出處,對其使使用了 issame封裝,然後用在了自己的網頁資料抓取 中。求解兩個字串的相似度int calculatestringdistance const string stra,const string strb intret c lena 1 lenb 1 for...
字串相似度
最近要對字串進行聚類,這些字串都是 的輸出,嘗試了幾種字串相似度度量的方法 levenshtein距離 字串核函式 lcs max len str1,str2 其中相似度用公式distance 1.0 similarity 1轉換為距離.使用層次聚類方法.下面是要聚類的字串 points aabbc...
字串相似度
最近在做演算法作業,需要比較兩個字串的相似度,並且返回相同的元素所佔的百分比。如果讓我自己做的話,思路是把兩個字串分別轉化為列表,然後在列表中解決掉。python view plain copy new i fori,j inzip a,b ifi j ratio 2.0 len new len a...