三种最基本的字符串匹配算法是BF,KMP以及BM,BF算法是最简单直接的匹配算法,就是逐个比较,一旦匹配不上,就往后移动一位,继续比较,所以比较次数很都。
关于KMP和BM的详细介绍可以参考下面的两个link,是讲得比较好的。
KMP
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
BM
http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
理论上,BM具有最好的性能,因为比较的次数最好,其次是KMP,最差的应该是BF。
今天对这三种算法做了一个简单的测试,测试程序运行在Windows 7 x64位系统上,四核CPU,32G内存,测试程序为x64。
说明,只测试在目标字符串中找不到要搜索的字符串,以便能够遍历完所有字符串。
测试1,在1亿个字符串(100M)搜索一个长度为20字节字符串,结果如下:
BF spent time is 171(ms)
KMP spent time is 422(ms)
BM spent time is 15(ms)
最快的是BM算法,花的时间也最少(15ms).
测试2, 在10亿个字符串中(1G)中搜索一个长度为20字节的字符串,结果如下:
BF spent time is 1670(ms)
KMP spent time is 4321(ms)
BM spent time is 203(ms)
结果和测试一基本一致。
通过这两次测试,很奇怪的是KMP算法居然比BF算法花的时间还多,说明KMP虽然理论上有很好的性能,但实际上很难有所作为,大多数情况下还不如BF算法。但是BM算法确实在大多数情况下都具有很好的性能体现。