4.1 字符串
4.1.1 字符串的定义
1、字符串的定义
字符串:是零个或者多个字符数组的有限序列。
空格传:只包含空格的串。
串中所包含的字符个数称为串的长度,长度为0的串称为空串。
子串:字符串中任意个连续的字符组成的子序列。
2、字符串的比较
通过组成串的字符之间的比较实现。
给定两个字符串:
X=“x1x2.....xn”
Y= “y1y2......ym”
则当n=m且x1=y1,.....xn=ym时,称X=Y。
当下列条件之一成立时,称X<Y:
(1)n<m,且xi=yi(i=1,2,...,n)
(2)存在某个k<=min(m,n),使得xi=yi(i=1,2,3....,k-1),xk<yk.
4.1.2 字符串的存储结构
字符串是数据元素为单个字符的线性表,一般采用顺序存储。
一般有三种方法表示串的长度:
(1)用一个变量来表示串的长度。
(2)在串尾存储一个不会在串中出现的特殊字符作为字符串的终结符。
(3)用数组的0号单元存放串的长度,串值从1号单元开始存放。
4.1.3 模式匹配
给定两个字符串S=“s1s2...sn”和 T= “t1t2...tm”,在主串S中寻找子串T的过程称为模式匹配。T称为模式。如果匹配成功,返回T在S中的位置;匹配失败返回0.
1、朴素的模式匹配算法BF
Int BF(char S[],char T[])
{
i=0;j=0;
While((s[i]!=’\0’)&&(T[j]!=’\0’))
{
if(S[i]==T[j]){i++.j++}
else {i=i-j+1;j=0;}
}
If(T[j]== ‘\0’) return(i-j+1);
Else return 0;
}
2、改进的模式匹配算法
抓住两个特征:
(1)T[0]~T[k-1]=s[i-k]~s[i-1]
(2)T[j-k]~t[j-1]=s[i-k]~s[i-1]
可得:
T[0]~T[k-1]=T[j-k]~T[j-1]
说明模式中的每一个字符T[i]都对应一个k的值,这个k值仅依赖与模式本身字符序列的构成,与主串无关。用next[j]表示T[j]对应的k值(0<=j<m)
-1 j=0
next[j]= max {k|1<=k<j且T[0]....T[k-1]=T[j-k]....T[j-1]}
0 其他情况
4.2 多维数组
4.2.1 数组的定义
数组是由类型相同的是数据元素构成的有序集合。
特点:数据元素本身可以具有某种结构,但属于同一数据类型。
数组是一个具有固定格式和数量的数据集合,在数组上一般不能执行插入或删除某个数组元素的操作。
(1)读操作:给定一组下标,读取相应的数组元素。
(2)写操作:给定一组下标,存储或修改相应的数组元素。
其本质对应一种操作——寻址:根据一组下标定位相应的数组元素。
4.2.2 数组的存储结构与寻址
二维数组的每个元素含有两个下标,需要将二维关系映射为一维关系。映射方法:
(1)以行序为主序
(2)以列序为主序
按行优先存储的基本思想:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。
按列优先存储的基本思想:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。
4.3 矩阵的压缩存储
一些阶数很高的矩阵同时在矩阵中有很多零元素——称为稀疏矩阵。
压缩存储的基本思想:1)为多个值相同的元素只分配一个存储空间;2)对零元素不分配存储空间。
4.3.1 对称矩阵的压缩存储
对称矩阵关于主对角线对称,so只需要存储下三角部分,在n*n个存储单元里只需要n*(n+1)/2个存储单元,
方法:将所有元素存入数组SA,其下标与i、j的关系:k=i*(i-1)/2+j-1
而上三角中的元素aij=aji,k=j*(j-1)/2+i-1
4.3.2 三角矩阵的压缩存储
相当于矩阵斜切的一半,共存储n*(n+1)/2+1个元素,下三角中对于任意元素aij在SA中的下标k与i、j的对应关系:
i*(i-1)/2+j-1 i>=j
k=
n*(n+1)/2 i<j
上三角中:
(i-1)*(2*n-i+2)/2+j-i
k=
n*(n+1)/2
4.3.3 对角矩阵的压缩存储
所有非零元素都集中在以主对角线为中心的带状区域,除了主对角线和它的上下若干条对角线的元素外,所有其他元素都为0.
一个m*n的w对角矩阵(w是占有非零元素的对角线的个数,也称带宽),1)将其压缩到m行w列的二维数组B中,aij映射为bts的关系:
t=i
s=j-i+2
2)将对角矩阵压缩存储到一位数组C中去,按行存储其非零元素,
4.3.4 稀疏矩阵的压缩存储
稀疏矩阵:零元素居多的矩阵
三元组:行号,列号,非零元素值。
其结构体类型:
template<class T>
struct element
{
int row,col;
T item;
};
1、三元组顺序表
存储定义:
const int MaxTerm=100;
struct SparseMatrix
{
element data[MaxTerm];
int mu,nu,tu;
};
2、十字链表
定义:稀疏矩阵的链接存储结构。
基本思想:将每个非零元素对应的三元组存储为一个链接结点,结点由5个域组成。
element 为数据域,存储非零元素对应的三元组。
right为指针域,指向同一行中的下一个三元组。
down为指针域,指向同一列中的下一个三元组。
本章总结:
习题:
(1)字符串是一种特殊的线性表,其特殊性体现在(数据元素的类型是一个字符)
(2)两个字符串相等的充分必要条件是(长度相同且对应位置的字符相等)
(3)数组通常只有两种运算:(存取)和(修改),这决定了数组通常采用(顺序存储)结构来实现存储。
(4)二维数组A中行下标是10~20,列下标是5~10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是(1140)。
(5)设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个地址空间,则元素A[8][5]的存储地址为(d+41)
(6)稀疏矩阵的压缩存储方法有两种,分别是(三元组顺序表)和(十字链表)。