串的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]与详细计算

image

时间复杂度
  • 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为变量指数

用广义表表示字符串中的递归构造

  • 深度优先搜索、复制、根据字符串构造均利用递归
根据括号切割出子表

posted @ 2022-10-08 10:15  clfire  阅读(32)  评论(0编辑  收藏  举报