标签:att 时间复杂度 har 特殊 开始 有一个 end mp算法 int
#define MAXLEN 255 //预定义最大串长为255
typedef struct {
char ch[MAXLEN];//每个分量存储一个字符
int length; //串的实际长度
}SString; //Sequential String
typedef struct {
char *ch; //按串长分配存储区
int length; //串的长度
}HString; //Heap String
未完待续
这是一种经典模式匹配算法,暴力破解(Brute-Force)算法
依次比较主串和模式串,若匹配失败,则主串指针回到刚开始比较的位置的下一个位置。
基本概念:
KMP(Knuth、Morris、Pratt三个人名)算法,KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。
通俗说明:
若当前部分匹配串的最后一位(即 最长相等后缀的最后一位)匹配失败,那么下一次匹配应该为最长相等前缀中的最后一位。其实很好理解,如果这段匹配失败了,那么就从头开始拿相同的部分(即 最长相等前缀)弥补过来,可以省去比较前后缀相同的部分,提高效率。
next数组的计算:
KMP算法中的next函数值只和模式串有关,而和相匹配的主串无关。
首先我们给每个字符标上序号
模式串:abaabcac
序号j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
模式串S | a | b | a | a | b | c | a | c |
之后,我们把模式串的所有前后缀依次列出来,求得每个子串中最长相等前后缀长度maxL(即 相等的前缀与后缀的最大长度)
序号j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
模式串S | a | b | a | a | b | c | a | c |
maxL[j] | 0 | 0 | 1 | 1 | 2 | 0 | 1 | 0 |
将maxL数组右移一位,第一个元素在右移以后空缺,用-1来填充;数组整体+1(右移+1)
序号j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
模式串S | a | b | a | a | b | c | a | c |
maxL[j] | 0 | 0 | 1 | 1 | 2 | 0 | 1 | 0 |
next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
序号j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
模式串S | a | b | a | a | b | c | a | c |
maxL[j] | 0 | 0 | 1 | 1 | 2 | 0 | 1 | 0 |
next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
nextval[j] | 0 | 1 | 0 | 2 | 1 | 3 | 0 | 2 |
标签:att 时间复杂度 har 特殊 开始 有一个 end mp算法 int
原文地址:https://www.cnblogs.com/blknemo/p/11393644.html