数据结构第五章
数据结构第5章 串和广义表

5.1 串的定义和基本运算
• (4)串的连接StrCat(S,T)。 • 初始条件:串S和T存在。 • 操作结果:将串T的值连接在串S的后面。 • (5)求子串SubString(Sub,S,pos,len)。 • 初始条件:串S存在,1≤pos≤StrLength(S)且
1≤len≤StrLength(S)-pos+1。 • 操作结果:用Sub返回串S的第pos个字符起长度为len的
1≤len≤StrLength(S)-pos+1。 • 操作结果:从串S中删除第pos个字符起长度为len的子串。 • (9)串的替换StrReplace(S,T,V)。 • 初始条件:串S,T和V存在,且T是非空串。 • 操作结果:用V替换串S中出现的所有与T相等的不重叠子
串。 • (10)判断串空StrEmpty(S)。 • 初始条件:串S存在。 • 操作结果:若串S为空串,则返回1;否则返回0。
• (1)非紧凑存储。设串S="Hello boy",计算机字长为32 位(4个Byte),用非紧凑格式一个地址只能存一个字符, 如图5-2所示。其优点是运算处理简单,但缺点是存储空 间十分浪费。
• (2)紧凑存储。同样存储S="Hello boy",用紧凑格式一 个地址能存四个字符,如图5-3所示。紧凑存储的优点是 空间利用率高,缺点是对串中字符处理的效率低。
•}
5.3 串的基本运算的实现
• (3)求子串操作。求串S从第pos位置开始,长度为len的 子串,并将其存入到串Sub中。操作成功返回1,不成功 返回0。其算法描述如下:
• int SubString(String *S,String *Sub,int pos,int len)
数据结构第五章 数组与广义表

