国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#實現的字符串相似度對比類

2020-01-24 01:39:04
字體:
來源:轉載
供稿:網友

本類適用于比較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;   // 對比使用時間


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临朐县| 阳高县| 广德县| 玛纳斯县| 新蔡县| 民勤县| 那曲县| 独山县| 宁明县| 启东市| 库车县| 新泰市| 老河口市| 石楼县| 栾川县| 柘荣县| 滨州市| 铜鼓县| 内丘县| 深泽县| 阳原县| 宁河县| 珲春市| 湘乡市| 宁津县| 甘德县| 滦平县| 合江县| 英德市| 周宁县| 渝北区| 石景山区| 浦北县| 和政县| 双峰县| 阳江市| 浏阳市| 屏东县| 天长市| 嘉黎县| 南投市|