C#实现的字符串相似度对比类
本类适用于比较2个字符的相似度,代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
publicclassStringCompute
{
#region私有变量
///<summary>
///字符串1
///</summary>
privatechar[]_ArrChar1;
///<summary>
///字符串2
///</summary>
privatechar[]_ArrChar2;
///<summary>
///统计结果
///</summary>
privateResult_Result;
///<summary>
///开始时间
///</summary>
privateDateTime_BeginTime;
///<summary>
///结束时间
///</summary>
privateDateTime_EndTime;
///<summary>
///计算次数
///</summary>
privateint_ComputeTimes;
///<summary>
///算法矩阵
///</summary>
privateint[,]_Matrix;
///<summary>
///矩阵列数
///</summary>
privateint_Column;
///<summary>
///矩阵行数
///</summary>
privateint_Row;
#endregion
#region属性
publicResultComputeResult
{
get{return_Result;}
}
#endregion
#region构造函数
publicStringCompute(stringstr1,stringstr2)
{
this.StringComputeInit(str1,str2);
}
publicStringCompute()
{
}
#endregion
#region算法实现
///<summary>
///初始化算法基本信息
///</summary>
///<paramname="str1">字符串1</param>
///<paramname="str2">字符串2</param>
privatevoidStringComputeInit(stringstr1,stringstr2)
{
_ArrChar1=str1.ToCharArray();
_ArrChar2=str2.ToCharArray();
_Result=newResult();
_ComputeTimes=0;
_Row=_ArrChar1.Length+1;
_Column=_ArrChar2.Length+1;
_Matrix=newint[_Row,_Column];
}
///<summary>
///计算相似度
///</summary>
publicvoidCompute()
{
//开始时间
_BeginTime=DateTime.Now;
//初始化矩阵的第一行和第一列
this.InitMatrix();
intintCost=0;
for(inti=1;i<_Row;i++)
{
for(intj=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%算同一题
intintLength=_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>
publicvoidSpeedyCompute()
{
//开始时间
//_BeginTime=DateTime.Now;
//初始化矩阵的第一行和第一列
this.InitMatrix();
intintCost=0;
for(inti=1;i<_Row;i++)
{
for(intj=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%算同一题
intintLength=_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>
///<paramname="str1">字符串1</param>
///<paramname="str2">字符串2</param>
publicvoidCompute(stringstr1,stringstr2)
{
this.StringComputeInit(str1,str2);
this.Compute();
}
///<summary>
///计算相似度
///</summary>
///<paramname="str1">字符串1</param>
///<paramname="str2">字符串2</param>
publicvoidSpeedyCompute(stringstr1,stringstr2)
{
this.StringComputeInit(str1,str2);
this.SpeedyCompute();
}
///<summary>
///初始化矩阵的第一行和第一列
///</summary>
privatevoidInitMatrix()
{
for(inti=0;i<_Column;i++)
{
_Matrix[0,i]=i;
}
for(inti=0;i<_Row;i++)
{
_Matrix[i,0]=i;
}
}
///<summary>
///取三个数中的最小值
///</summary>
///<paramname="First"></param>
///<paramname="Second"></param>
///<paramname="Third"></param>
///<returns></returns>
privateintMinimum(intFirst,intSecond,intThird)
{
intintMin=First;
if(Second<intMin)
{
intMin=Second;
}
if(Third<intMin)
{
intMin=Third;
}
returnintMin;
}
#endregion
}
///<summary>
///计算结果
///</summary>
publicstructResult
{
///<summary>
///相似度
///</summary>
publicdecimalRate;
///<summary>
///对比次数
///</summary>
publicstringComputeTimes;
///<summary>
///使用时间
///</summary>
publicstringUseTime;
///<summary>
///差异
///</summary>
publicintDifference;
}
调用方法:
//方式一
StringComputestringcompute1=newStringCompute();
stringcompute1.SpeedyCompute("对比字符一","对比字符二");//计算相似度,不记录比较时间
decimalrate=stringcompute1.ComputeResult.Rate;//相似度百分之几,完全匹配相似度为1
//方式二
StringComputestringcompute2=newStringCompute();
stringcompute2.Compute();//计算相似度,记录比较时间
stringusetime=stringcompute2.ComputeResult.UseTime;//对比使用时间