前几天看了关于KMP算法的资料,一直不知道这个DFA怎么画,后来搞明白了,今天有时间就把自己理解的写出来以供大家参考。
看这个需要你对KMP有点了解,我只讲怎么画这个DAF图,其它基础知识你们再去看资料了。
我就直接先把算法第四章的图搬上来了,然后开始一步步说怎么画
第一步:
因为A匹配所以若果是A就可以到状态1,B,C就还是状态0。那么结果就是1 0 0;
第二步:
因为就两个字母A和B,中间没有了,所以就复制j=0时的状态为 1 0 0,然后又因为B是匹配的可以进入到下一个状态,所以就把B的那一个更新为2,结果就是 1 2 0
第三步:
因为有三个字母了,就把第1个字母B和第0个字母匹配,因为第0个字母是A,匹配失败,所以还是把j=0的状态复制过来得到 1 0 0, 然后又因为A是匹配的可以进入到下一个状态,所以就把A的那一个更新为3,结果就是 3 0 0
第四步:
现在就是有四个字母了,就把中间的B,A和第0个字母进行比较,先用B和第0个字母比较,因为第0个字母是A,所以失败。再用A和第0个字母比较,显然比较成功,那么就进入状态1,因为状态是从0开始的,现在就把j=1的值复制过来得到1 2 0,然后又因为B是匹配的可以进入到下一个状态,所以就把B的那一个更新为4,结果就是 1 4 0
第五步:
现在有5个字母了,就把中间的B,A,B和第0个字母进行比较,先用B和第0个字母比较,因为第0个字母是A,所以失败。再用A和第0个字母比较,显然比较成功。继续用B和第1个字母比较,因为第1个字母是B,比较成功,所以就把j=2的状态复制过来得到3 0 0,然后又因为A是匹配的可以进入到下一个状态,所以就把A的那一个更新为5,结果就是 5 0 0
第六步:
现在有6个字母了,就把中间的B,A,B,A和第0个字母进行比较,先用B和第0个字母比较,因为第0个字母是A,所以失败。再用A和第0个字母比较,显然比较成功。继续用B和第1个字母比较,因为第1个字母是B,比较成功。继续用A和第2个字母比较,因为第2个字母是A,比较成功,所以就把j=3的状态复制过来得到1 4 0,然后又因为C是匹配的可以进入到下一个状态,所以就把C的那一个更新为6,结果就是 1 4 6
整个过程就结束了,如果我有说错的希望大牛可以批评指正,有不明白的可以评论,谢谢大家。第一次发帖真刺激!