串的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( ) next[j+1]=next[j]+1;
else if ,设next[k]=k',即 ,next[j]=next[k]+1;
else if ,设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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律