数据结构-串,数组/矩阵/广义表
一.串
串是一种特殊的线性表,其特殊型体现在数据元素可以是多个字符
1.模式匹配
两个串p和q,求q在p中首次出现的位置
2.KMP匹配
正文串长度为n,模式串长度为m,则串匹配的KMP算法的时间复杂度为0(m+n)
3.next,nextval
(1)next:前两个为0,从第三个开始,next值为前面字符串前后相同匹配最长的子串的长度+1
(2)nextval(第一个为0):
i=1→…
模式串p[i] a a a b c a a
next为ki 0 1 ? ? ? ? ?
nextval(i) 0 ? ? ? ? ? ?
nextval[i]取值:
p[ki]与p[i]比较
①相等用旧的val[ki],②不相等用k
相等用你的,不相等抢你人
二.数组
三.矩阵
1.矩阵
矩阵第一个元素(左上角)为a₀₀
特殊矩阵和稀疏矩阵
对一些特殊矩阵采用压缩存储的目的主要是为了减少不必要的存储空间的开销
2-1特殊矩阵
①对称
只须存放对称矩阵中包括主对角线在内的下(或上)三角部分的元素即可
②三角
③对角
只须存放对角矩阵中的非零元素即可
2-2 稀疏矩阵
绝大多数元素都为0的矩阵(分布无规律)
考点
1:稀疏矩阵压缩存储后,必会失去随机存取功能。
因为矩阵中,非零元素的分布没有规律。
压缩存储将每一个非零元素的值和它所在的行、列号做为一个结点存放在一起。
这样的结点组成的线性表中叫三元组表。
它已不是简单的向量,所以无法用下标直接存取矩阵中的元素。
2-2-1顺序存储-三元组
三元组(i,j,a)
三元组数据结构为一个长度为n,表内每个元素都分别表示行标,列标,元素值
有3个分量(值,行/列下标)的线性表
trimat[k].val;表示取第k个非零元素的值
带行表的三元组:
RowTabi表示第i行之前的所有行的非零元数。
第一行( RowTab[0])由于是第一行,之前没有非零元素,所以对应为0;
如行表02335表示矩阵
第1行有两个元素(因为2行之前有两个元素);
第2行有一个元素;
第3行没有元素;
第4行有两个元素
考点:
1:三元组(i,j,a)转置后为(j,i,a)
2-2-1顺序存储-伪地址法
元素在矩阵中按照行优先或者列优先的相对位置存储
伪地址:元素在矩阵中按照行优先或者列优先存储的相对位置
2-2-2链式存储
(1)邻接表
每一行的非零元素串连成一个链表
(2)十字链表
每一行,列 都用一个带头结点的链表表示
3.广义表
表元素可以是原子或者广义表的一种线性表的扩展结构
1.概念
(1)长度
表中最上层元素的个数
(2)深度
表中括号的最大层数
(3)表头,表尾
(非空时)第一个元素为广义表的表头
其余元素组成的表是广义表的表尾
空表():长度为0,深度为1
无元素
表(()):长度为1,深度为2
有一个元素(空表),该元素指向NULL
可分解得到其表头,表尾均为空表
原子:深度为0
2.存储结构
2-1头尾链表(课本109页)
(1)裹挟元素(同一层)
(2)指向元素
①原子,直接指向(如→a)
②表⇒执行(1)
A=()
⇒A=NULL(无元素,无裹挟)
D(())
⇒D=[1,NUll,*](一个元素,元素指向NULL)
见02年试卷
(2)扩展线性链表
①裹挟表头元素(一定存在)
(一层)②指向表头元素(可能无),再指向其他元素
A=()
⇒A=[1,NUll,*](裹挟表头,表头元素无,指向NULL)