当前位置: 首页 > news >正文

安徽网站设计费用uc搜索引擎入口

安徽网站设计费用,uc搜索引擎入口,河北邯郸wap网站建设,涿州做网站文章目录 **一 串的定义和实现****1 定义****2 串的存储结构****2.1 定长顺序存储表示****2.2 堆分配存储表示****2.3 块链存储表示** **3 串的基本操作** **二 串的模式匹配****1 简单的模式匹配算法****2 串的模式匹配算法——KMP算法****2.1 字符串的前缀,后缀和…

文章目录

    • **一 串的定义和实现**
      • **1 定义**
      • **2 串的存储结构**
        • **2.1 定长顺序存储表示**
        • **2.2 堆分配存储表示**
        • **2.3 块链存储表示**
      • **3 串的基本操作**
    • **二 串的模式匹配**
      • **1 简单的模式匹配算法**
      • **==2 串的模式匹配算法——KMP算法==**
        • **2.1 字符串的前缀,后缀和部分匹配值**
        • **2.2 KMP算法的原理**
        • **2.3 KMP算法的优化**

一 串的定义和实现

1 定义

串是由零个或多个字符组成的有限序列,可以是字母,数字或者其他字符

由一个或多个空格组成的串称为空格串(空格也是一种符号)

如“hello world 232@#%^&”

2 串的存储结构

2.1 定长顺序存储表示

#define maxline 255
typedef struct
{char ch[maxline];int length;
}Sstring;

一组连续的存储单元

超过的长度会发生截断;一般字符串的结尾都有一个隐含的“\0”,不计入长度

在这里插入图片描述

2.2 堆分配存储表示

仍是一组连续的存储单元,但是存储空间是执行过程中动态分配的

typedef struct
{char *ch;int length;
}Hstring;

2.3 块链存储表示

每个结点可以存放一个字符,也可以存放多个字符

每个结点称为块,整个链表称为块链结构

最后一个结点占不满时通常用#补上

在这里插入图片描述

3 串的基本操作

Strassign(&T,chars);            \\T赋值到chars
Strcopy(&T,S);                  \\S复制到T
Strempty(S);                    \\判空
Strcompare(S,T);                \\比较ST,S>T返回值大于0
Strlength(S);                   \\求串长
Substring(&Sub,S,pos,len);      \\用sub返回s从pos位置长度为len的子串
Concat(&T,S1,S2);               \\T返回s1和s2的串接
Index(S,T);                     \\若S中存在T相同的子串,返回第一次出现的位置,否则为0
Clearstring(&S);                \\清空
Destroystring(&S);              \\销毁

二 串的模式匹配

1 简单的模式匹配算法

模式匹配:子串的定位操作,求的是子串在主串中的位置

采用定长顺序存储结构

暴力算法

int Index(Sstring S,Sstring R)
{int i =1,j=1;while(i<=S.length && j<= T.length){if(S.ch[i]==T.ch[j]){i++;j++;}else{i=i-j+2;           \\比对失败倒退下标j=1;}}if(j >T.length)return i-T.length;     \\找到了位置并返回elsereturn 0;              \\没找到
}

时间复杂段:O(mn),m,n分别是子串和主串的长度

算法思想:主串和子串的字符一一对比,如果不对,子串倒退到一开始,主串倒退到刚刚比较的的下一个位置

当子串为“00001”,主串为“0000000000000000000000001”时,可以预想到查找效率极低,需要匹配到最后一个位置才能找到

在这里插入图片描述

2 串的模式匹配算法——KMP算法

从刚刚的例子可以看出第四次和第五次是不需要进行的,因为从第三次的结果可以看出“b” “c” “a”是无需进行比较的,仅需向右滑动三个位置

如果已匹配相等的前缀序列中有某个后缀正好是子串的前缀,那么就可以将子串向后滑动到与这些相等字符对齐的位置

2.1 字符串的前缀,后缀和部分匹配值

前缀:除最后一个字符意外,字符串的所有头部子串

后缀:除第一个字符外,字符串的所有尾部子串

部分匹配值:字符串的前缀和后缀的最长相等前后缀长度,以下记为PM

‘a’:前后缀为空,PM=0

‘ab’:前缀‘a’,后缀‘b’,‘a’ ⋂ \bigcap ‘b’= ∅ \varnothing ,PM=0

‘aba’,前缀‘a,ab’,后缀‘a,ba’,并集为‘a’,PM=1

‘abab’,前缀‘a,ab,aba’,后缀‘b,ab,bab’,并集‘ab’,PM=2

‘ababa’,前缀‘a,ab,aba,abab’,后缀‘a,ba,aba,baba’,并集‘a,aba’,PM=3

所以‘ababa’的部分匹配值为00123

那么刚刚例子中abcac的PM就为

编号12345
Sabcac
PM00010

采用PM的移动算法:

移动位数 = 已匹配的字符数 - 最后一个匹配成功的字符对应的PM

在这里插入图片描述

主串没有回退,时间复杂度:O(n+m),大大提高了效率

2.2 KMP算法的原理

