数据结构串数组和广义表课件教学内容
合集下载
数据结构课程chap05数组和广义表

基本操作:
InitArray(&A, n, bound1, ..., boundn) DestroyArray(&A) Value(A, &e, index1, ..., indexn) Assign(&A, e, index1, ..., indexn)
InitArray(&A, n, bound1, ..., boundn)
①-④: A.12 B. 66 C. 72 D. 96 E. 114 F. 120
G. 156 H. 234 I. 276 J. 282 K. 283 L. 288
⑤: A.行与列的上界相同
B. 行与列的下界相同
C. 行与列的上、下界都相同 D. 行的元素个数与列的元素个 数相同
LJCIC
练习
一n×n的三角矩阵A=[aij]如下:
R={R1, R2, ..., Rn} Ri={<a , a > | j1,... ji,... jn j1, ...ji +1, ...jn 0 jk bk -1, 1 k n 且k i, 0 ji bi -2, i=2,...,n } 基本操作:
} ADT Array
1) 零值元素占了很大空间; 2) 计算中进行了很多和零值的运算,
遇除法,还需判别除数是否为零。
解决问题的原则:
1) 尽可能少存或不存零值元素;
2) 尽可能减少没有实际意义的运算;
3) 操作方便。 即: 能尽可能快地找到与
下标值(i,j)对应的元素, 能尽可能快地找到同
一行或同一列的非零值元。
有两类稀疏矩阵:
1) 特殊矩阵 非零元在矩阵中的分布有一定规则
例如: 三角矩阵 对角矩阵
数据结构之数组与广义表课件PPT课件

对称矩阵有n*n个元素,但只存储n*(n+1)/2 个元素即可. 若以行序为主序,把下三角中的 元素,存储在一个一维数组SA[n*(n+1)/2] 中, 则 A[i,j] 和SA[k] 的对应关系如下:
若 i>=j , 则A[i, j]在下三角中,A[i, j]之前共有 1+2+……+i+j = i*(i+1)/2+j 个元素,因此有
2
3 -1
3
1
-1
6
4
5
2
8
6
1
5
7
6
9
7 7 7
t: 1 3 -1
165 212 258 3 1 -1 634 679
➢ 基本思想:
把S转置成T,就是把S中的每一个三元组的 行号和列号(row 和col)交换,并存储在T 中。但是,这样的结果是按列优先存储的稀 疏矩阵T,所以,还必须重新排列三元组的 顺序。
3.稀疏矩阵的压缩存储
➢ 若一个m*n矩阵,有s个非0元素, 记 e=s/(m*n) e 称为稀疏因子。 当 e0.05时,则称为稀疏矩阵。
例: M=
0 2 -1 0 0 0 0 0000000 -1 0 0 0 0 4 0 0000000 0800000 5000000 0000090
➢ 在稀疏矩阵中,非0元素的排列无规律,所以不 能采用以前的压缩方法。
1. 一维数组的寻址公式
对于一维数组,若其第一个元素的首地
址为Loc(a0),下标为 i 的数组元素A[i]的地
址为Loc(ai),
a a 则 Loc( i) = Loc( 0) + k * i
( 0≤i≤n-1)
数据结构第5章数组和广义表2广义表ppt课件PPT精品文档33页

