前面那么多篇文章都太抽象,这次来一个稍微实际一点的。F模式是我实际上选用的模式,对该模式我做了不少实际的测试,因此代码也算是比较稳定的。不过由于实际上为了得到该算法的效率,算法本身做了一些优化,对于初学者,理解起来可能会有点困难,因此不适合直接贴原始代码。为了便于大家理解,这里出示的代码会比较好读,但是并不能取得我宣称的效果。大家可以在此基础上进行一定的优化,以便达到你所想要的性能。我目前版本的性能大约是:
T2080 1.73GHz(双核) 笔记本 1.5GB 内存 Vista Ultra 特性全开(集成显卡)
15M字符/秒
不过即便经过精简,这个算法的代码也还是比一般的算法要复杂:除了算法本身所在的类,它还需要5个额外的数据结构,以及一个特殊枚举的支持。这几个额外的数据结构包括:
FastDict
FastList
FastQueue
FastWorkItem
FastScanResult
一个额外的枚举是
CharacterType
其中前面四个数据类,以及那个枚举对于本算法是至关重要的。下面首先讲解一下这几个数据结构和枚举:
//hashcode对应字符串列表的字典
publicclassFastDict : Dictionary
{
//该hashcode对应的字符串最大长度是多少
publicintMaxCharacterLength;
}
//相同hashcode都有哪些字符串
publicclassFastList : List
{
}
//一个起始字符记录(也就是可能需要处理的数据)
publicclassFastWorkItem
{
publicFastWorkItem(intindex,intmaxEndIndex,uintlowPartDelta)
{
Index=index;
MaxEndIndex=maxEndIndex;
LowPartDelta=lowPartDelta;
}
//起始字符在待检文本中的位置
publicintIndex;
//该起始字符所对应的关键字条目的最远结束位置
publicintMaxEndIndex;
//该记录所对应的(与前一条记录的)hashcode差值
publicuintLowPartDelta;
}
//待处理数据队列
publicclassFastQueue:Queue
{
}
//扫描结果
publicclassFastScanResult
{
publicFastScanResult(stringword,intindex)
{