串的KMP算法与广义表
目录
KMP算法:时间复杂度=O(m+n)
- 内存中的存储方式=顺序分配+指针,串有顺序表、串符指向堆、块链3种
- 经典匹配——==后移,!=丢弃
时间复杂度——最坏:(n-m+1)*m=O(mn),平均O(mn) - D.E.nuth,V.R.Pratt,J.H.Morris
- 基本想法:
abcabca...
abcabcg...
第七位不同后,i不用变成2,j变成4
abcabca
abcabcg
若j退到0(next[1],j初始=1),i=i+1,j=1
else
next[j]与详细计算
时间复杂度
- next[j]的计算:
设next[j]=k(关键的平台搭建,与反证一样,方便操作)
if(\(p_k=p_j\)) next[j+1]=next[j]+1;
else if \(p_j==p_k'\),设next[k]=k',即\(p1....p_k'=p_{k-k'+1}...p_k=p_{j-k'+1}...pj\),next[j]=next[k]+1;
else if \(p_j==p_k''\),设next[k']=k''
...
T(j)=a*(T(j-1)+1)+(1-a)*(T(j-1)+f(j)),概率计算得T(j)=O(j) - KMP的计算完全相同:T(m,n)=T(m+n);
相对简单的伪代码
广义表
广义表的结点=表结点(指向一个广义表)+原子结点(表数据)
//头尾链表
typedef enum {ATOM,LIST}ElemTag;
typedef struct GLNode{
ElemTag tag;
union{
AtomType atom;
struct{strcut GLNode *hp,*tp}ptr;
};
}
//可扩展线性链表
typedef struct GLNode{
ElemTag tag;
union{
AtomType atom;
struct GLNode *hp;
};
GLNode *tp;
}
多元多项式的表示
自定义多项式结点p((tag)(num)(hp)(NULL))
tag=1为表结点,exp指向变元序号
tag=0为原子结点,exp为变量系数,coef为变量指数
用广义表表示字符串中的递归构造
- 深度优先搜索、复制、根据字符串构造均利用递归
根据括号切割出子表
愿偿少年泪,犹趁未老时!
本文来自博客园,作者:clfire,转载请注明原文链接:https://www.cnblogs.com/sky1water/p/16768135.html