所以在对应的存储结构中,其存储结点也有相应划分。 对于原子结点,应包含值域; 对于表结点,应包含指示表头的表头指针域(指向
表中的第一个元素)和指示表尾的表尾指针域(指向除 去原表头元素后的广义表)。
4)D=( A , B ,C )
n=3,3个元素都是子表
5)E=(a, E)
n=2,a 为原子,E为子表
D=(A,B,C)=(( ),(e),(a,(b,c,d))),共享表
E=(a,E)=(a,(a,E))= (a,(a,(a,…….))),E为递归表
§5.4 广义表的类型定义
❖试用图形表示下列广义表
§5.4 广义表的类型定义 ❖广义表的特点
▪ 可共享
广义表的元素可以为其他广义表所共享 A = ( a , B ) =( a , ( b , c , d ) )
§5.4 广义表的类型定义
❖例1:求下列广义表的长度
1)A =( )
n=0,因为A是空表
2)B = ( e )
n=1,表中元素e是原子
3)C =( a ,( b , c , d ) ) n=2,a 为原子,(b, c, d)为子表
6. GetHead{ ( ( ) ) }= ( ) .
7. GetTail{ ( ( ) ) }= ( ) .
(a, b)
§5.4 广义表的类型定义 ❖注意:( )和( ( ) )的区别
前者为空表,长度=0,深度=1; 后者长度=1,深度=2,表头、表尾均为( )
§5.5 广义表的存储结构
❖广义表的存储结构
§5.4 广义表的类型定义
❖广义表的特点
▪ 有深度
广义表的深度定义为广义表中括弧的最大重数
如: H = (d, (e,( )))深度为3 注意:(1)空表的深度为1;
表中的第一个元素)和指示表尾的表尾指针域(指向除 去原表头元素后的广义表)。
4)D=( A , B ,C )
n=3,3个元素都是子表
5)E=(a, E)
n=2,a 为原子,E为子表
D=(A,B,C)=(( ),(e),(a,(b,c,d))),共享表
E=(a,E)=(a,(a,E))= (a,(a,(a,…….))),E为递归表
§5.4 广义表的类型定义
❖试用图形表示下列广义表
§5.4 广义表的类型定义 ❖广义表的特点
▪ 可共享
广义表的元素可以为其他广义表所共享 A = ( a , B ) =( a , ( b , c , d ) )
§5.4 广义表的类型定义
❖例1:求下列广义表的长度
1)A =( )
n=0,因为A是空表
2)B = ( e )
n=1,表中元素e是原子
3)C =( a ,( b , c , d ) ) n=2,a 为原子,(b, c, d)为子表
6. GetHead{ ( ( ) ) }= ( ) .
7. GetTail{ ( ( ) ) }= ( ) .
(a, b)
§5.4 广义表的类型定义 ❖注意:( )和( ( ) )的区别
前者为空表,长度=0,深度=1; 后者长度=1,深度=2,表头、表尾均为( )
§5.5 广义表的存储结构
❖广义表的存储结构
§5.4 广义表的类型定义
❖广义表的特点
▪ 有深度
广义表的深度定义为广义表中括弧的最大重数
如: H = (d, (e,( )))深度为3 注意:(1)空表的深度为1;
数据结构-串、数组和广义表课件

BF算法描述(算法4.1)
int Index(Sstring S,Sstring T,int pos){ i=pos; j=1; while (i<=S[ 0 ] && j <=T[ 0 ]){ if ( S[ i ]=T[ j ]) { ++i; ++j; } else{ i=i-j+2; j=1; } if ( j>T[ 0 ]) return i-T[0]; else return 0;
KMP算法设计思想(了解)
利用已经部分匹配的结果而加快模式串的滑动速度? 且主串S的指针i不必回溯!可提速到O(n+m)!
i
S=‘a b a b c a b c a c b a b’
T=‘a b c a c’
ii
i
k
S=‘a b a b c a b c a c b a b’
T=‘a b c a c’
//串拷贝
(7) StrEmpty(S)
//串判空
(8) ClearString (&S)
//清空串
(9) Index(S,T,pos)
//子串的位置
(10) Replace(&S,T,V)
//串替换
(11) StrInsert(&S,pos,T)
//子串插入
(12) StrDelete(&S,pos,len)
链式存储表示
head
ABCD
head
A
B
EFGH
I###
C
#define CHUNKSIZE 80 //可由用户定义的块大小 typedef struct Chunk{
数据结构课件PPT数组和广义表

T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if (T.tu)
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==col ) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } }
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==col ) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } }
第四章串、数组和广义表PPT课件

