第四章 字符串,多维数组和广义表

来源:互联网 发布:和大学老师啪啪知乎 编辑:程序博客网 时间:2024/05/18 09:19

       第四章 字符串,多维数组和广义表

一、字符串的逻辑结构

1.字符串:0个或多个字符组成的有限序列,是以单个字符为数据元素的线性表

 空格串:只包含空格的串

 空串:长度为0的串

 非空串记作:S="s1 s2...sn";S是串名,""是定界符,""内的部分是串值,串中字符位置和序号从1开始

2.字符串的常用操作

(1)strLength(s);求串长,返回串S的长度(字符的个数)

(2)strAssign(s1,s2);赋值,将串s2的值赋给串s1

(3)strConcat(s1,s2,s);字符串连接,将串s2连在s1后形成新串s

(4)subStr(s,i,len);求子串,返回从串s的第i个字符开始的len个字符

(5)strCmp(s1,s2);字符串比较,若s1=s2返回0,若s1>s2返回1,若s1<s2返回-1,具体是通过比较字符编码确定字符串的大小

(6)strIndex(s,t);子串定位,若t是s的子串返回t首次出现的位置,若t不是s的子串返回0

(7)strInsert(s,i,t);字符串插入,将串t插入到串s中第i个位置

(8)strDelete(s,i,len);字符删除,删除串s中从第i个字符开始的len个字符

(9)strRep(s,t,r);子串替换,在主串s中,用串r替换所有的子串t

 

 

 

 

 

二、字符串的存储结构

1.字符串有顺序存储结构和链接存储结构,一般都采用顺序存储

2.模式匹配

  2.1 模式匹配:给定主串S和子串(模式)T,在主串S中寻找模式T的过程称为模式匹配,若匹配成功返回子串位置,若失败返回0

  2.2 模式匹配中采用的字符串存储方式:顺序存储,数组下标从0开始存放字符,串尾存储终结符'\0'

  2.3 模式匹配的算法:朴素的模式匹配(BF)算法;改进的模式匹配(KMP)算法

     2.3.1 BF算法

       主串和子串都要进行回溯,效率偏低,若主串长度为n,模式长度为m,则最好情况时间复杂度为O(n+m),最坏情况O(n*m)

     2.3.2 KMP算法

       (1)基本思想:主串不回溯,只回溯子串

       (2)子串回溯的原理:如果某趟在S[i]和T[j]匹配失败后,将子串下标j回溯到某个位置k,下一趟将比较从S[i]和T[k]开始  

       (3)模式T中的每个字符T[j]都对应一个k值,这个k值只与子串有关,而与主串无关,用next[j]表示T[j]对应的k值

       (4)next[j]的求法

       

       (5)KMP算法的时间复杂度是O(n+m)   




三、多维数组的逻辑结构

1.数组:是由类型相同的数据元素构成的有序集合

2.数组的特点:结构中的元素本身可以具有某种结构,但属于同一数据类型,例如:一维数组可看做是一个线性表,二维数组可看做元素是线性表的线性表,依此类推,数组是线性表的推广

3.数组中通常只有两种操作:存取和修改,它们本质上只对应一种操作--寻址

4.数组一般不能执行插入和删除操作,所以采用顺序存储结构

5.采用顺序存储结构存储二维数组时,需要将二维结构映射到一维结构,常用的映射方法有两种:按行优先和按列优先;

6.二维数组中任一元素的存储地址

LOC()=基地址+从基地址(包含)到(不包含)的元素个数×每个元素所占存储单元数

 

 

 

 

四、多维数组的存储结构

     特殊矩阵:有很多相同元素并存在一定规律的矩阵,如对称矩阵、三角矩阵、对角矩阵

     稀疏矩阵:有很多0元素的矩阵

1.压缩存储的基本思想:为相同元素只分配一个存储空间;对0元素不分配存储空间

2.对称矩阵的压缩存储方式

    (1)存储方式:只为下三角(包括主对角线)元素分配空间,需要1+2+…+n=n*(n+1)/2个存储单元;

     (2)将下三角中的元素按行优先存储到一维数组中,则元素(i>=j)在数组中的下标k与i,j的关系为k=i*(i+1)/2+j-1

3.三角矩阵的压缩存储方式

    (1)下三角矩阵:主对角线以上均为常数

         上三角矩阵:主对角线以下均为常数

    (2)存储方式:对下三角矩阵的压缩存储,除了为下三角(包括主对角线)元素分配空间,还要为主对角线以上的常数分配一个空间,需要n*(n+1)/2+1个存储单元;

4.对角矩阵的压缩存储

   (1)对角矩阵:所有非0元素都集中在以主对角线为中心的带状区域,其他元素都为0 

   (2)存储方式:按行存储非0元素,按其压缩规律,找到相应的映像函数,例三对角矩阵压缩存储后的映像函数为k=2*i+j-3

5.稀疏矩阵的压缩存储

   (1)三元组:行号、列号、非0元素值

     三元组表:将稀疏矩阵的非0元素对应的三元组所构成的集合按行优先排列成的一个线性表

   (2)稀疏矩阵的压缩存储就是对三元组表的存储

   (3)三元组表的两种存储结构:三元组顺序表、十字链表




五、广义表

1.广义表:n个数据元素的有限序列,直接元素可以是一个单元素,也可以是一个广义表(子表)

2.广义表的相关概念

  表长:广义表中的直接元素个数;      

  表头:非空广义表中的首元素;      

  表尾:广义表中除表头外的其它部分;任何一个非空广义表的表尾必定是一个广义表    

  深度:广义表中括号最大嵌套层数;     

  空表:长度为零的表。 

3.广义表的操作

  (1)取表头元素(Head):取表中的首元素,注意要的是元素

  (2)取表尾元素(Tail):取表中除首元素外的剩余部分组成的表(加括号),注意要的是表

4.示例:

     (1)广义表L=(a,(b),((c,(d))))的长度是 3  

     (2)广义表L=(a,(b),((c,(d))))的深度是 4   

     (3)广义表L=((),L),则L的深度是     ∞       

     (4)广义表L=(a,(b),((c,(d))))的表尾是  ((b),((c,(d))))

     (5)广义表L= ((a,b,c)),则将c分离出来的运算是 head(tail(tail(head(L))))

     (6)若广义表L满足Head(L)=Tail(L),则L的形式为: 若L=(a1,..,an)则a1=(a2,...,an)

     (7)广义表 L= (a,(b,c,d)),则:Head(C)=a;Tail(C)=((b,c,d));Head(Tail(C))=(b,c,d); Tail (Tail(C))=(); 

      c=Head(Tail(Head(Tail(C))))    

0 0
原创粉丝点击