数据结构第5章_串和数组
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012-5-24
a 11 a 12 a 1n a 21 a 22 a 2n am1 am2 a 11 a 21 am1 a 12 a 22 am2 a 1n a 2n
(a) 以行为主序 (b) 以列为主序
17
上一页
下一页
回主目录
电子工程学院
• 二维数组A[1..m,1..n] 以行优先存储的地址计算公式: Loc(aij)=Loc(a11)+[(i1)n+(j1)]d 其中:d 是每个数据元素占用的存储单元数 以列优先存储的地址计算公式: Loc(aij)=Loc(a11)+[(j1)m+(i1)]d • 二维数组A[0..m,0..n] 数组下标的下界是0,每行具有n+1个元素。二维数组以行 优先存储的地址计算公式为: Loc(aij)=Loc(a00)+[i(n+1)+j]d • 二维数组A[c1..d1,c2..d2] 数组下标的下界任意,每行具有d2-c2+1个元素。二维数组 以行优先存储的地址计算公式为: Loc(aij)=Loc(ac1c2)+[(i-c1)(d2-c2+1)+(j-c2)]d
2012-5-24
上一页
下一页
回主目录
电子工程学院
9
3. 子串定位(模式匹配)
模式匹配是串处理中最重要的运算之一。 定义 在串中寻找子串(第一个字符)在串中的位置 词汇 在模式匹配中,子串称为模式,串称为目标。 示例 目标 S : ―Beijing‖ 模式 P : ―jin‖ 匹配结果 = 4
2012-5-24
上一页
下一页
回主目录
电子工程学院
16
5.5 数组的顺序存储结构
• 次序约定问题: –存储单元是一维的结构,而数组是 个多维的结构,那么用一组连续存 储单元如何存放数组的数据元素? • 二维数组的顺序存储: –以行为主序的优先存储;将数组元 素按行优先关系排列,第i+1行中 的数据元素紧跟在第i行中数据元 素的后面。同一行中元素以列下标 次序排列。 –以列为主序的优先存储:列为主序 的优先存储是将数组元素按列优先 关系排列,第j+1列中的数据元素 紧跟在第j列中数据元素的后面, 同一列中元素以行下标次序排列。
2012-5-24 13
上一页
下一页
回主目录
电子工程学院
5.4 数组的定义和运算
注意:这里讨论的数组与高级语言中的数 组的区别:高级语言中的数组是顺序结构; 而这里的数组既可以是顺序的,也可以是链 式结构,用户可根据需要选择。
2012-5-24
上一页
下一页
回主目录
电子工程学院
14
•
数组的定义 – 数组是由值与下标构成的有序对,结构中的 每一个数据元素都与其下标有关。 – 数组结构的性质:
2012-5-24
上一页
下一页
回主目录
电子工程学院
3
串的基本运算 1. 串赋值 strcopy(String &T,String S) 将串S的值赋给串变量T。 2. 串连接 strcat(String &S,String T) 将串T放在串S末尾。 3. 求串长 int strlen(String S) 4. 求子串 substr(String &Sub, String S,int i,int j) 从S中第i个字符开始的j个字符构成子串Sub。 5. 串比较 int strcmp(String S,String T) S>T:函数值大于0;S<T:函数值小于0;S==T:函数值等于 0 6. 串插入 insert(String &S,int i,String T) 将串T插入到串S的第i个字符之后。 7. 删除子串 delete(String &S,int i,int j) 从串S中删除第i个字符开始的连续j个字符。 8. 子串定位 int index(String S,String T) 串T在串S中首次出现的位置。 9. 置换 replace(String&S,int i,int j,String T) 用串T置换串S中第i个字符开始的连续j个字符。 2012-5-24 4
上一页 下一页 回主目录
电子工程学院
5.2
串的存储结构
串的存储方法与线性表类似,只是每个结点是单 个字符。 1. 顺序存储 每个串预先分配一个固定长度的存储区域, 实际串长可在所分配的固定长度区域内变动,在 串值后加入”\0‖表示结束。顺序存储适合对串中 的字符随机访问。 每个结点存放一个字符: 每个结点存放4个字符: 2. 链式存储 typedef struct linknode typedef struct linknode 链串的每个结点存放一个字符,存储密度较 { char data; { char data[4]; 低。为了提高存储密度,每个结点可以存放多个 struct linklist*next; struct linklist*next; 字符。链式存储适合对串中的字符插入、删除。 }linkstring; }linkstring;
a 00 a 11
0
0
0 a n -1 ,n -2 (a ) (b )
a n -2 ,n -1 a n -1 ,n -1
0
a n -1 ,n -1
(a) 一般情形
2012-5-24
(b) 三对角矩阵 下一页 回主目录
(c)最简单的对角矩阵
19
上一页
电子工程学院
•
采用一维数组压缩存储最简单的对角矩阵,只存放 主对角线上的元素。 A[k]=aij k=i=j (0≤k,i,j≤n-1) • 采用一维数组压缩存储三对角矩阵。 A[2i+j]=aij 0≤i≤n-1,i≤j≤i(下标从0开始) A[2(i-1)+j]= aij 1≤i≤n,i≤j≤i(下标从1开始) 例:
2012-5-24
上一页
下一页
回主目录
电子工程学院
5
3. 索引存储
建立串名与串值之间对应关系的索引表。串 值采用顺序存储结构,索引表存放串名、串起始 地址、串长度或串尾地址。 例如,有2个串:s1=―work‖ ,s2=―day‖
地址 串值 500 504
… w o r k d a y …
串名 始地址 串长度 串名 始地址 尾地址
上一页 下一页 回主目录
电子工程学院
•
Amn=
a 11 a 21 a m1
a 12 a 22 a m2
a 1n a 2n a mn
• 数组的存储结构
从理论上讲,数组结构也可以使用两种存储结 构,即顺序存储结构和链式存储结构。然而,由 于数组结构没有插入、删除元素的操作,所以使 用顺序存储结构更为适宜。
3 4 2 3 7 5 6 8 0 9
2012-5-24
上一页
下一页
回主目录
电子工程学院
10
朴素的模式匹配算法(穷举的模式匹配算法): 设S=s1,s2,…,sn(主串)T=t1,t2,…,tm(模式串) 其中0<m≤n i为指向S中字符的指针,j为指向T中字符的指针 若si≠tj,匹配失败; 若 (si-j+1 … si-1)=(t1 … tj-1),匹配成功 算法简单,但效率不高,重复回溯太多,时间复 杂度为O(m*n)
(1)数据元素数目固定 一旦说明了一个数组结构, 其元素数目不再有增减变化; (2)数据元素具有相同的类型; (3)数据元素的下标关系具有上下界的约束并且下标 有序。
数组有两种运算 – 给定一组下标,存取相应的数据元素; – 给定一组下标,修改相应数据元素中的某个 数据项的值。 2012-5-24 15
2012-5-24
上一页
下一页
回主目录
电子工程学院
11
朴素的模式 匹配过程
第1趟
S
T 第2趟 S T 第3趟 S T 第4趟 S T
2012-5-24
a || a a
a b a b a × a b a a b b a b a × a b a a b b a b a || || || a b a
索引表பைடு நூலகம்
s1 s2
500 504
4 3
s1 s2
500 504
503 506
2012-5-24
上一页
下一页
回主目录
电子工程学院
6
5.3
串运算的实现
5.3.1 基本运算的实现(串的顺序存储) 顺序串的类型定义: #define maxsize 100 typedef struct { char ch[maxsize]; int len; }seqstring; seqstring*S;
2012-5-24
上一页
下一页
回主目录
电子工程学院
18
5.6 矩阵的压缩存储
5.6.1 特殊矩阵 对于值相同的元素或者零元素在矩阵中的 分布具有一定规律的矩阵,称之为特殊矩阵。 1. 对角矩阵:所有的非零元素都集中在以主对角线 为中心的带状区域中。
a 00 0 a 10 a 01 a 11 a 12 0
电子工程学院 12
b || b b
b a b a
×
上一页
下一页
回主目录
int Index(seqstring*S, seqstring*T) //顺序串的朴素模式匹配 { i=1; j=1; //位序从1开始 while(i<=S->len&&j<=T->len) if(S->ch[i-1]==T->ch[j-1]) { i++; j++; } //继续比较后面的字符 else { i=i-j+2; j=1; } //本趟不匹配,设置下一趟匹配的起始 位序 if(j>T->len) return(i-T->len); //匹配成功 else return(-1); //匹配不成功 }
串及其运算
串:由多个或零个字符组成的有限序列 ,记作 S =―c1c2c3…cn‖ (n>=0) 其中,S是串名,c1c2c3…cn是串值,ci是串中字符,n是串的长 度,表示串中字符的数目。 空串:零个字符的串称为空串 子串:串中任意个连续的字符组成的子序列 主串:包含子串的串 字符在串中的位置:字符在序列中的序号 子串在串中的位置:子串的第一个字符在主串中的位置 空格串:由一个或多个空格组成的串 串的表示:用一对双引号括起来,这里约定为双引号 串的操作:以“串的整体”作为操作对象
2012-5-24
上一页
下一页
回主目录
电子工程学院
7
1. 串连接 将两个串首尾相接,连成一个新串。
void StrCat(seqstring*&S,seqstring*S1,seqstring*S2) //用S返回由S1和S2联接而成的新串 { if(S1->len+S2->len>maxsize) { print(―上溢”); exit(0); } else { for (i=0;i<S1->len;i++) S->ch[i]=S1->ch[i]; //将S1串传给S for (i=0;i<S2->len;i++) S->ch[S1->len+i]=S2->ch[i]; //将S2串添加到S之后 S->ch[S1->len+i]=‗\0‘; //在S末尾赋‘\0‘ S->len=S1->len+S2->len; //串长度是两串长度之和 } } 2012-5-24
第5章 串和数组
2012-5-24
上一页
下一页
回主目录
电子工程学院
1
第5章 串和数组
5.1 串及其运算 5.2 串的存储结构 5.3 串运算的实现 5.4 数组的定义和运算 5.5 数组的顺序存储结构 5.6 矩阵的压缩存储 习题
2012-5-24
上一页
下一页
回主目录
电子工程学院
2
5.1
上一页 下一页 回主目录
电子工程学院
8
2. 求子串 从主串的第i个字符起,取j个字符构成子串。
void SubString(seqstring*&T,seqstring*S,int i,int j) //用T返回串S的第i个字符开始长度为j的子串 { if (i<1 || j>S->len || j<0 ||j>S->len-i+1) { printf(―越界”); exit(0); } else { for (int k=0; k<j; k++) T->ch[k]=S->ch[i+k-1]; //将子串的字符串给T T->len=j; //将子串的长度赋给T T->ch[T->len]=‗\0‘; //在T末尾赋‘\0‘ } }
a 11 a 12 a 1n a 21 a 22 a 2n am1 am2 a 11 a 21 am1 a 12 a 22 am2 a 1n a 2n
(a) 以行为主序 (b) 以列为主序
17
上一页
下一页
回主目录
电子工程学院
• 二维数组A[1..m,1..n] 以行优先存储的地址计算公式: Loc(aij)=Loc(a11)+[(i1)n+(j1)]d 其中:d 是每个数据元素占用的存储单元数 以列优先存储的地址计算公式: Loc(aij)=Loc(a11)+[(j1)m+(i1)]d • 二维数组A[0..m,0..n] 数组下标的下界是0,每行具有n+1个元素。二维数组以行 优先存储的地址计算公式为: Loc(aij)=Loc(a00)+[i(n+1)+j]d • 二维数组A[c1..d1,c2..d2] 数组下标的下界任意,每行具有d2-c2+1个元素。二维数组 以行优先存储的地址计算公式为: Loc(aij)=Loc(ac1c2)+[(i-c1)(d2-c2+1)+(j-c2)]d
2012-5-24
上一页
下一页
回主目录
电子工程学院
9
3. 子串定位(模式匹配)
模式匹配是串处理中最重要的运算之一。 定义 在串中寻找子串(第一个字符)在串中的位置 词汇 在模式匹配中,子串称为模式,串称为目标。 示例 目标 S : ―Beijing‖ 模式 P : ―jin‖ 匹配结果 = 4
2012-5-24
上一页
下一页
回主目录
电子工程学院
16
5.5 数组的顺序存储结构
• 次序约定问题: –存储单元是一维的结构,而数组是 个多维的结构,那么用一组连续存 储单元如何存放数组的数据元素? • 二维数组的顺序存储: –以行为主序的优先存储;将数组元 素按行优先关系排列,第i+1行中 的数据元素紧跟在第i行中数据元 素的后面。同一行中元素以列下标 次序排列。 –以列为主序的优先存储:列为主序 的优先存储是将数组元素按列优先 关系排列,第j+1列中的数据元素 紧跟在第j列中数据元素的后面, 同一列中元素以行下标次序排列。
2012-5-24 13
上一页
下一页
回主目录
电子工程学院
5.4 数组的定义和运算
注意:这里讨论的数组与高级语言中的数 组的区别:高级语言中的数组是顺序结构; 而这里的数组既可以是顺序的,也可以是链 式结构,用户可根据需要选择。
2012-5-24
上一页
下一页
回主目录
电子工程学院
14
•
数组的定义 – 数组是由值与下标构成的有序对,结构中的 每一个数据元素都与其下标有关。 – 数组结构的性质:
2012-5-24
上一页
下一页
回主目录
电子工程学院
3
串的基本运算 1. 串赋值 strcopy(String &T,String S) 将串S的值赋给串变量T。 2. 串连接 strcat(String &S,String T) 将串T放在串S末尾。 3. 求串长 int strlen(String S) 4. 求子串 substr(String &Sub, String S,int i,int j) 从S中第i个字符开始的j个字符构成子串Sub。 5. 串比较 int strcmp(String S,String T) S>T:函数值大于0;S<T:函数值小于0;S==T:函数值等于 0 6. 串插入 insert(String &S,int i,String T) 将串T插入到串S的第i个字符之后。 7. 删除子串 delete(String &S,int i,int j) 从串S中删除第i个字符开始的连续j个字符。 8. 子串定位 int index(String S,String T) 串T在串S中首次出现的位置。 9. 置换 replace(String&S,int i,int j,String T) 用串T置换串S中第i个字符开始的连续j个字符。 2012-5-24 4
上一页 下一页 回主目录
电子工程学院
5.2
串的存储结构
串的存储方法与线性表类似,只是每个结点是单 个字符。 1. 顺序存储 每个串预先分配一个固定长度的存储区域, 实际串长可在所分配的固定长度区域内变动,在 串值后加入”\0‖表示结束。顺序存储适合对串中 的字符随机访问。 每个结点存放一个字符: 每个结点存放4个字符: 2. 链式存储 typedef struct linknode typedef struct linknode 链串的每个结点存放一个字符,存储密度较 { char data; { char data[4]; 低。为了提高存储密度,每个结点可以存放多个 struct linklist*next; struct linklist*next; 字符。链式存储适合对串中的字符插入、删除。 }linkstring; }linkstring;
a 00 a 11
0
0
0 a n -1 ,n -2 (a ) (b )
a n -2 ,n -1 a n -1 ,n -1
0
a n -1 ,n -1
(a) 一般情形
2012-5-24
(b) 三对角矩阵 下一页 回主目录
(c)最简单的对角矩阵
19
上一页
电子工程学院
•
采用一维数组压缩存储最简单的对角矩阵,只存放 主对角线上的元素。 A[k]=aij k=i=j (0≤k,i,j≤n-1) • 采用一维数组压缩存储三对角矩阵。 A[2i+j]=aij 0≤i≤n-1,i≤j≤i(下标从0开始) A[2(i-1)+j]= aij 1≤i≤n,i≤j≤i(下标从1开始) 例:
2012-5-24
上一页
下一页
回主目录
电子工程学院
5
3. 索引存储
建立串名与串值之间对应关系的索引表。串 值采用顺序存储结构,索引表存放串名、串起始 地址、串长度或串尾地址。 例如,有2个串:s1=―work‖ ,s2=―day‖
地址 串值 500 504
… w o r k d a y …
串名 始地址 串长度 串名 始地址 尾地址
上一页 下一页 回主目录
电子工程学院
•
Amn=
a 11 a 21 a m1
a 12 a 22 a m2
a 1n a 2n a mn
• 数组的存储结构
从理论上讲,数组结构也可以使用两种存储结 构,即顺序存储结构和链式存储结构。然而,由 于数组结构没有插入、删除元素的操作,所以使 用顺序存储结构更为适宜。
3 4 2 3 7 5 6 8 0 9
2012-5-24
上一页
下一页
回主目录
电子工程学院
10
朴素的模式匹配算法(穷举的模式匹配算法): 设S=s1,s2,…,sn(主串)T=t1,t2,…,tm(模式串) 其中0<m≤n i为指向S中字符的指针,j为指向T中字符的指针 若si≠tj,匹配失败; 若 (si-j+1 … si-1)=(t1 … tj-1),匹配成功 算法简单,但效率不高,重复回溯太多,时间复 杂度为O(m*n)
(1)数据元素数目固定 一旦说明了一个数组结构, 其元素数目不再有增减变化; (2)数据元素具有相同的类型; (3)数据元素的下标关系具有上下界的约束并且下标 有序。
数组有两种运算 – 给定一组下标,存取相应的数据元素; – 给定一组下标,修改相应数据元素中的某个 数据项的值。 2012-5-24 15
2012-5-24
上一页
下一页
回主目录
电子工程学院
11
朴素的模式 匹配过程
第1趟
S
T 第2趟 S T 第3趟 S T 第4趟 S T
2012-5-24
a || a a
a b a b a × a b a a b b a b a × a b a a b b a b a || || || a b a
索引表பைடு நூலகம்
s1 s2
500 504
4 3
s1 s2
500 504
503 506
2012-5-24
上一页
下一页
回主目录
电子工程学院
6
5.3
串运算的实现
5.3.1 基本运算的实现(串的顺序存储) 顺序串的类型定义: #define maxsize 100 typedef struct { char ch[maxsize]; int len; }seqstring; seqstring*S;
2012-5-24
上一页
下一页
回主目录
电子工程学院
18
5.6 矩阵的压缩存储
5.6.1 特殊矩阵 对于值相同的元素或者零元素在矩阵中的 分布具有一定规律的矩阵,称之为特殊矩阵。 1. 对角矩阵:所有的非零元素都集中在以主对角线 为中心的带状区域中。
a 00 0 a 10 a 01 a 11 a 12 0
电子工程学院 12
b || b b
b a b a
×
上一页
下一页
回主目录
int Index(seqstring*S, seqstring*T) //顺序串的朴素模式匹配 { i=1; j=1; //位序从1开始 while(i<=S->len&&j<=T->len) if(S->ch[i-1]==T->ch[j-1]) { i++; j++; } //继续比较后面的字符 else { i=i-j+2; j=1; } //本趟不匹配,设置下一趟匹配的起始 位序 if(j>T->len) return(i-T->len); //匹配成功 else return(-1); //匹配不成功 }
串及其运算
串:由多个或零个字符组成的有限序列 ,记作 S =―c1c2c3…cn‖ (n>=0) 其中,S是串名,c1c2c3…cn是串值,ci是串中字符,n是串的长 度,表示串中字符的数目。 空串:零个字符的串称为空串 子串:串中任意个连续的字符组成的子序列 主串:包含子串的串 字符在串中的位置:字符在序列中的序号 子串在串中的位置:子串的第一个字符在主串中的位置 空格串:由一个或多个空格组成的串 串的表示:用一对双引号括起来,这里约定为双引号 串的操作:以“串的整体”作为操作对象
2012-5-24
上一页
下一页
回主目录
电子工程学院
7
1. 串连接 将两个串首尾相接,连成一个新串。
void StrCat(seqstring*&S,seqstring*S1,seqstring*S2) //用S返回由S1和S2联接而成的新串 { if(S1->len+S2->len>maxsize) { print(―上溢”); exit(0); } else { for (i=0;i<S1->len;i++) S->ch[i]=S1->ch[i]; //将S1串传给S for (i=0;i<S2->len;i++) S->ch[S1->len+i]=S2->ch[i]; //将S2串添加到S之后 S->ch[S1->len+i]=‗\0‘; //在S末尾赋‘\0‘ S->len=S1->len+S2->len; //串长度是两串长度之和 } } 2012-5-24
第5章 串和数组
2012-5-24
上一页
下一页
回主目录
电子工程学院
1
第5章 串和数组
5.1 串及其运算 5.2 串的存储结构 5.3 串运算的实现 5.4 数组的定义和运算 5.5 数组的顺序存储结构 5.6 矩阵的压缩存储 习题
2012-5-24
上一页
下一页
回主目录
电子工程学院
2
5.1
上一页 下一页 回主目录
电子工程学院
8
2. 求子串 从主串的第i个字符起,取j个字符构成子串。
void SubString(seqstring*&T,seqstring*S,int i,int j) //用T返回串S的第i个字符开始长度为j的子串 { if (i<1 || j>S->len || j<0 ||j>S->len-i+1) { printf(―越界”); exit(0); } else { for (int k=0; k<j; k++) T->ch[k]=S->ch[i+k-1]; //将子串的字符串给T T->len=j; //将子串的长度赋给T T->ch[T->len]=‗\0‘; //在T末尾赋‘\0‘ } }