马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我也不知道,我原来理解的,NET就是C++编程,只是与net网页编程相对,呵呵。以为.ET就是高级C++编程。感激sumtech的复兴和会商,底本的效力已充足网站有用了,固然也想到一些改善办法,可是一向懒得往做。sumtech经由过程邮件跟我会商,我也终究抽了工夫做了改善,改善后的算法效力比本来的算法进步了400%,也就是仅必要本来的1/5工夫。
拜见/dotnet/20111127/315434.html。
算法关头是将两个BitArray兼并成了byte[char.MaxValue],个中7个bit用来判别前7个字符,另外一个bit判别其他字符。而且增添了minWordLength和charCheck,用来过滤太短的判别,和唯一一个字符时的疾速判别。
利用的数据:
privateHashSet<string>hash=newHashSet<string>();
privatebyte[]fastCheck=newbyte[char.MaxValue];
privateBitArraycharCheck=newBitArray(char.MaxValue);
privateintmaxWordLength=0;
privateintminWordLength=int.MaxValue;初始化数据的代码:
foreach(stringwordinbadwords)
{
maxWordLength=Math.Max(maxWordLength,word.Length);
minWordLength=Math.Min(minWordLength,word.Length);
for(inti=0;i<7&&i<word.Length;i++)
{
fastCheck[word]|=(byte)(1<<i);
}
for(inti=7;i<word.Length;i++)
{
fastCheck[word]|=0x80;
}
if(word.Length==1)
{
charCheck[word[0]]=true;
}
else
{
hash.Add(word);
}
}判别是不是包括脏字的代码:
publicboolHasBadWord(stringtext)
{
intindex=0;
while(index<text.Length)
{
if((fastCheck[text[index]]&1)==0)
{
while(index<text.Length-1&&(fastCheck[text[++index]]&1)==0);
}
if(minWordLength==1&&charCheck[text[index]])
{
returntrue;
}
for(intj=1;j<=Math.Min(maxWordLength,text.Length-index-1);j++)
{
if((fastCheck[text[index+j]]&(1<<Math.Min(j,7)))==0)
{
break;
}
if(j+1>=minWordLength)
{
stringsub=text.Substring(index,j+1);
if(hash.Contains(sub))
{
returntrue;
}
}
}
index++;
}
returnfalse;
}2008-02-01订正:发明Bug,一个字符的charCheck应当放到for轮回外,往失落j==1的判别,外层的判别改成if(j+1>minWordLength)。
PS:如今婚配的是最小长度,而且是辨别巨细写的,这部分功效在脏字交换时必要完成。
中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。 |