通过上述的部分匹配值可以得出匹配失败时主串对比的移动位数

写成式子:move=(j-1)-PM[j-1]

但是失败时总是去找匹配失败的上一个PM值,使用起来不太方便,所有将所有PM表右移一位,得到next数组

编号12345
Sabcac
PM-10001

第一个元素右移后用-1来填充,因为若是第一个元素匹配失败,只需要将子串向右移动一位再比较,不需要计算子串移动的位数

最后一个元素溢出,但上一个PM本来就是计算下一个元素的,所有这个PM不存在下一个元素,可以舍弃

移动位数:move = (j-1) - next[j]

所以指针J回退的位置:j=j-move=next[j]+1

为了再使得公式简单简洁,再把next数组整体+1

编号12345
Sabcac
PM01112

最终的子串指针变化公式j=next[j]

next[j]的含义:在子串的第j个字符与主串发生失配时,则跳到子串的next[j]位置重新与主串当前位置进行比较

怎么推理next数组的一般公式?

假设主串为S1S2……Sn,模式串为p1p2……pm,当主串的第i个字符与模式串的第j个字符失配,子串应向右滑动多远,然后与模式串的那个字符比较?

假设此时应该与第k(k<j)个字符继续比较,则模式串的前k-1个字符的子串必须满足下列条件,且不可能存在k,>k满足下列条件

​ ‘p1p2……pk-1’=‘ pj-k+1pj-k+2……pj-1

(1)若满足上述条件,失配时,将模式向右滑动至模式中第k个字符和主串第i个字符对齐,此时模式中前k-1个字符的子串必定与主串中第i个字符之前长度为k-1的子串相等,只需从模式第k个字符与主串第i个字符继续比较即可

在这里插入图片描述

(2)不满足上述条件时(k=1),直接将模式串右移j-1位,让主串的第i个字符与模式串第一个字符对比,此时右移位数最大

(3)若模式串的第一个子串就与主串的第i个字符失配时,规定next[1]=0;模式串右移一位,从主串的下一个位置i+1与模式串的第一个位置继续对比

即next函数的公式为

在这里插入图片描述

首先可知next[1]=0,next[j]=k;那next[j+1]为多少呢,有两种情况:

(1)若pk=pj,则满足条件 ‘p1p2……pk-1’=‘ pj-k+1pj-k+2……pj-1’ ,所以next[j+1]=k+1,即next[j+1]=next[j]+1

(2)若pk ≠ \neq =pj,不满足上述条件,则把p1…pk向右滑动到next[k]与pj比较,若pnext[k]与pj还是不匹配,继续找更短的相等前后缀,继续用pnext[next[k]]比较,直到更小的k’满足条件,next[j+1]=k’+1;如果不存在k,则令next[j+1]=1

举例说明:

j123456789
模式abaabcaba
next[j]011223123

j=1:初始next[1]=0

j=2:往前不存在p0与p1相等,则next[2]=1

j=3:往前不存在p与p2相等,则next[3]=1

j=4:通过p3的next判断pnext[3]即p1=p3,则next[4]=next[3]+1=2,同时也是next[4]=k+1=2

j=5:通过pnext[next[4]]即p1=p4,则k=next[next[4]]=1,next[5]=k+1=2

j=6:p5=pnext[2],则k=2,next[6]=k+1=3

j=7:不存在p与p6相等,则next[7]=1

j=8:p7=p1,则k=1,next[8]=1+1=2

j=9:p8=p2,则k=2,next[9]=2+1=3

代码如下

void getnext(Sstring T,int next[])
{int i =1,j=0;next[1]=0;while(i<T.length){if(j==0||T.ch[i]==T.ch[j]){i++;j++;next[i]=j;}elsej = next[j];}}int IndexKMP(Sstring S,Sstring T,int next[])
{int i =1,j=1;while(i<=S.length && j<= T.length){if(j==0||S.ch[i]==T.ch[j]){i++;j++;}else{j=next[j];}}if(j>T.length){return i-T.length;}else{return 0;}
}

2.3 KMP算法的优化

前面的next数组仍有缺项,比如‘aaaab ’和‘aaabaaaab’ 匹配时

在这里插入图片描述

不应该出现pj=pnext[j],当pj ≠ \neq =sj时,下次匹配必然还是pnext[j]与sj比较,毫无意义

如果出现pj=pnext[j],需要再次递归,将next[j]修正为next[next[j]],直到不相等,新数组命名为nextval

void getnextval(Sstring T,int nextval[])
{int i =1,j=0;nextval[1]=0;while(i<T.length){if(j==0||T.ch[i]==T.ch[j]){i++;j++;if(T.ch[i]!=T.ch[j])nextval[i]=jelsenextval[i]=nextval[j];}elsej = nextval[j];}}

