概述
第四章字符串和多维数组
本章的基本内容是:
串的存储结构及模式匹配算法数组的逻辑结构特征
数组的存储结构及寻址方法特殊矩阵和稀疏矩阵的压缩存储方法字符串的定义
字符串:零个或多个字符组成的有限序列。简称串串长度:串中所包含的字符个数。
空格串:只包含空格的串。
空串:长度为0的串,记为:"
"。
非空串通常记为:
S=" s1 s2 ……
sn "
其中:S是串名,双引号是定界符,双引号引起来的部分是串值,si(1≤i≤n)是一个任意字符。
字符串的定义
串的数据对象约束为某个字符集。
•微机上常用的字符集是标准ASCII码,由 7
位二进制数表示一个字符,总共可以表示 128 个字符。扩展ASCII码
由 8 位二进制数表示一个字符,总共可以表示 256 个字符,足够表示英语和一些特殊符号,但无法满足国际需要。
•Unicode由 16 位二进制数表示一个字符,总共可以表示
216个字符,即6万5千多个字符,能够表示世界上所有语言的所有字符,包括亚洲国家的表意字符。为了保持兼
容性,Unicode字符集中的前256个字符与扩展ASCII码完全相同。
字符串的定义
子串:串中任意个连续的字符组成的子序列。
主串:包含子串的串。
子串的位置:子串的第一个字符在主串中的序号。
S1="ab12cd " //长度为6的串
S2= “ab12” //长度为4的串
S3= “26138” //长度为5的串
S4=“ab12φ” //长度为5的串
S5= “” //空串,长度为0
S6= "φφφ " //含3个空格的空格串,长度为3
字符串的定义
串的比较:通过组成串的字符之间的比较来进行的。给定两个串:X="x1x2…xn"和Y=“y1y2…ym”,则:
-
当n=m且x1=y1,…,xn=ym时,称X=Y;
-
当下列条件之一成立时,称X<Y:
⑴ n<m且xi=yi(1≤ i≤n);
⑵存在k≤min(m,n),使得xi=yi(1≤i≤k-1)且xk<yk。
例:S1="ab12cd
",S2=“ab12”,S3="ab13“
“串值大小”是按“词典次序”进行比较的。
串的抽象数据类型定义
⑴
StrLength
(s):求串s的长度。
⑵
StrAssign
(s1, s2):赋值,将s2的值赋值给串s1。
⑶
StrConcat
(s1, s2, s):连接,将串s2放在串s1的后面连接成一个新串s。
⑷
SubStr
(s, i, len):求子串,返回从串s的第i个字符开始取长为 len 的子串。
⑸
StrCmp
(s1, s2):串比较,若s1=s2,返回0;若 s1<s2,
返回-1;若s1>s2, 返回1。
⑹
StrIndex
(s, t):定位,返回子串t在主串s中首次出现的位置。若t不是s的子串,则返回0。
串的抽象数据类型定义
⑺
StrInsert
(s, i, t):插入,将串t插入到串s中的第i个位置。
⑻
StrDelete
(s, i, len):删除,在串s中删除从第i个字符开始的连续len个字符。
⑼
StrRep
(s, t, r):替换,在串s中用串r替换所有与串t
相等的子串。
与其他数据结构相比,串的操作对象有什么特点?
串的操作通常以串的整体作为操作对象。
串的抽象数据类型定义
模式匹配问题的特点:
⑴算法的一次执行时间不容忽视:问题规模通常很
大,常常需要在大量信息中进行匹配;
⑵算法改进所取得的积累效益不容忽视:模式匹配操作经常被调用,执行频率高。
模式匹配——BF算法
设串S长度为n,串T长度为m,在匹配成功的情况下,考虑两种极端情况:坏情况:不成功的匹配都发生在串T的 后一个字符。
设匹配成功发生在si处,则在i-1趟不成功的匹配中共比较了(i-1)×m次,第i趟成功的匹配共比较了m次,所以总共比较了i×m次,因此
p i( × m) == O n( × m) i=1
模式匹配——KMP算法
KMP算法是模式匹配算法的一种改进算法,是D.E.Knuth与
J.H.Morris和V.R.Pratt 同时发现的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。
为什么BF算法时间性能低?
在每趟匹配不成功时存在大量回溯,没有利用已经部分匹配的结果。
字符串
KMP算法用伪代码描述
在串S和串T中分别设比较的起始下标i和j;
循环直到S中所剩字符长度小于T的长度或T中所有字符均比较完毕
2.1 如果S[i]=T[j],继续比较S和T的下一个字符;否则
2.2 将j向右滑动到next[j]位置,即j=next[j];
2.3 如果j=0,则将i和j分别加1,准备下一趟比较;
如果T中所有字符均比较完毕,则返回匹配的起始下标;否则返回0;
字符串
求模式串T的next函数值算法
void GetNext(char T[ ],
int next[ ])
{
next[1]=0;
j=1; k=0;
while (j<T[0]) if ((k==0)| |(T[j]= =T[k])) { j++; k++; next[j]=k;
}
else k=next[k];
}
数组的定义
数组是由一组类型相同的数据元素构成的有序集合,每个数据元素称为一个数组元素(简称为元素),每个元素受n(n≥1)个线性关系的约束,每个元素在n个线性关系中的序号i1、i2、…、in称为该元素的下标,并称该数组为 n 维数组。
数组的特点
¾元素本身可以具有某种结构,属于同一数据类型;
¾数组是一个具有固定格式和数量的数据集合。
特殊矩阵和稀疏矩阵
特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。
稀疏矩阵:矩阵中有很多零元素。
压缩存储的基本思想是:
⑴为多个值相同的元素只分配一个存储空间;
⑵对零元素不分配存储空间。特殊矩阵的压缩存储——对称矩阵
最后
以上就是彩色雨为你收集整理的@第 四 章的全部内容,希望文章能够帮你解决@第 四 章所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复