本来想写字符串匹配算法的,感觉题目太大;又想写个多模式匹配算法的,感觉还是太大;最后,写了个AC多模式匹配算法,对哦,我只用到了AC算法啊,不过其他算法还是会介绍一下的,了解多少介绍多少。
本人是为了总结,所以可能不遵守一些写作逻辑了哦。
字符串匹配,主要分两种情况。一种是单字符串匹配,另一种是多字符串匹配。
单字符串匹配的意思就是,从一个较长的字符串里找所包含的另一个字符串,可以包括匹配的位置以及个数。
多字符串匹配又称多模式匹配,诚然,你可以循环调用单字符串匹配的算法,一个一个匹配。但是很明显,这并不是一个高效的做法。目前有很多算法可以提高匹配的效率,而我选中的AC算法,主要是因为它的简单,当然,效率也不是盖的。
单字符串匹配的算法有KMP,Horspool,Boyer-Moore,Sunday算法,忘得差不多了,等晚上回去仔细学一下再发。对了,还有个RK算法,用了线性代数,实在是看不懂了。。
多字符串匹配算法,也有好几个,不过只有AC算法看起来好用。
下面着重介绍AC算法了哦
AC算法的主要思想是,把字符串库放到一个trie树里面,然后有内容要匹配时,只要一次遍历,就可以将所有字符串匹配好了。
假设要在字符串"whatever you do, wherever you go."中匹配一下四个字符串
hello
world
when
what
首先,需要将hello world when what做成自动机,如图:
其中,每个圈代表一个状态,若出现匹配的状态,就转移到下一个状态。
如:匹配whatever,先匹配到w,到达状态6,然后匹配h,到达状态7,然后匹配a,到达状态10,然后匹配t,到达状态11.状态11应该有个output标志,表示已经有匹配。
吃饭去了,下次继续写~