学习笔记——数据结构(WEEK 6)

串(内容受限的线性表),数组和广义表(线性结构的推广

串(0或任意个字符组成的有限序列)

串的定义

在这里插入图片描述

  • 子串(连续),真字串(不包含自己)
  • 主串(包含子串的串)
  • 字符位置(字符在序列中的序号)
  • 子串位置(子串第一个字符)
  • 空格串(由一个或多个空格组成)
  • 在这里插入图片描述
  • 串相等(空串相等)
  • 在这里插入图片描述

案例引入

病毒

在这里插入图片描述
在这里插入图片描述

串的类型定义,储存结构,运算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

顺序存储结构(用得更多,插入删除很少)

# define maxlen 255
typedef struct 
{
    char ch[maxlen+1];//0一般不存储,一般直接从1开始
    int length;/* data */
}SString;

链式存储结构

在这里插入图片描述

# define CHUNKSIZE 80 //define by user
typedef struct Chunk
{
    char ch[CHUNKSIZE];
    struct Chunk *next;/* data */
}Chunk;
typedef struct
{
    Chunk *head,*tail;
    int curlen;/* data */
}Chunk;
串的模式匹配
  • 目的:确认主串中所含子串(模式串)第一次出现的位置
  • 种类:BF(Brute-Force),KMP(速度快)
    在这里插入图片描述
BF算法(简单匹配算法,穷举法)
int index_BF(SString S,SString T){
    int i,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;
    else return 0;
}
int index_BF(SString S,SString T,int pos){
    int i=pos;
    int 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;
    else return 0;
}

算法复杂度O(n*m)

KMP(i不回溯,提速到o(m+n))

在这里插入图片描述
在这里插入图片描述

  • 第一个相当于找最大相同
  • 在这里插入图片描述
    https://www.bilibili.com/video/BV16X4y137qw/?spm_id_from=333.337.search-card.all.click&vd_source=61b7fa5fc2de0c146c573c35ee4095bb
    在这里插入图片描述

int index_KMP(SString S,SString T,int pos){
    int i=pos;
    int j=1;
    int next[T.length];
    get_next(T,next);
    while(i<=S.length&&j<=T.length){
        if(S.ch[i]==T.ch[j]||j==0){
            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=0;
    next[1]=0;
    int j=0;
    while(i<T.length){
        if(j==0||T.ch[i]==T.ch[j]){
            ++i;++j;
            next[i]=j;
        }
        else
            j=next[j];
    }
}
改进

在这里插入图片描述

void get_nextval(SString T, int (&nextval)[]){
    int i=0;
    nextval[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]) nextval[i]=j;
            else nextval[i]=nextval[j];
        }
        else
            j=nextval[j];
    }
}

数组

-按照一定格式排列,具有相同类型的数据元素的集合


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

抽象数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数组的顺序存储
  • 数组结构固定,操作不做插入删除----一般用顺序储存
  • 数组多维,所以要解决映射问题
  • 一维
    在这里插入图片描述
  • 二维(次序约定)

在这里插入图片描述
在这里插入图片描述

  • 三维(页优先)
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
特殊矩阵的压缩储存

在这里插入图片描述
在这里插入图片描述

对称矩阵

在这里插入图片描述

  • 行序(等差)
  • 在这里插入图片描述
三角矩阵

在这里插入图片描述

对角矩阵

在这里插入图片描述
在这里插入图片描述

稀疏矩阵
  • 三元组(有序的双下表标法)
  • 在这里插入图片描述
    在这里插入图片描述
  • 链式储存(十字链表)
  • 在这里插入图片描述
    在这里插入图片描述

广义表(List),线性表推广

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • F为递归表
  • 在这里插入图片描述
    在这里插入图片描述
运算
  • 求表头,求表尾
    在这里插入图片描述
  • 链式存储

案例分析与实现

病毒感染检测(查找子串)
  • BF
  • KMP
  • 在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值