4.1 字符串
4.1.1 字符串的定义
1、字符串的定义
字符串:是零个或者多个字符数组的有限序列。
空格传:只包含空格的串。
串中所包含的字符个数称为串的长度,长度为0的串称为空串。
子串:字符串中任意个连续的字符组成的子序列。
2、字符串的比较
通过组成串的字符之间的比较实现。
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;
}
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
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为指针域,指向同一列中的下一个三元组。