目录
串
基本知识
1.串是一种特殊的线性表,其特殊性体现在是一个字符(重点)。
串值也可以用链表来存储,由于串的元素数据是一个字符,只有8位二进制数,因此用链表存储时通常一个结点中存放的不是一个字符,而是一个子串。
2.当串的长度为0时,该串称为“空串”。
注意:当串由一个或多个空格组成时,则称为“空格串”,其长度为空格的数量。
3.由串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应的称为主串。
①空串是任意串的子串;
②任意串是其本身的子串;
③一个串中有n个元素,则有2^n-1种子串,有2^n-2种真子串。
例:a="BEI" ,b="JING" ,c="BEIJING" ,d="BEI JING" 四个串
子串:a和b都是c和d的子串
串长:【 3,4,7,8 】 a、b和c的串长为字符数量,d串中的空格同样作为元素计算长度
两串相等的判断:要求两个串对应位置的字符相等且串长相等。c和d不相等
两串比较:从第一个字符开始按照ASCII表进行对比,按ASCII值比较大小。
串的模式匹配算法
子串的定位运算通常称为串的模式匹配或串匹配
BF算法
BF算法设计思想:
将主串的第pos个字符和模式串的第一个字符比较;
若相等则逐个匹配后续字符,若不等则主串进入第pos+1个字符,模式串返回第一个字符重新比较;
直到主串中一个连续的子串与模式串完全相等,并返回两串匹配的第一个字符在主串中的序号;
若直到主串比较完毕依然没有符合的子串则匹配失败。
int Index_BF(SString &S,SString &T,int pos)
{
int i,j;
i=pos;
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;
}
KMP算法
KMP算法是在BF算法的思想上升级改造,最大的突破就是极大的减少了算法的时间复杂度
KMP算法设计思想:
将主串的第pos个字符和模式串的第一个字符比较;
若相等则逐个匹配后续字符,若不等则主串指针不回溯,模式串返回第一个字符重新比较;
直到主串中一个连续的子串与模式串完全相等,并返回两串匹配的第一个字符在主串中的序号;
若直到主串比较完毕依然没有符合的子串则匹配失败。
int Index_KMP(SString &S,SString &T,int pos)
{
int i,j;
i=pos;
j=1;
while(i<=S.length && j<=T.length)
{
if(j==0 || S.ch[i]==T.ch[j]){
++i;
++j;
}else{
j=1;
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
数组
基本知识
由类型相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受n个线性关系的约束,每个元素在n个线性关系中的序号i1,i2,i3…,in称为该元素的下标,可以通过下标访问该数据元素。(因为数组中每个元素处于n个关系中,故称该数组为n维数组)
由于对数组一般不进行插入或删除操作,所以使用顺序存储结构表示数组比较合适。
数组的顺序表示和实现用一组连续的存储单元存放数组的数据元素。
二维数组
在C语言中,一个二维数组类型可以定义为其分量类型为一维数组类型的一维数组。
即 typedef ElemType Array2[m][n];
等价于
typedef ElemType Array1[n];
typedef Array1 Array2[m];
二维数组的定义:
二维数组是数据元素为线性表的线性表。
数组的顺序表示和实现—二维
常用的映射方法有两种:
按行优先:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。
按列优先:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。
重点:(二维数组a[m][n],每个元素占b个长度,首地址a[0][0]为c,则第a[i][j]个元素的地址为length)
计算:
1. 按行优先 length=c+i*n*b+j*m*b
2. 按列优先 length=c+i*m*b+j*n*b
矩阵
矩阵用二维数组表示是很好的方法,若值相同的元素或者零元素在矩阵中的分布有一定规律,则称此类矩阵为特殊矩阵。特殊矩阵主要包括对称矩阵、三角矩阵和对角矩阵。
对称矩阵
若n阶矩阵A中的元满足条件:aij=aji(1<=i,j<=n) 则称为n阶对称矩阵。
假设以一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元aij之间存在一一对应的关系:
对于任意给定的一组下标(i,j),均可在 sa 中找到矩阵元 aij;反之,对所有的k =0,1,2,…,(n +1)*n/2-1,都能确定 sa[k]中的元在矩阵中的位置(i,j)。由此,称sa[n*(n1)/2]为n阶对称矩阵 A 的压缩存储。
三角矩阵
以对角线划分,三角矩阵分为上三角矩阵和下三角矩阵。
上三角矩阵是指矩阵下三角中的元均为常数的n阶矩阵,下三角矩阵与之相反。
下三角矩阵 上三角矩阵
sa[k]和矩阵元aij之间的关系:(一般研究有元素的位置信息)
(1)下三角矩阵
当矩阵中的第一个元素a11在存储空间中的位置k=0时,元素aij的存储空间
k = (i-1)*i/2+j-1
(2)上三角矩阵
当矩阵中的第一个元素a11在存储空间中的位置k=0时,元素aij的存储空间
k = (i-1)(2*n-i+2)/2+(j-i) //n为矩阵阶数
对角矩阵
对角矩阵所有的非零元都集中在以对角线为中心的带状区域中,即除了对角线上和直接在对角线上、下方若干条与对角线平行的线上的元之外,所有其他的元皆为零 。对这种矩阵,也可按某个原则(或以行为主,或以线的顺序)将其压缩存储到一维数组上。
如图非零元素均在对角线上,但零也可以在主对角线上
对角矩阵也是对称矩阵
以上这些特殊矩阵中,非零元的分布都有明显的规律,从而可以将其压缩存储到一维数组中,并找到每个非零元在一维数组中的对应关系