您的位置:首页 > 理论基础 > 数据结构算法

数据结构笔记——第四章字符串和多维数组

2014-10-30 22:49 281 查看
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)稀疏矩阵的压缩存储方法有两种,分别是(三元组顺序表)和(十字链表)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: