在上述BARBER比较中(详细见Introduction to the Design and Analysis of Algorithms (3th)英文版P262)。原本以为在倒数第二次比较时,R匹配了,然后E遇到了A,这个时候不匹配,而这个时候这个算法就会移动字符串三位。我一直不理解为什么E不匹配A,那么不是应该调用A在表中对应的移动字符数吗?今天终于明白了。。。。真是天资不足啊。原来只要遇到不匹配的,就调用最后那个字符对应的文本中的字符c(假设为c),然后再去表中查询c对应的移动数。。而不是不匹配那个字符所对应的文本中字符。这个时候可能还要疑问说,那倒数第二次如果没有两个R只有一个R呢,假设把第一R换成U,那这个时候字符串就应该移动6位,因为如果像我假设的一样移动字符串中匹配字符到最后一个不匹配的地方的话,那是不可能的。这样在表中找到的移动数肯定是错的。
Boyer-Moore 算法
1. 如果第一个字符就已经不匹配了,那么移动方法和Horspool是一样的。但是当有一个以上字符匹配之后又出现不匹配,这个时候就有区别了
2. 第一种移动叫坏符号移动(bad-symbol shift)。这个比较简单容易理解。我们根据这个表算出来的移动距离的