
在它之前,最简单的方法是拿每个关键词,从头到尾在文章里扫一遍。如果有10个关键词,文章有10000个字,那就得扫10万次,非常慢。
WM算法的聪明之处在于,它一次扫描文章,就能同时匹配所有关键词,大大提升了效率。这在杀毒软件(病毒库有成千上万个特征码)、搜索引擎(同时匹配大量查询词)中非常有用。
它模仿我们人眼阅读时的“跳读”。比如找“元宝”这个词,我们不会一个字一个字地看,而是快速扫过,看到“宝”字才停下来仔细看看前面是不是“元”。
WM算法把这种“跳读”做到了极致,它依赖于两张事先准备好的“地图”:
在搜索开始前,算法会先分析所有要查找的关键词,制作两张表。我们假设关键词长度都是m(WM通常处理等长关键词,或取最短长度)。
m - 1 - 位置索引),取最小值。这个值就是可以安全跳跃的步数。
举例:有关键词 she, her, his(m=3)。
e:在 she中,e在最后一位(位置2),距离末尾是 3-1-2=0;在 her中,e在中间(位置1),距离末尾是 3-1-1=1。取最小值 0。所以SHIFT[e] = 0。
x:所有关键词末尾都没有x,那么可以安全地跳过几乎整个关键词长度,即 m = 3。所以SHIFT[x] = 3。
现在开始扫描文章(我们称为“文本”)。
s。
s > 0,说明当前位置绝不可能匹配,直接将窗口向后(右)移动 s位。
s == 0,说明当前位置“有可能”匹配。这时:
直到搜索窗口移出文本的开头,算法结束。
一个生动的比喻:
WM算法就像一个拿着两份名单的检票员。
希望这个从零开始的讲解能帮助你理解WM算法!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。