本類適用于比較2個字符的相似度,代碼如下:
using System;using System.Collections.Generic;using System.Text;public class StringCompute{  #region 私有變量  /// <summary>  /// 字符串1  /// </summary>  private char[] _ArrChar1;  /// <summary>  /// 字符串2  /// </summary>  private char[] _ArrChar2;  /// <summary>  /// 統計結果  /// </summary>  private Result _Result;  /// <summary>  /// 開始時間  /// </summary>  private DateTime _BeginTime;  /// <summary>  /// 結束時間  /// </summary>  private DateTime _EndTime;  /// <summary>  /// 計算次數  /// </summary>  private int _ComputeTimes;  /// <summary>  /// 算法矩陣  /// </summary>  private int[,] _Matrix;  /// <summary>  /// 矩陣列數  /// </summary>  private int _Column;  /// <summary>  /// 矩陣行數  /// </summary>  private int _Row;  #endregion  #region 屬性  public Result ComputeResult  {    get { return _Result; }  }  #endregion  #region 構造函數  public StringCompute(string str1, string str2)  {    this.StringComputeInit(str1, str2);  }  public StringCompute()  {  }  #endregion  #region 算法實現  /// <summary>  /// 初始化算法基本信息  /// </summary>  /// <param name="str1">字符串1</param>  /// <param name="str2">字符串2</param>  private void StringComputeInit(string str1, string str2)  {    _ArrChar1 = str1.ToCharArray();    _ArrChar2 = str2.ToCharArray();    _Result = new Result();    _ComputeTimes = 0;    _Row = _ArrChar1.Length + 1;    _Column = _ArrChar2.Length + 1;    _Matrix = new int[_Row, _Column];  }  /// <summary>  /// 計算相似度  /// </summary>  public void Compute()  {    //開始時間    _BeginTime = DateTime.Now;    //初始化矩陣的第一行和第一列    this.InitMatrix();    int intCost = 0;    for (int i = 1; i < _Row; i++)    {      for (int j = 1; j < _Column; j++)      {        if (_ArrChar1[i - 1] == _ArrChar2[j - 1])        {          intCost = 0;        }        else        {          intCost = 1;        }        //關鍵步驟,計算當前位置值為左邊+1、上面+1、左上角+intCost中的最小值         //循環遍歷到最后_Matrix[_Row - 1, _Column - 1]即為兩個字符串的距離        _Matrix[i, j] = this.Minimum(_Matrix[i - 1, j] + 1, _Matrix[i, j - 1] + 1, _Matrix[i - 1, j - 1] + intCost);        _ComputeTimes++;      }    }    //結束時間    _EndTime = DateTime.Now;    //相似率 移動次數小于最長的字符串長度的20%算同一題    int intLength = _Row > _Column ? _Row : _Column;    _Result.Rate = (1 - (decimal)_Matrix[_Row - 1, _Column - 1] / intLength);    _Result.UseTime = (_EndTime - _BeginTime).ToString();    _Result.ComputeTimes = _ComputeTimes.ToString();    _Result.Difference = _Matrix[_Row - 1, _Column - 1];  }  /// <summary>  /// 計算相似度(不記錄比較時間)  /// </summary>  public void SpeedyCompute()  {    //開始時間    //_BeginTime = DateTime.Now;    //初始化矩陣的第一行和第一列    this.InitMatrix();    int intCost = 0;    for (int i = 1; i < _Row; i++)    {      for (int j = 1; j < _Column; j++)      {        if (_ArrChar1[i - 1] == _ArrChar2[j - 1])        {          intCost = 0;        }        else        {          intCost = 1;        }        //關鍵步驟,計算當前位置值為左邊+1、上面+1、左上角+intCost中的最小值         //循環遍歷到最后_Matrix[_Row - 1, _Column - 1]即為兩個字符串的距離        _Matrix[i, j] = this.Minimum(_Matrix[i - 1, j] + 1, _Matrix[i, j - 1] + 1, _Matrix[i - 1, j - 1] + intCost);        _ComputeTimes++;      }    }    //結束時間    //_EndTime = DateTime.Now;    //相似率 移動次數小于最長的字符串長度的20%算同一題    int intLength = _Row > _Column ? _Row : _Column;    _Result.Rate = (1 - (decimal)_Matrix[_Row - 1, _Column - 1] / intLength);    // _Result.UseTime = (_EndTime - _BeginTime).ToString();    _Result.ComputeTimes = _ComputeTimes.ToString();    _Result.Difference = _Matrix[_Row - 1, _Column - 1];  }  /// <summary>  /// 計算相似度  /// </summary>  /// <param name="str1">字符串1</param>  /// <param name="str2">字符串2</param>  public void Compute(string str1, string str2)  {    this.StringComputeInit(str1, str2);    this.Compute();  }  /// <summary>  /// 計算相似度  /// </summary>  /// <param name="str1">字符串1</param>  /// <param name="str2">字符串2</param>  public void SpeedyCompute(string str1, string str2)  {    this.StringComputeInit(str1, str2);    this.SpeedyCompute();  }  /// <summary>  /// 初始化矩陣的第一行和第一列  /// </summary>  private void InitMatrix()  {    for (int i = 0; i < _Column; i++)    {      _Matrix[0, i] = i;    }    for (int i = 0; i < _Row; i++)    {      _Matrix[i, 0] = i;    }  }  /// <summary>  /// 取三個數中的最小值  /// </summary>  /// <param name="First"></param>  /// <param name="Second"></param>  /// <param name="Third"></param>  /// <returns></returns>  private int Minimum(int First, int Second, int Third)  {    int intMin = First;    if (Second < intMin)    {      intMin = Second;    }    if (Third < intMin)    {      intMin = Third;    }    return intMin;  }  #endregion}/// <summary>/// 計算結果/// </summary>public struct Result{  /// <summary>  /// 相似度  /// </summary>  public decimal Rate;  /// <summary>  /// 對比次數  /// </summary>  public string ComputeTimes;  /// <summary>  /// 使用時間  /// </summary>  public string UseTime;  /// <summary>  /// 差異  /// </summary>  public int Difference;}調用方法:
// 方式一StringCompute stringcompute1 = new StringCompute();stringcompute1.SpeedyCompute("對比字符一", "對比字符二");  // 計算相似度, 不記錄比較時間decimal rate = stringcompute1.ComputeResult.Rate;     // 相似度百分之幾,完全匹配相似度為1// 方式二StringCompute stringcompute2 = new StringCompute();stringcompute2.Compute();                 // 計算相似度, 記錄比較時間string usetime = stringcompute2.ComputeResult.UseTime;   // 對比使用時間新聞熱點
疑難解答