程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#盤算字符串類似性的辦法

C#盤算字符串類似性的辦法

編輯:C#入門知識

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#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved