C#盤算字符串類似性的辦法。本站提示廣大學習愛好者:(C#盤算字符串類似性的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#盤算字符串類似性的辦法正文
本文實例講述了C#盤算字符串類似性的辦法。分享給年夜家供年夜家參考。詳細以下:
盤算字符串類似性的方法許多,乃至最笨的方法可以挨個婚配,這裡要講的是應用萊文史特間隔來盤算字符串類似性。
萊文史特間隔概念:假定函數名是LD
用於盤算兩個字符串之間的類似度。 比方有兩個字符串A和B。假定以A為基准,那末該算法就是盤算把B經由過程(調換、刪除、加字符)等辦法釀成A須要若干步。
例如:
A=”abcd”, B=”abc”, 那末 LD(A,B)=1,只需在B字符串中拔出一個字符那末就完整等於A
A=”abcd”, B=”abcd”, 那末 LD(A,B)= ,由於這兩個貨完整雷同
A=”abcd”, B=”abdc”, 那末 LD(A,B)= 1,由於只需把B中”dc”交換地位就等於A了。
A=”fwegwegweg@#2″, B=”ddd*&&%^&”, 那末 LD(A,B)= ????,這個叔真不曉得了,要用法式算了。
萊文史特間隔盤算出來的值越年夜代表步調越多,解釋兩個字符串的類似水平越低。
比方年夜家要做個簡略單純的“文章剽竊”剖斷功效,那末用這個萊文史特間隔完整可以完成個初步辦法。
算法正文:
1、假定字符串str1的長度為 n,str2 的長度為 m。
假如 n = 0,則前往 m並加入;(這是句空話)
2、假如 m=0,則前往 n 並加入。(這仍然是句空話)
3、假如上述都不是則要開端停止盤算,
構建一個數組 d[0..m, 0..n]。
將第0行初始化為 0..n,第0列初始化為0..m。
順次檢討 str1 的每一個字母(i=1..n)。
順次檢討 str2 的每一個字母(j=1..m)。
假如 str1[i]=str2[j],則 sign=0;(sign僅僅是個標志,沒有任何意思,為了記載相等照樣不相等)
假如 str1[i]!=str12[j],則 sign=1。
將 d[i,j] 設置為以下三個值中的最小值:
緊鄰以後格上方的格的值加一,即 d[i-1,j]+1
緊鄰以後格左方的格的值加一,即 d[i,j-1]+1
以後格左上方的格的值加sign,即 d[i-1,j-1]+sign
反復上述幾步直到輪回停止。d[n,m]既為終究的值
接上去是用c#寫的一款萊文史特間隔的完成。
public class LDMaker//弄成一個類看起來專業, //現實上就是脫褲子放屁,這裡應用來文史特間隔算法 //用於盤算字符串之間的類似性 { char[] str1; char[] str2; public LDMaker(string s1, string s2) { //調換失落 一切 數字 為固定命字 數字攪擾 太嚴重 //這裡因人而異,在中文文章的婚配中,數字是攪擾很嚴重 //的,所以我在某些運用中把數字調換失落了。 //緣由是有的文章之間現實上類似性很高,然則有意在外面加一些數字 //攪擾該函數的履行,讓機械看出來兩篇文章很分歧。普通不須要做以下 // 步調 s1=System.Text.RegularExpressions.Regex.WordStr(s1,@"(\d+)","1"); s2 = System.Text.RegularExpressions.Regex.WordStr(s2, @"(\d+)", "1"); str1 = s1.ToCharArray(); str2 = s2.ToCharArray(); } public int GetLD()//這是萊文史特間隔的算法完成 { try { int m=str1.Length; int n=str2.Length; int[,] d = new int[m+1, n+1]; for (int i = 0; i <= m ; i++) d[i, 0] = i; for (int i = 0; i <= n ; i++) d[0, i] = i; for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { d[i,j] = d[i - 1,j - 1] + (str1[i - 1] == str2[j - 1] ? 0 : 1); //修正一個字符 d[i,j] = Math.Min(d[i,j], d[i - 1,j] + 1); // 拔出一個字符串 d[i,j] = Math.Min(d[i,j], d[i,j - 1] + 1); //刪除一個字符 } } return d[m, n]; } catch(//失足前往一個很年夜值 { return 10000; } } }
願望本文所述對年夜家的C#法式設計有所贊助。