串、多维数组和广义表

一、串的定义

  1. 串(string)(或字符串)是由0个或多个字符组成的有限序列;0个字符的串称为空串(null string),其长度为0;
  2. 子串:主串中任意个连续的字符组成的子序列;子串的第一个字符在主串中的位置为子串的位置;
  3. 空格串(blank string):由一个或多个空格组成;
  4. 串是一种内容受限的线性表,其数据元素是单个字符。

二、串的存储结构

  1. 串的顺序存储结构
    //-----串的定长顺序存储结构-----
    #define MAXLEN 255  //串的最大长度】
    typedef struct
    {
        char ch[MAXLEN+1];  //存储串的一维数组
        int length;  //串的当前长度
    }SString;
    
    //-----串的堆式存储结构-----
    typedef struct
    {
        char *ch;
        int length;
    }HString;
    
    

     

  2. 串的链式存储结构 

    //-----串的链式存储结构-----
    #define CHUNKSIZE 80
    typedef struct Chunk
    {
        char ch[CHUNKSIZE];
        struct Chunk *next;
    }Chunk;
    
    typedef struct
    {
        Chunk *head,*tail;  //头尾指针
        int length;
    }LString;

     

 三、串的模式匹配算法

    设有两个字符串S和T,S为主串,T为子串,也叫模式;

  1. BF算法
    //-----BF算法-----
    int Index_BF(SString S,SString T,int pos)
    {
        int i = pos;  //pos是主串中待匹配的起始地址
        int j = 1;    //j为子串中位置指针
        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.lenth)
            return i-T.length;  //成功
        else
        {
            return 0;           //失败
        }
        
    }

    最坏时间复杂度为O(m * n) , 最好时间复杂度为O(m + n) ;

  2. KMP算法   参考于巨佬博客:https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html

    //-----KMP算法-----
    int Index_KMP(SString S,SString T,int pos)
    {
        int i = pos;
        int j = 1;  //字符串从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;
    }
    
    void get_next(SString T,int next[])
    {
        int i=1;
        next[1]=0;
        int j=0;
        while(i<T.length)
        {
            if(j==0 || T.ch[i]==T.ch[j])
            {
                i++;
                j++;
                if(T.ch[i]!=T.ch[j])
                    next[i]=j;
                else 
                    next[i]=next[j];
            }
            else 
                j=next[j];
        }
    }

    时间复杂度为O(m + n) !

多维数组

  1. 多维数组可以看成是线性表的推广,其元素可以是具有某种结构的数据;
  2. 对于一些特殊矩阵(如对称矩阵、三角矩阵、对角矩阵),可通过对多个值相同的元只分配一个存储空间、对零元不分配空间来进行压缩存储。

广义表

  1. 定义:广义表是一种线性表的推广形式,表中的元素可以是称为原子的单个元素,也可以是一个子表;
  2. 广义表通常采用链式存储结构,包括:头尾链表的存储结构和扩展线性链表的存储结构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值