c#字符相似度对比通用类
生活随笔
收集整理的這篇文章主要介紹了
c#字符相似度对比通用类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本類適用于比較2個字符的相似度,代碼如下:
View Code 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; // 對比使用時間?
?
總結
以上是生活随笔為你收集整理的c#字符相似度对比通用类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE中使用递归查询
- 下一篇: c# char unsigned_dll