KnuthMorrisPratt KMP匹配算法
Last updated
Last updated
得到模式的每个节点跳转的下标,在KMP算法中,这个跳转的下标数组称为失败函数(Failure Function),或部分匹配表(Partial Match Table)。部分匹配表的实质也是最长后缀字符串。
当匹配到但时,已知的最长后缀字符串为,按照AC自动机的算法,当前的匹配位置是,沿着失败指针跳转,然后继续尝试匹配和。指向前缀树根节点的下标都设为。
由此可得,对于,若则文本上的位置右移一位,匹配上的位置不动;若则模式上的匹配位置跳转到即,文本上的位置不动。然后继续尝试匹配和。对于,则文本和模式上的位置都右移一位。当为模式的末尾字符,并且匹配成功,这时我们仍然将两个位置右移一位继续匹配,那么显然有(因为模式在这个位置已经没有字符了),这时的跳转位置为,然后就可以正常匹配了。
对于模式上的位置(前缀树根节点的第一层孩子节点),其失败指针为;
对于模式上的位置,其父节点位置为,父节点的失败指针位置为,而失败指针的孩子节点的位置必然是。若,则可知失败指针为;否则失败指针为:
实际编程中为了方便操作数组下标,通常会定义数组,令。
KMP算法的时间复杂度为。