KMP算法中最难理解的地方的理解

来源:互联网 发布:画面撕裂 知乎 编辑:程序博客网 时间:2024/06/03 17:44

 

曾经最难理解的地方就是“要搜索的字符串的预处理”部分:
假设要搜索的字符串是【人1,人2,人3,人4,人5,人6,人7,人8】,

假设扫描到【人6】时前后最大相等的长度是4,即【人1,人2,人3,人4】==【人3,人4,人5,人6】,

那么我们看【人7】时的情况:
如果【人7】==【人5】,那么此时的前后最大相等的长度是【人6】的最大长度加1,等于5,这很好理解;
如果【人7】!=【人5】,
这时,有一点可以肯定的是【人7】的“最大长度”肯定小于或等于【人6】的“最大长度”,因为【人7】的“最大长度”不可能比【人6】的“最大长度”大2,证明如下:
    假设【人7】的“最大长度”为6(【人6】为4),即
    【人1,人2,人3,人4,人5,人6】==【人2,人3,人4,人5,人6,人7】,
    上述等式左右各去掉一项即:【人1,人2,人3,人4,人5】==【人2,人3,人4,人5,人6】,
    说明【人6】时的前后最大相等长度就是5,而不是4,与已知条件相违。
所以,【人7】的前后最大相等长度肯定小于4,
下面就到了“最难理解”的地方,因为这里我们最容易忽视一个对理解下面至关重要的地方,因为【人6】的最大长度是4,即:
    【人1,人2,人3,人4】==【人3,人4,人5,人6】,即【人1,人2,人3,人4】和【人3,人4,人5,人6】是完全一样的,可以看成是同一个序列。
假设【人7】的最大长度是4,则必然有:
    【人1,人2,人3,人4】==【人4,人5,人6,人7】,
    因为【人1,人2,人3,人4】==【人3,人4,人5,人6】,所以
    【人4,人5,人6】==【人2,人3,人4】,也就是
    【人1,人2,人3】==【人2,人3,人4】,也就是说【人4】时的前后最大相等长度是3。
反过来说也就是:
    如果【人4】的“最大长度”为3,即【人1,人2,人3】==【人2,人3,人4】,
    那么,如果【人7】==【人4】,就会有
    【人1,人2,人3,人4】==【人2,人3,人4,人7】,
    因为【人1,人2,人3,人4】==【人3,人4,人5,人6】,所以
    【人1,人2,人3,人4】==【人4,人5,人6,人7】,
    即【人7】的“最大长度”为【人4】的最大长度加1,等于4。

 

同理,如果【人7】!=【人4】,因为【人4】的“最大长度”是3,假设【人3】的最大长度是2,
那么,如果【人7】==【人(2+1=3)】的话,【人7】的“最大长度”就是【人3】的最大长度加1,等于3,
依此类推……
原创粉丝点击