数据结构-串

定义

    串是字符串的简称,是一种限定数据元素为字符的线性表。所以可以定义为串是一个有穷字符序列。

区别

    串作为一种特殊的线性表,它和一般的线性表的差别主要是在操作上。线性表的操作对象都是线性表中的单个数据元素,或查找或插入或删除。而串的这些操作的对象可以是单个数据元素也可以是连续的多个元素组成的子串。这里看下图:

存储结构

    既然做为一种特殊的线性表,也就是说它本质上还是一个线性表。因此在存储上和一般的线性表的思路是一致的,有顺序和链式。一般情况下用数组来实现串的顺序存储。这里需要注意的是,关于串的长度有两种表示方式,一种是设置一个长度参数,一种是在串的末尾加入结束标志'\0'。
    那么,链式存储结构中一个节点可以存储一个或多个字符。串的节点的大小直接影响串的操作效率。这一点有区别中串的操作可以知道,因为串的操作对象是子串。而节点过大的话就是说节点中的多个字符只有其中一个字符的物理地址是可以直接查询到的。如图“克”这个字串匹配起来就比较麻烦:

模式匹配

    这里也要先了解个概念:模式串,即目标字符串的子串。模式匹配也就是在主字符串中定位模式串的过程。有两种算法朴素匹配和KMP匹配。
    朴素匹配算法:从主串的第一个字符起与模式串的第一字符比较,若相等,则继续对后续字符进行比较。其中有一个字符不匹配就从主串的第二字符与模式串的第一个字符重新执行这一匹配过程。如图所示:
            

     从图中描述的匹配过程可以看到,当模式串较长且匹配到最后一个字符才不相等时就需要对主串的指针进行回溯。即从指向E变成指向B。当模式串很长时将影响效率。因此有人对朴素匹配进行优化而得到了新的算法,即KMP算法。    
    KMP匹配算法:每当匹配过程中出现字符不相等时,不需要回溯主串的执政位置,而是利用已经得到的部分匹配结果,将模式串向右滑动尽可能远的距离再继续比较。看图例:

    我们第一次匹配失败了,但是我们得到了主串的前四个字符和模式串的字符是匹配的。即图中双向箭头的部分(A=A,B=B,C=C,D=D)。这是我们从模式串本身可以发现A≠B,即间接得到模式串的第一个字符和主串的第二个字符是不相等的。因此我们就可以越过它不比较。同理可推出模式串不需要和主串的第二到第五个字符比较,而直接与第五个字符E比较。这里需要注意的是字符E是不能越过去的,因为我们只对已经匹配的部分分析。则第二次匹配如下图所示:

    总结:串的是一种特别的线性表,其特别之处在于它操作的对象是一个子串而不是单个字符。也就导致了其在存储(链式)和匹配时比较特殊。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值