日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#字符相似度对比通用类

發布時間:2025/3/11 C# 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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#字符相似度对比通用类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。