第四章 字符串,多维数组和广义表
来源:互联网 发布:和大学老师啪啪知乎 编辑:程序博客网 时间: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))))
- 第四章 字符串,多维数组和广义表
- 第五章:多维数组和广义表
- 多维数组和广义表
- 数据结构复习——第四章:串、多维数组和广义表
- 数据结构 第四章 字符串和多维数组
- 数据结构 第四章 字符串和多维数组
- 数据结构 第四章 字符串和多维数组
- 第四章字符串和多维数组
- 第四章:字符串和多维数组
- 第四章:字符串和多维数组
- 第四章 字符串和多维数组
- 第四章 字符串和多维数组
- 第四章《字符串和多维数组》总结
- 第四章 字符串 和多维数组
- 第四章 字符串和多维数组
- 第四章字符串和多维数组
- 第四章 字符串和多维数组
- 数据结构第四章字符串和多维数组
- Thrift使用实例
- 互联网金融进入洗礼阶段,控制风险是制胜之道
- CScrollView
- Akka 【四】 Supervision and Monitoring
- ReadString在UNICODE/多字节下中文乱码的解决办法
- 第四章 字符串,多维数组和广义表
- IOS的一个带动画的多项选择的控件(一)
- Ubuntu中文字体难看修正
- 关于git的ssh-key:解决本地多个ssh-key的问题
- IOS 软键盘灵活使用KeyBoard库
- switch分支结构————分段函数求值
- 树莓派的基本连接和启动
- POJ 1915: Knight Moves
- source insight 工具使用