串、数组、广义表

串、数组、广义表

1、串的定义

  • 串(String)是零个或多个字符组成的有限序列;

S =“a1a2 … an”

  • 子串:串中任意个连续字符组成的子序列称为该串的子串;
  • 主串:包含子串的串相应的称为主串;
  • 字符位置:字符在该序列中的序号为该字符串在串中的位置;
  • 子串位置:子串第一个字符在主串中的位置;
  • 空格串:由一个或多个空格组成的串,与空串不同;

串中元素逻辑关系与线性表的相同,串可以采用与线性表相同的存储结构;

2、串的模式匹配

  • 确定主串中所含子串(模式串)第一次出现的位置(定位);
  • BF算法:也称简单匹配算法,采用穷举的思路;

在这里插入图片描述

  • 时间复杂度

S=‘0000000001’,T=‘0001’,pos=1

若n为主串长度,m为子串长度,最坏情况是 主串前面n-m个位置都部分匹配到子串的最后一位, 即这n-m位各比较了m次 最后m位也各比较了1次;

总次数为:(n-m)*m+m=(n-m+1)*m;

若m<<n,则算法复杂度O(n*m);

  • 确定主串中所含子串(模式串)第一次出现的位置(定位);
  • KMP算法: 永不回退主串的指针,不走回头路;

S : a b a b c a b c a a b a b b

T:a b a b b

  • 公共前后缀

前缀:不包含最后一个字符的所有以第一个字符开头的连续子串;

后缀:不包含第一个字符的所有以最后一个字符结尾的连续子串;

  • next数组值:用来记录下一次需要比较的子串序号, 当前模式串在该位置匹配冲突时,应该将模式串的哪一位与此位对齐;

**主串:aaabaaaab **

子串:aaaab

在这里插入图片描述

冲突发生在第四位:

文本串: a a a b a a a a b

模式串: a a a a b

根据next值,next[4]=3,需要将第3位与该位置对齐:

文本串: a a a b a a a a b

模式串: a a a a b

但此时仍有冲突,这时冲突发生在模式串的第三位,根据next[3]=2,需要将第二位与此位;

文本串: a a a b a a a a b

模式串: a a a a b

仍有冲突,发生在模式串第二位,next[2]=1,将模式串第一位与此位置对齐:

文本串: a a a b a a a a b

模式串: a a a a b

依然冲突,发生在模式串第一位,next[1]=0,将模式串第0位与此位置对齐:

文本串: a a a b a a a a b

模式串: a a a a b

至此,冲突解决,匹配成功。 但整个过程效率很低,因为模式串前四个字符都为a,当第一次发生冲突时,就可以知道应 该直接将第0位和该位置对齐,中间的几次比较和移动都是多余的。 因此,nextval所做的工作就是对next值进行一次修正,排除掉无效移动。 以aaaab为例:next[1]=0,第一位冲突指示的第0位为空白字符,和第一位本身的a不同,保 留原next值,故nextval[1]=0;next[2]=1,第二位冲突指示的第一位为字符a,和第二位本身的a 相同,继续看第一位next[1]的值,(因为相同就表示按next值的此次对齐是无效的,会继续 发生第一位的冲突,因此继续看next[1])next[1]=0,指示的第0位为空白字符,和第二位本身 的a不同,保留next[1]的值,故nextval[2]=0;以此类推,可以得到nextval值如下:

在这里插入图片描述

在这里插入图片描述

KMP算法的时间复杂度

设主串s的长度为n,模式串t长度为m,在KMP算法中求next数组的时间复杂度为O(m),在后 面的匹配中因主串s的下标不减即不回溯,比较次数可记为n,所以KMP算法总的时间复杂度为 O(n+m)。

数组

1、数组的基本概念

数组:按一定格式排列起来的具有相同类型的数据元素的集合;

一维数组:A = (a1,a2,a3,… … an);

二维数组:在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三维数组:按页/行/列存放,页优先的顺序存储;

在这里插入图片描述

2、特殊矩阵的压缩存储

  • 什么是压缩存储?

若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间;

  • 什么样的矩阵能够压缩?

一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等;

  • 什么叫稀疏矩阵?

矩阵中非零元素的个数较少(一般小于5%);

  • 对称矩阵

[特点] 在n*n的矩阵a中,满足如下性质:aij=aji;

[存储方法] 只存储下(或者上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间。

在这里插入图片描述

  • 上(下)三角矩阵

[特点]主对角线下的数据元素全部相同的矩阵为上三角矩阵 主对角线上的数据元素全部相同的矩阵为下三角矩阵;

[存储方法] 只存储下(或者上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间;

在这里插入图片描述

  • 对角矩阵(带状矩阵)

[特点]在n*n的方阵中,非零元素集中在主对角线及其两侧共L(奇数)条对角线的带状区域内——L对角矩阵;

[存储方法]以对角线的顺序存储,只存储非零元素;

在这里插入图片描述

  • 稀疏矩阵

三元组表示法(行、列、值)—顺序存储

矩阵中各非 0 元素的值;

所在矩阵中的行标和列标;

矩阵的总行数和总列数;

在这里插入图片描述

在这里插入图片描述

邻接表表示法

在这里插入图片描述

元素值+列下标(下标从0开始算);

十字链表表示法

矩阵中每个非零元可用一个含有5个域的结点来表示:

i,j,e 表示该非零元所在的行数,列数,元素值;

向右域 right 用以链接同一行中下一个非零元;

向下域 down 用以链接同一列中下一个非零元;

每个非零元同时是某个行列表或者列链表的结点,把一个矩阵转化成了一个十字交叉的链表。 可用两个一维数组来表示,分别存储行链表的头指针和列链表的头指针。 几行几个行链表,几列几个列链表,将所有行(列)链表的头节点各自存于一个一维数组中;

在这里插入图片描述

在这里插入图片描述

广义表

1、广义表的概念

广义表(列表): n (>=0 )个表元素组成的有限序列,

​ 记作LS = (a0, a1, a2, …, an-1)

LS是表名,ai 是表元素,它可以是表 (称为子表),可以是数据元素(称为原子);

n为表的长度。n = 0 的广义表为空表;

表头:若LS非空(n≥1),则第一个元素就是a0 表头;

​ 记作:head(LS)= a0

表尾:除表头外的其他元素组成的表;

​ 记作:tail(LS)= (a1, a2, …, an-1),表尾不是最后一个元素,而是一个子表;

A = ():A 表示一个广义表,只不过表是空的;

B = (e):广义表 B 中只有一个原子 e;

C = (a,(b,c,d)) :广义表 C 中有两个元素,原子 a 和子表 (b,c,d);

D = (A,B,C):广义表 D 中存有 3 个子表,分别是A、B和C。这种表示方式等同于 D = ((),(e), (a,(b,c,d)) );

an-1),表尾不是最后一个元素,而是一个子表;

A = ():A 表示一个广义表,只不过表是空的;

B = (e):广义表 B 中只有一个原子 e;

C = (a,(b,c,d)) :广义表 C 中有两个元素,原子 a 和子表 (b,c,d);

D = (A,B,C):广义表 D 中存有 3 个子表,分别是A、B和C。这种表示方式等同于 D = ((),(e), (a,(b,c,d)) );

E = (a,E):广义表 E 中有两个元素,原子 a 和它本身。这是一个递归广义表, 等同于:E = (a,(a,(a,…)));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值