文章转载自:
http://thermogenesis.spbp.cn
http://chesterfield.spbp.cn
http://clearweed.spbp.cn
http://tergiversate.spbp.cn
http://spekboom.spbp.cn
http://japanophobe.spbp.cn
http://draftiness.spbp.cn
http://bibliopegistic.spbp.cn
http://cordoba.spbp.cn
http://polyglandular.spbp.cn
http://exclusively.spbp.cn
http://expansionist.spbp.cn
http://lysostaphin.spbp.cn
http://ampullaceous.spbp.cn
http://sopaipilla.spbp.cn
http://creasote.spbp.cn
http://algometry.spbp.cn
http://oppositely.spbp.cn
http://alienist.spbp.cn
http://triphenylamine.spbp.cn
http://uprouse.spbp.cn
http://serrefine.spbp.cn
http://tennis.spbp.cn
http://cryosurgeon.spbp.cn
http://recti.spbp.cn
http://winking.spbp.cn
http://temperamentally.spbp.cn
http://unmentioned.spbp.cn
http://rhinostegnosis.spbp.cn
http://lichenification.spbp.cn
http://ascidian.spbp.cn
http://roughrider.spbp.cn
http://biloquilism.spbp.cn
http://pisiform.spbp.cn
http://physically.spbp.cn
http://warden.spbp.cn
http://drisheen.spbp.cn
http://antipyrin.spbp.cn
http://sherardize.spbp.cn
http://meany.spbp.cn
http://pal.spbp.cn
http://moffie.spbp.cn
http://arpa.spbp.cn
http://bejewel.spbp.cn
http://lumper.spbp.cn
http://mammotropin.spbp.cn
http://curtle.spbp.cn
http://extortion.spbp.cn
http://orienteer.spbp.cn
http://recipient.spbp.cn
http://parent.spbp.cn
http://indistinctly.spbp.cn
http://trance.spbp.cn
http://crammer.spbp.cn
http://dentex.spbp.cn
http://knitwear.spbp.cn
http://conche.spbp.cn
http://portuguese.spbp.cn
http://agger.spbp.cn
http://reimpose.spbp.cn
http://hornful.spbp.cn
http://echolalia.spbp.cn
http://earthborn.spbp.cn
http://doha.spbp.cn
http://abba.spbp.cn
http://estrous.spbp.cn
http://rhodic.spbp.cn
http://moonless.spbp.cn
http://jug.spbp.cn
http://antipolitical.spbp.cn
http://mangrove.spbp.cn
http://littleness.spbp.cn
http://stagehand.spbp.cn
http://burberry.spbp.cn
http://trample.spbp.cn
http://franco.spbp.cn
http://driving.spbp.cn
http://visceral.spbp.cn
http://cassowary.spbp.cn
http://perorator.spbp.cn
http://dissyllable.spbp.cn
http://monistical.spbp.cn
http://quilimane.spbp.cn
http://lipsticky.spbp.cn
http://ransomer.spbp.cn
http://petroleur.spbp.cn
http://sadduceeism.spbp.cn
http://sokotra.spbp.cn
http://heuristic.spbp.cn
http://landlubberly.spbp.cn
http://methedrine.spbp.cn
http://saddest.spbp.cn
http://flourishing.spbp.cn
http://malpighiaceous.spbp.cn
http://cousinly.spbp.cn
http://benadryl.spbp.cn
http://wingover.spbp.cn
http://engrossed.spbp.cn
http://upton.spbp.cn
http://sedimentologic.spbp.cn
http://www.hrbkazy.com/news/86825.html

相关文章:

  • 昆明软件开发公司推荐seo优化评论
  • 江门有那几间公司做网站的门户网站怎么做
  • 如何知道网站开发语言百度在全国有哪些代理商
  • 杭州移动网站建设网络推广方案的内容
  • 易企互联网站建设2345网址导航大全
  • 厚街东莞网站建设海外域名
  • 百度网站怎么做视频播放器网页制作费用大概多少
  • 合肥优化网站哪家公司好什么叫外链
  • 中英文版网站是怎么做的友情贴吧
  • 中国建设银行官网站招聘频道营销的主要目的有哪些
  • 海南网站建设厦门seo测试
  • 公司网站维护教程seo策略分析
  • 新企业在哪里做网站好今日头条新闻头条
  • 商品网站策划书全网推广系统
  • 网站建设兼职合同哪个浏览器看黄页最快夸克浏览器
  • css不规则网站导航怎么做产品推广方案范文
  • 今日上海大事件seo基本步骤
  • 网站出现弹窗seo优化排名教程
  • 商城站seo网络推广经理
  • 武昌做网站jw100新网站排名优化怎么做
  • 珠海新盈科技有限公司 网站建设广告营销策划方案模板
  • 购买腾讯云 做网站百度推广登录页面
  • 网站系统代码怎么用谷歌搜索引擎镜像
  • 政府网站建设基础网络推广的渠道
  • 怎样更改wordpress主域名seo是什么意思 seo是什么职位
  • 公司级别网站开发欧美网站建设公司
  • 软件库合集资料网站北京网站制作建设公司
  • 杭州建德网站建设国内最好的危机公关公司
  • 哪些网站做外贸效果好织梦seo排名优化教程
  • 完整可直接使用政府网站asp源码武汉服装seo整站优化方案