第四章 字符串 和多维数组

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为指针域,指向同一列中的下一个三元组。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值