转贴:迅雷补丁的核心算法(转自http://www.shuax.com)

高速字符串匹配 zzl算法

这个大概我这段时间稍微有点成就感的东西了。
学了数据结构,但是编写代码的时候还是照着书抄,没有一点意思……

字符串匹配在补丁的时候是非常有用的。
之前我用的普通方法查找,就是一个一个的往前。搜索一个300kb的文件大概需要4秒时间。
看了ZZL算法原理以后,自己就编写了出来。查找这个相同的文件,需时约0.4秒。
大家能够感觉到差距吧?整整10倍啊!

算法思想大意是每次能够尽量多的移动匹配位置,因此建立一个开始匹配的索引。

整个程序需要两部
预处理
预处理主要完成查找模式串首字符在主串中的所有出现位置,并将其保存在一个数组中。
查找模式串首字符算法如下:

匹配
在预处理的基础上,字符串匹配算法就可以从查找到的模式串在主串中的位置开始,匹配模式串首字母之后的其余部分。此时,采用BF算法即可,并可设置一个计数器,记录匹配次数。
匹配算法如下:

算法性能分析
如果不考虑算法的预处理过程,若模式串首字母在主串中出现k次,则ZZL算法最坏情况下比较次数为k*(M-1) 如果考虑算法的预处理过程,则总的比较次数需再加上N次,即为k*M+N。

最后,我把我实现的算法写出来吧,可不是伪代码哦,保证能够编译通过的。

实验结果
为了评测该算法的性能,随机的抽取一段文本和模式串,并在同一台计算机上用不同的算法进行匹配。

测试文本主串S=”From automated teller machines and atomic clocks to mammograms and semiconductors,innumerable products and services rely in some way on technology,measurement,and standards provided by the National Institute of Standards and Technology”,

模式串T=”products and services”。

分别用BF算法、KMP算法、BM算法、Sunday算法和ZZL算法在同一台计算机上进行匹配计算,并统计每种算法匹配时总的字符匹配次数。测试结果:

算法		BF	KMP	BM	Sunday	ZZL
一次匹配的总的字
符匹配次数		116	95	108	110	23 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值