第14页/共68页
4.1.4 串的存储结构
• 串的链式存储表示 串的链式存储结构和线性表的串的链式存储结构类似,采用单链表来存储串,结
点的构成是:
• data域:存放字符,data域可存放的字符个数称为结点的大小; • next域:存放指向下一结点的指针。
first
a
b
g∧
• 若每个结点仅存放一个字符,则结点的指针域就非常多,造成系统空间浪费,为
基本思想:从主串S的第一个字符开始和模式T 的第一个字符进行比较,若相等,则继续比较两者的后续字符; 否则,从主串S的第二个字符开始和模式T 的第一个字符进行比较,重复上述过程,直到T 中的字符全部比 较完毕,则说明本趟匹配成功;或S中字符全部比较完,则说明匹配失败。
• 模式匹配问题的特点: • ⑴ 算法的一次执行时间不容忽视:问题规模通常很大,常常需要在大量信息中进行匹配; • ⑵ 算法改进所取得的积累效益不容忽视:模式匹配操作经常被调用,执行频率高。
第26页/共68页
4.1.4 匹配模式——BP算法
例:主串S="ababcabcacbab",模式T="abcac"
i
第 ababcabcacbab
5
趟
abcac
j
i=5,j=1失败; i“回溯”到6,j回溯到1
第27页/共68页
4.1.4 匹配模式——BP算法
例:主串S="ababcabcacbab",模式T="abcac"
• 定长顺序存储表示:将串定义成字符数组,利用串名可以直接访问串 值。用这种表示方式,串的存储空间在编译时确定,其大小不能改变。
• 堆分配存储方式:仍然用一组地址连续的存储单元来依次存储串中的 字符序列,但串的存储空间是在程序运行时根据串的实际长度动态分 配的。
4.1.4 串的存储结构
• 串的链式存储表示 串的链式存储结构和线性表的串的链式存储结构类似,采用单链表来存储串,结
点的构成是:
• data域:存放字符,data域可存放的字符个数称为结点的大小; • next域:存放指向下一结点的指针。
first
a
b
g∧
• 若每个结点仅存放一个字符,则结点的指针域就非常多,造成系统空间浪费,为
基本思想:从主串S的第一个字符开始和模式T 的第一个字符进行比较,若相等,则继续比较两者的后续字符; 否则,从主串S的第二个字符开始和模式T 的第一个字符进行比较,重复上述过程,直到T 中的字符全部比 较完毕,则说明本趟匹配成功;或S中字符全部比较完,则说明匹配失败。
• 模式匹配问题的特点: • ⑴ 算法的一次执行时间不容忽视:问题规模通常很大,常常需要在大量信息中进行匹配; • ⑵ 算法改进所取得的积累效益不容忽视:模式匹配操作经常被调用,执行频率高。
第26页/共68页
4.1.4 匹配模式——BP算法
例:主串S="ababcabcacbab",模式T="abcac"
i
第 ababcabcacbab
5
趟
abcac
j
i=5,j=1失败; i“回溯”到6,j回溯到1
第27页/共68页
4.1.4 匹配模式——BP算法
例:主串S="ababcabcacbab",模式T="abcac"
• 定长顺序存储表示:将串定义成字符数组,利用串名可以直接访问串 值。用这种表示方式,串的存储空间在编译时确定,其大小不能改变。
• 堆分配存储方式:仍然用一组地址连续的存储单元来依次存储串中的 字符序列,但串的存储空间是在程序运行时根据串的实际长度动态分 配的。
大学数据结构课件--第5章 数组和广义表
a 32 a 33 a 34 0 0
a 43 a 44 a 45 0
a 54 a 55 a 56 a 65 a 66
5.3.2 稀疏矩阵
稀疏矩阵的存储:如何表示非零元素的位置信息 1. 三元组表:每个元素用一个三元组(i,j,v)来表示。 i j v
0 1 6 1 1 6 2 3 8 12 9
2
3 4 5 6 7 8
2
5.2 数组的顺序表示和实现
a00 a00 a10 a01 存储单元是一维结构,而数组是个多维结构 , …… …… 则用一组连续存储单元存放数组的数据元素就有 am-1,0 a0,n-1 个次序约定问题。 a01 a10
a11
……
a11
……
二维数组可有两种存储方式: am-1,1 a1,n-1
……
K=
i*n-i(i-1)/2+j-i n(n+1)/2
当 i≤j 当i>j
0 a11 ... a1n-1 ... ... ... ... 0 0 0 an-1n-1
当i ≤ j时,a[i][j]是非零元素, a[i][j]前面有i行,共有n+(n-1)+(n-2)+…(n-(i-1))
=i(n+[n-(i-1)])/2=i*n-i(i-1)/2个元素,a[i][j]前面有j列,共j-i个非零元素,
A m× n
( a10 a11 … a1,n-1 )
=
注:
( … … …… ) ( am-1,0 am-1,2 … am-1,n-1 ) ( ( ( (
① 数组中的元素都具有统一的类型; ② 数组元素的下标一般都具有固定的上界和下界,即数组一旦 被定义,它的维数和维界就不再发生改变; ③ 数组的基本操作简单:初始化、销毁、存取元素和修改元素值
数据结构(C)严蔚敏(数组与广义表)PPT课件
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
Data Structure
03.12.2020
Page 5
按行序为主序存放
0
1
n-1
Am×n
=
a00 a10 ...
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
列向量
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若各下标不超界,则e赋值为所指定的A的元素值,并返回OK。
Assign(&A, e, index1, ..., indexn)
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若下标不超界,则将 e 的值赋给A中指定下标的元素。
a00 a10 ……. am-1,1 a01 a11 …….. am-1,1 ………. a0,n-1 a1,n-1 …….. am-1 ,n-1
Page 7
按行序为主序存放
0
Am×n
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I
串的模式匹配算法
算法目的:
确定主串中所含子串第一次出现的位置(定位)
算法种类:
•BF算法(又称古典的、经典的、朴素的、穷举的) •KMP算法(特点:速度快)
i
BF算法设计思想
S :ababcabcacbab
•
T :abc j
i指针回溯
S :ababcabcacbab T : abc
S :ababcabcacbab T : abc
//串拷贝
(7) StrEmpty(S)
//串判空
(8) ClearString (&S)
//清空串
(9) Index(S,T,pos)
//子串的位置
(10) Replace(&S,T,V)
//串替换
(11) StrInsert(&S,pos,T)
//子串插入
(12) StrDelete(&S,pos,len)
k
i
S=‘a b a b c a b c a c b a b’ T=‘a b c a c’
k
串操作应用举例--文本编辑
• 文本可被看作一个字符串,称为文本串 • 页则是文本串的子串 • 行又是页的子串。
页表
行表
页号 起始行号
行号 起始地址 长度
………… …………
4.2 数组
《数据结构》所讨论的数组与高级语言中的数组区别: • 高级语言中的数组是顺序结构; • 而本章的数组既可以是顺序的,也可以是链式结构, 用户可根据需要选择。
链式存储表示
head
ABCD
head
A
B
EFGH
I###
C
...
I
链式存储表示
#define CHUNKSIZE 80 //可由用户定义的块大小 typedef struct Chunk{
char ch[CHUNKSIZE]; struct Chunk *next; }Chunk;
typedef struct{
数组的抽象数据类型
ADT Array {
数据对象:
ji0,b i1 ,i1, 2 ,n,
D{ajj2jn| a E j1j2jn lemSet
数据关系: R {a ,a 1
j1 ji jn j1 ji1 jn
|
0jk bk 1, 1kn,且ki,
0ji bk 2,
aj1jijn,aj1ji1jn D,i 2,,n}
BF算法设计思想
Index(S,T,pos)
• 将主串的第pos个字符和模式的第一个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串的下一字符起,重新与模式的第一 个字符比较。
• 直到主串的一个连续子串字符序列与模式相等 。 返回值为S中与T匹配的子序列第一个字符的序号, 即匹配成功。
• 否则,匹配失败,返回值 0
Chunk *head,*tail; //串的头指针和尾指针
int curlen;
//串的当前长度
}LString;
链式存储表示
优点:操作方便 缺点:存储密度较低
存储密度 串值所占的存储位 实际分配的存储位
可将多个字符存放在一个结点中,以克服其缺点
head
ABCD
EFGH
I###
head
A
B
C
...
KMP算法设计思想(了解 )
利用已经部分匹配的结果而加快模式串的滑动速度? 且主串S的指针i不必回溯!可提速到O(n+m)!
i
S=‘a b a b c a b c a c b a b’
T=‘a b c a c’
ii
i
k
S=‘a b a b a b c a c b a b’
T=‘a b c a c’
串(String)----零个或多个字符组成的有限序列
s'a1a2an'
串名
串值
串长
n 空串
n=0
a=‘BEI’, b=‘JING’ c=‘BEIJING’ d=‘BEI JING’
子串 主串 字符位置 子串位置 串相等 空格串
串的抽象数据类型
ADT String {
数据对象: D { a i|a i Chae,rit a 1 ,2 ,c ,tn ,e n r0S} 数据关系: R 1 { a i 1 ,a i |a i 1 ,a i D ,i 1 ,2 , ,n } 基本操作:
}
BF算法时间复杂度
例: S=‘0000000001’,T=‘0001’,pos=1
若n为主串长度,m为子串长度,最坏情况是 ✓主串前面n-m个位置都部分匹配到子串的最后一 位,即这n-m位各比较了m次 ✓最后m位也各比较了1次
总次数为:(n-m)*m+m=(n-m+1)*m 若m<<n,则算法复杂度O(n*m)
(1) StrAssign (&T,chars) (2) StrCompare (S,T) (3) StrLength (S) (4) Concat(&T,S1,S2)
//串赋值 //串比较 //求串长 //串联
(5) SubString(&Sub,S,pos,len) //求子串
(6) StrCopy(&T,S)
BF算法描述(算法4.1)
int Index(Sstring S,Sstring T,int pos){ i=pos; j=1; while (i<=S[ 0 ] && j <=T[ 0 ]){ if ( S[ i ]=T[ j ]) { ++i; ++j; } else{ i=i-j+2; j=1; } if ( j>T[ 0 ]) return i-T[0]; else return 0;
基本操作:
(1) InitArray (&A,n,bound1, boundn)
//构造数组A
(2) DestroyArray (&A)
// 销毁数组A
(3) Value(A,&e,index1,…,indexn) //取数组元素值
//子串删除
(13) DestroyString(&S)
//串销毁
}ADT String
串的存储结构
顺序存储 链式存储
顺序存储表示
typedef struct{ char *ch;
int length; }HString;
//若串非空,则按串长分配存储区, //否则ch为NULL //串长度
数据结构串数组和广义表课件
第4章 串、数组和广义表
1. 了解串的存储方法,理解串的两种模式匹配 算法,重点掌握BF算法。
2. 明确数组和广义表这两种数据结构的特点, 掌握数组地址计算方法,了解几种特殊矩阵 的压缩存储方法。
3.掌握广义表的定义、性质及其GetHead和 GetTail的操作。
4.1 串