|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如net网页编程改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。我们网站的脏字字典中也许有600多个词,并且会产生变更,因而复杂的在数据新增/修正的时分做一次脏字过滤是不敷的。在网站从.NET1.1到2.0改版的时分,对新版的测试发明旧的脏字过滤算法泯灭的工夫太长,必要做一些优化。
旧的算法是复杂对每个脏字挪用一遍string.replace,固然是用了StringBuilder。在cnblogs里发明了一篇会商脏字过滤的blog/dotnet/20111127/315432.html。在我这里测试的时分,RegEx要快一倍摆布。可是仍是不太中意,应为我们网站上脏字过滤用的相称多,经由一番思索后,本人做了一个算法。在本人的呆板上测试了一下,利用原文中的脏字库,0x19c的字符串长度,1000次轮回,文本查找耗时1933.47ms,RegEx用了1216.719ms,而我的算法只用了34.125ms.
算法的关头,仍是利用空间来换工夫,利用了2个全局的BitArray,长度均为Char.MaxValue。个中一个BitArray用来判别是不是有某个char开首的脏字,另外一个BitArray用来判别一切脏字中是不是包括某个char。经由这两个BitArray,能够做出疾速判别,以后就利用HashCode来判别完全的脏字,经由过程事后猎取的最年夜脏字长度优化遍历历程。
必要的变量以下:
privateDictionary<string,object>hash=newDictionary<string,object>();
privateBitArrayfirstCharCheck=newBitArray(char.MaxValue);
privateBitArrayallCharCheck=newBitArray(char.MaxValue);
privateintmaxLength=0;
个中hash只利用到了key,value都置为null。也能够利用.NET3.5中的HashSet,大概利用Dictionary<string,int>,纪录脏字的呈现次数。
初始化这些数据的办法以下:
foreach(stringwordinbadwords)
{
if(!hash.ContainsKey(word))
{
hash.Add(word,null);
maxlength=Math.Max(maxlength,word.Length);
firstCharCheck[word[0]]=true;
foreach(charcinword)
{
allCharCheck[c]=true;
}
}
}判别脏字是不是呈现在一个字符串中的代码以下:
intindex=0;
intoffset=0;
while(index<text.Length)
{
if(!firstCharCheck[text[index]])
{
while(index<text.Length-1&&!firstCharCheck[text[++index]]);
}
for(intj=1;j<=Math.Min(maxlength,text.Length-index);j++)
{
if(!allCharCheck[text[index+j-1]])
{
break;
}
stringsub=text.Substring(index,j);
if(hash.ContainsKey(sub))
{
returntrue;
}
}
index++;
}
returnfalse;
交换的代码就不贴了,跟判别包括相似,只不外不克不及发明一个脏字后就加入轮回。假如呈现脏字的大概不是很高,就没有需要创立一个一时的StringBuilder。
进一步,能够经由过程自创.NET源码中string.GetHashCode()的完成,制止一次Substring的挪用,进步功能。也能够计划递进的HashCode完成,好比"helloworld"能够用"helloworl"的hash进一步盘算,优化效力。
<strike>别的,也能够丢弃Hash,改用排序过的string[],用BinarySearch来判别sub是不是为脏字。BinarySearch的了局是能够递进的,便可以用查找"helloworl"的了局来减速判别"helloworld"。</strike>(已测试,700个脏字,BinarySearch的效力偶然会低良多。)
最初发一点怨言,现在最早发的时分(/dotnet/20111127/315435.html),仅仅是为了申明下本人的算法,详细的代码乃至另有一点毛病。两个事变让我以为内心不很爽,一个是被七零八落的有数网站转载而不申明出处,招致我厥后的改善和毛病修改达不到效果,二是一些人都乐意看到终极的代码,而不是了解我想要表达的最中心的计划,然后本人往思索完成。我见过net网页编程运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《net网页编程的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。 |
|