压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组Sa[n(n+1)/2]作为n阶对称矩阵A的存 储结构,且约定以行序为主序存储各个元素,则在Sa[k]和矩
阵元素aij之间存在一一对应关系: (下标变换公式)
i(i+1)/2 + j 当i≥j k = j(j+1)/2 + i 当i<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]; }
分析算法FastTransposeSMatrix的时间 复杂度:
for (col=1; col<=M.nu; ++col) … … for (t=1; t<=M.tu; ++t) … … for (col=2; col<=M.nu; ++col) … … for (p=1; p<=M.tu; ++p) … …
//对当前行中每一个非零元
处
brow=M.data[p].j;
理
if (brow < N.nu ) t = N.rpos[brow+1];
M
else { t = N.tu+1 }
的
for (q=N.rpos[brow]; q< t; ++q) { ccol = N.data[q].j; // 乘积元素在Q中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:
数据结构第5章课件 中国石油大学(华东)

二叉链表
leftChild
data rightChild
22
二叉树的链表表示(三叉链表)
每个结点增加一个指向双亲的指针parent,使 得查找双亲也很方便。
leftChild data parent rightChild
三叉链表
data
leftChild
27
BinTreeNode *LeftChild (BinTreeNode *current ) { return (current != NULL )? current->leftChild :NULL; } BinTreeNode *RightChild (BinTreeNode *current ) { return ( current!= NULL) ? current->rightChild : NULL; } int Height( ){return Height(root);} int Size( ){return Size(root);} BinTreeNode *GetRoot ( ) const { return root; } void preOrder( ) {preOrder(root);} //前序遍历 void inOrder( ) {inOrder(root);} //中序遍历 void postOrder( ) {postOrder(root);} //后序遍历 void levelOrder( ) ; // 不需要递归,所以直接对外接 口调用即可。层序遍历 28
b
f
c
d
g
6
e
a
b.嵌套集合表示法: b 根据树的集合定义,写出集合划分。 { a, {b,{e},{f}}, {c}, {d,{g}} } e c d
《数据结构与算法》第五章-数组和广义表学习指导材料

《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。
数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。
图5.1是一个m行n列的二维数组。
5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。
通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。
对于一维数组按下标顺序分配即可。
对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
例如一个2×3二维数组,逻辑结构可以用图5.2表示。
以行为主序的内存映象如图5.3(a)所示。
分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。
数据结构第5章

第5章:数组和广义表 1. 了解数组的定义;填空题:1、假设有二维数组A 6×8,每个元素用相邻的6个字节存储,存储器按字节编址。
已知A 的起始存储位置(基地址)为1000,则数组A 的体积(存储量)为 288 B ;末尾元素A 57的第一个字节地址为 1282 。
2、三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。
2. 理解数组的顺序表示方法会计算数组元素顺序存储的地址;填空题:1、已知A 的起始存储位置(基地址)为1000,若按行存储时,元素A 14的第一个字节地址为 (8+4)×6+1000=1072 ;若按列存储时,元素A 47的第一个字节地址为 (6×7+4)×6+1000)=1276 。
(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A 57可知,是从0行0列开始!) 2、设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 8950 。
答:不考虑0行0列,利用列优先公式: LOC(a ij )=LOC(a c 1,c 2)+[(j-c 2)*(d 1-c 1+1)+i-c 1)]*L 得:LOC(a 32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=8950选择题:( A )1、假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为 。
(无第0行第0列元素)A .16902B .16904C .14454D .答案A, B, C 均不对 答:此题(57列×60行+31行)×2字节+10000=16902( B )2、设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素a i,j (i ≤j), 在一维数组B 中下标k 的值是:A .i(i-1)/2+j-1B .i(i-1)/2+jC .i(i+1)/2+j-1D .i(i+1)/2+j3、从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。
数据结构——第五章查找:01静态查找表和动态查找表

数据结构——第五章查找:01静态查找表和动态查找表1.查找表可分为两类:(1)静态查找表:仅做查询和检索操作的查找表。
(2)动态查找表:在查询之后,还需要将查询结果为不在查找表中的数据元素插⼊到查找表中;或者,从查找表中删除其查询结果为在查找表中的数据元素。
2.查找的⽅法取决于查找表的结构:由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查找。
为了提⾼查找效率,需要在查找表中的元素之间⼈为地附加某种确定的关系,⽤另外⼀种结构来表⽰查找表。
3.顺序查找表:以顺序表或线性链表表⽰静态查找表,假设数组0号单元留空。
算法如下:int location(SqList L, ElemType &elem){ i = 1; p = L.elem; while (i <= L.length && *(p++)!= e) { i++; } if (i <= L.length) { return i; } else { return 0; }}此算法每次循环都要判断数组下标是否越界,改进⽅法:加⼊哨兵,将⽬标值赋给数组下标为0的元素,并从后向前查找。
改进后算法如下:int Search_Seq(SSTable ST, KeyType kval) //在顺序表ST中顺序查找其关键字等于key的数据元素。
若找到,则函数值为该元素在表中的位置,否则为0。
{ ST.elem[0].key = kval; //设置哨兵 for (i = ST.length; ST.elem[i].key != kval; i--) //从后往前找,找不到则返回0 { } return 0;}4.顺序表查找的平均查找长度为:(n+1)/2。
5.上述顺序查找表的查找算法简单,但平均查找长度较⼤,不适⽤于表长较⼤的查找表。
若以有序表表⽰静态查找表,则查找过程可以基于折半进⾏。
算法如下:int Search_Bin(SSTable ST, KeyType kval){ low = 1; high = ST.length; //置区间初值 while (low <= high) { mid = (low + high) / 2; if (kval == ST.elem[mid].key) { return mid; //找到待查元素 } else if (kval < ST.elem[mid].key) { high = mid - 1; //继续在前半区间查找 } else { low = mid + 1; //继续在后半区间查找 } } return 0; //顺序表中不存在待查元素} //表长为n的折半查找的判定树的深度和含有n个结点的完全⼆叉树的深度相同6.⼏种查找表的时间复杂度:(1)从查找性能看,最好情况能达到O(logn),此时要求表有序;(2)从插⼊和删除性能看,最好情况能达到O(1),此时要求存储结构是链表。
《数据结构》第五章习题参考答案

《数据结构》第五章习题参考答案一、判断题(在正确说法的题后括号中打“√”,错误说法的题后括号中打“×”)1、知道一颗树的先序序列和后序序列可唯一确定这颗树。
( ×)2、二叉树的左右子树可任意交换。
(×)3、任何一颗二叉树的叶子节点在先序、中序和后序遍历序列中的相对次序不发生改变。
(√)4、哈夫曼树是带权路径最短的树,路径上权值较大的结点离根较近。
(√)5、用一维数组存储二叉树时,总是以前序遍历顺序存储结点。
( ×)6、完全二叉树中,若一个结点没有左孩子,则它必是叶子结点。
( √)7、一棵树中的叶子数一定等于与其对应的二叉树的叶子数。
(×)8、度为2的树就是二叉树。
(×)二、单项选择题1.具有10个叶结点的二叉树中有( B )个度为2的结点。
A.8 B.9 C.10 D.112.树的后根遍历序列等同于该树对应的二叉树的( B )。
A. 先序序列B. 中序序列C. 后序序列3、二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG 。
该二叉树根的右子树的根是:( C )A. EB. FC. GD. H04、在下述结论中,正确的是( D )。
①具有n个结点的完全二叉树的深度k必为┌log2(n+1)┐;②二叉树的度为2;③二叉树的左右子树可任意交换;④一棵深度为k(k≥1)且有2k-1个结点的二叉树称为满二叉树。
A.①②③B.②③④C.①②④D.①④5、某二叉树的后序遍历序列与先序遍历序列正好相反,则该二叉树一定是( D )。
A.空或只有一个结点B.完全二叉树C.二叉排序树D.高度等于其结点数三、填空题1、对于一棵具有n个结点的二叉树,对应二叉链接表中指针总数为__2n____个,其中___n-1_____个用于指向孩子结点,___n+1___个指针空闲着。
2、一棵深度为k(k≥1)的满二叉树有_____2k-1______个叶子结点。
数据结构-第5章--数组练习题

数据结构-第5章--数组练习题第5章数组一、选择题3.设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为(A)。
A.BA+141B.BA+180C.BA+222D.BA+2254.假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=(A)。
A.808B.818C.1010D.10205.数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是()。
1195A.1175B.1180C.1205D.12107.将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1‥298]中,A中元素A6665(即该元素下标i=66,j=65),在B数组中的位置K为()。
供选择的答案:A.198B.195C.1972+64某3=19410.若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(iA.i某(i-1)/2+jB.j某(j-1)/2+iC.i某(i+1)/2+jD.j某(j+1)/2+i11.设A是n某n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij(1≤i,j≤n,且i≤j)在B中的位置为(C)。
A.i(i-l)/2+jB.j(j-l)/2+iC.j(j-l)/2+i-1D.i(i-l)/2+j-112.A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是(AB)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.三角矩阵 (1)上三角矩阵 即矩阵上三角部分元素是随机的,而下三角部分元素全部 相同(为某常数C或全为0),具体形式见图5-2(a)。 (2)下三角矩阵 即矩阵的下三角部分元素是随机的,而上三角部分元素全 部相同(为某常数C或全为0),具体形式见图5-2(b)。
2012年11月1日
2012年11月1日
12
5.3.1 特殊矩阵
2 3 1 A= 5 4 2 4 6 3
图5-1 一个对称矩阵
1.对称矩阵 若一个n阶方阵A中元素满足下列条件: aij=aji 其中0≤i, j≤n-1,则称A为对称矩阵。 例如,如图5-1所示是一个3×3的对称矩阵。
0
1
2
3
4
5
6
7
……
n ( n +1 ) 2
-3
n ( n +1 ) 2
-2
n ( n +1 ) -1 2
a00 a01 a02 a03 a04 a05 a06 a07
……
an-2n-2
an-2n-1
an-1n-1
2012年11月1日
(b)上三角矩阵的压缩存储形式 图5-5 对称矩阵及用上三角压缩存储
第5章 多维数组和广义表
本章学习内容
5.1 多维数组
5.2 多维数组的存储结构
5.3 特殊矩阵及其压缩存储
5.4 稀疏矩阵
5.5 广义表
2012年11月1日 1
5.1 多维数组
5.1.1 多维数组的概念
1.一维数组
一维数组可以看成是一个线性表或一个向量(第2章中 已经介绍),它在计算机内是存放在一块连续的存储 单元中,适合于随机查找。
(a)一个下三角矩阵
19
0
1
2
3
4
5
6
7
…
n ( n +1 ) 2
-3
n ( n +1 ) 2
-2
n ( n +1 ) 2
-1
a00 a10 a11 a20 a21 a22 a30 a31 …
an-1n-3
an-1n-2
an-1n-1
(b)下三角矩阵的压缩存储形式 图5-4 对称矩阵及用下三角压缩存储
a 01 a 11
a m -11
a 0 n -1 a 1 n -1 a m -1 n - 1
3
在此,可以将二维数组A看成是由m个行向量[X0,X1,…, Xm-1]T组成,其中,Xi=( ai0, ai1, …,ain-1), 0≤i≤m-1; 也可以将二维数组A看成是由n个列向量[y0, y1, …,yn-1] 组成,其中 yi=(ai0, a1i, …,am-1i),0≤i≤n-1。由此可 知二维数组中的每一个元素最多可有两个直接前驱和两个 直接后继(边界除外),故是一种典型的非线性结构。
14
a 00 a 01 ... c ... c a 0 n a 00 1 a c 10 a 11 ... c a 11 ... a 1 n 1 ... ... ... ... ... ... ... ... a c n 10 a n ... a n n 11 1 1 c c a n n 1 1 (a)上三角矩阵 (b)下三角矩阵 图5-2 三角矩阵
23
这时s[k]与a[i][j]的对应关系可以按下面的方法推出: 当i≤j时,aij在上三角部分中,前面的行号从0~i-1,共有i行, 第0行有n个元素,第1行有n-1个元素,…,第i-1行有n-(i-1) 个元素,因此,前面i行共有n+n-1+…+n-(i-1)=i*n-个元素, 而aij是本行第j-i个元素,故k=i*n-+j-i。
2012年11月1日
20
这时s[k]与a[i][j]的对应关系为: i(i+1)/2+j 当 i≥j k= j(j+1)/2+i 当 i<j
上面的对应关系读者很容易推出: 当i≥j时,aij在下三角部分中,aij前面有i行,共有1+2+3+…+i 个元素,而aij是第i行的第j个元素,即有 k=1+2+3+…+i+j=i(i+1)/2+j。 当i<j时,aij在上三角部分中,但与aji对称,故只需在下三角 部分中找aij即可,故只需将i与j交换即可,即k=j(j+1)/2+i。
但是,将n阶对称方阵压缩存放到一个向量空间s[0]到 s[n(n+1)/2-1] 中,我们怎样找到s[k]与a[i][j]的一一对应关系 呢?使我们在s[k]中能直接找到a[i][j]。
20放且分两种方式讨论:
(1)只存放下三角部分 由于对称矩阵关于主对角线对称,故我们只需存放主对角线 及主对角线以下的元素。这时,a[0][0]存入s[0],a[1][0] 存 入s[1],a[1][1]存入s[2],…,a[n-1][n-1]存入n ( n + 1) s -1 中,具体过程参见图5-4。 2
2012年11月1日
9
5.2.2 列优先顺序
1.存放规则 列优先顺序也称为高下标优先存储,或右边下标优先于 左边下标。具体实现时,按列号从小到大的顺序,先将 第一列中的元素按行号从小到大的顺序全部存放好,再 存放第二列元素,第三列元素,依此类推……
2012年11月1日
10
2.地址计算
对二维数组Am×n有:LOC(aij)=LOC(a00)+(j×m+i)×d 对三维数组Am×n×p有: LOC(aijk)=LOC(a000)+(k×m×n+j×m+i)×d
2012年11月1日
6
5.2 多维数组的存储结构
由于数组是先定义后使用,且为静态分配存储单元。本章中, 仅重点讨论二维数组的存储,三维及三维以上的数组(多 维),可以作类似分析。 多维数组的顺序存储有下面两种形式:行优先顺序存储和列 优先顺序存储。
2012年11月1日
7
5.2.1 行优先顺序
1.存放规则 行优先顺序也称为低下标优先存储,或左边下标优先于右 边下标。具体实现时,按行号从小到大的顺序,先将第一 行中元素按列号从小到大全部存放好,再存放第二行元素, 第三行元素,依此类推……
2012年11月1日
11
5.3 特殊矩阵及其压缩存储
所谓压缩存储是指:为多个值相同的元素只分配一个存储空 间,值为零的元素不分配空间。或者理解为:将二维数组 (矩阵)压缩到一个占用存储单元数目较少的一维数组中。 但是,在进行压缩存储时,虽然节约了存储单元,但怎样在 压缩存储后直接找到某元素呢?因此还必须给出压缩前下标 (二维数组的行、列)和压缩后(一维数组的下标)下标之 间的变换公式,才能使压缩存储变得有意义。下面将分几种 情况的特殊矩阵来讨论。
2012年11月1日
a 01 a11 a 21 0 0 0 0
0 a12 a 22 a 32 0 0 0
0 0 a 23 a 33 a 43 0 0
0 0 0 a 34 a 44 a 54 0
0 0 0 0 a 45 a 55 a 65
0 0 0 0 0 a 56 a 66
16
图5-3 一个7×7的三对角矩阵
5.3.2 压缩存储
在上面介绍的几种特殊矩阵(对称矩阵、上三角矩阵、下 三角矩阵、三对角矩阵、多对角矩阵等)中,元素的分布 有规律,从节省存储单元的角度来考虑,可以进行压缩存 储。
2012年11月1日
17
1.对称矩阵
若矩阵Ann是对称的,对称的两个元素可以共用一个存储单 元,这样,原来n 阶方阵需n2个存储单元,若采用压缩存储, 仅需n(n+1)/2个存储单元,将近节约一半存储单元,这就是 实现压缩的好处。
a 00 a 10 a 20 ... n -10 a
2012年11月1日
a 11 a 21 ... a n -11
a 22 ... a n -12 ... ...
... a n -1n -1
2012年11月1日 21
(2)只存放上三角部分 对于对称矩阵,除了用下三角形式存放外,还可以用上三角形 式存放,这时a[0][0]存入s[0],a[0][1]存入s[1],a[0][2]存入 s[2],…,a[0][n-1]存入s[n],a[1][1]存入s[n+1],…,a[n1][n-1]存入s[ n ( n + 1) - 1 ] 中,具体参见图5-5。
2012年11月1日
8
2.地址计算 设a00的内存地址为LOC(a00),则aij的内存地址按等差数列 计算为LOC(aij)=LOC(a00)+(i×n+j)×d。 同理,三维数组Am×n×p按行优先顺序存放的地址计算公式 为:LOC(aijk)=LOC(a000)+(i×n×p+j×p+k)×d。
2012年11月1日
15
3.对角矩阵
若矩阵中所有非零元素都集中在以主对角线为中心的带状区 域中,区域外的值全为0,则称为对角矩阵。常见的对角矩阵 有:三对角矩阵、五对角矩阵、七对角矩阵等。 例如,如图5-3所示为7×7的三对角矩阵。