多维数组和广义表

合集下载

数据结构答案第4章

数据结构答案第4章

第 4 章广义线性表——多维数组和广义表2005-07-14第 4 章广义线性表——多维数组和广义表课后习题讲解1. 填空⑴数组通常只有两种运算:()和(),这决定了数组通常采用()结构来实现存储。

【解答】存取,修改,顺序存储【分析】数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。

除了初始化和销毁之外,在数组中通常只有存取和修改两种操作。

⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。

【解答】1140【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。

⑶设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个存储单元,则元素A[8][5]的存储地址为()。

【解答】d+41【分析】元素A[8][5]的前面共存储了(1+2+…+8)+5=41个元素。

⑷稀疏矩阵一般压缩存储方法有两种,分别是()和()。

【解答】三元组顺序表,十字链表⑸广义表((a), (((b),c)),(d))的长度是(),深度是(),表头是(),表尾是()。

【解答】3,4,(a),((((b),c)),(d))⑹已知广义表LS=(a,(b,c,d),e),用Head和Tail函数取出LS中原子b的运算是()。

【解答】Head(Head(Tail(LS)))2. 选择题⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节,A的第8列和第5行共占()个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。

数据结构第五章

数据结构第五章
2012年11月1日 13
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章中 已经介绍),它在计算机内是存放在一块连续的存储 单元中,适合于随机查找。

数据结构第五章 数组与广义表

数据结构第五章 数组与广义表
an-1,n-1
压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组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中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:

中国农业大学_821数据结构_《数据结构》习题(5)

中国农业大学_821数据结构_《数据结构》习题(5)

三、算法题
1. 编写一个函数,将A[0..n-1]中所有奇数移到偶数之前。要求不另增加存储空间,且
时间复杂度为O(n)。 2. 编写一个函数,设置mn(m=2,n=3)矩阵的元素后,统计这个矩阵中具有下列特 征的元素个数并输出它们的坐标和数值:它们既是所在行中的最小值又是所在列中的最小 值,或者它们既是所在行中的最大值又是所在列中的最大值。 3. 编写一个函数,在nn(n≥3)的稀疏矩阵A中,只有下标满足1<i<n和n-i≤j≤n-i+2 的元素A[i][j]不等于0 ,若这些非 0 元素按行优先的顺序存储在一维数组 B 中,试通过 B 求 A[i][j]之值。也就是说,在存在B的情况下,已知i、j求A[i][j]。 4. 编写一个函数,假设稀疏矩阵A和B(分别为)mn和nk采用三元组表示,试计算 C=A*B,要求C也是采用稀疏矩阵的三元组表示。 5. 编写一个函数,计算一个广义表原子结点个数。例如一个广义表为 (a, (b, c), ((e))), 其原子结点的个数为4。 6. 编写一个函数,计算一个广义表的所有原子结点数据域(数据域为整数型)之和。 例如一个广义表为 ((3, 4), 5, (( 6, 3 ))),其所有结点数据域之和为21。 7. 编写一个函数,将两个广义表合并成一个广义表,合并是指元素的合并。例如两个 广义表 ((a, b), (c)) 与 (a, (e, f)) 合并后的结果是 ((a, b), (c), a, (e, f))。 8. 编写一个函数,删除广义表中所有值为x的元素。例如删除广义表 ((a, b), a, (d, a)) 中所有a的结果空题
1. 已知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一 个元素的起始地址始LOC(A[0][0]),则A[i][j]的地址是 。

数据结构复习笔记

数据结构复习笔记

第一章概论1.数据:信息的载体,能被计算机识别、存储和加工处理;2.数据元素:数据的基本单位,可由若干个数据项组成,数据项是具有独立含义的最小标识单位;3.数据结构:数据之间的相互关系,即数据的组织形式;它包括:1数据的逻辑结构,从逻辑关系上描述数据,与数据存储无关,独立于计算机;2数据的存储结构,是逻辑结构用计算机语言的实现,依赖于计算机语言;3数据的运算,定义在逻辑结构上,每种逻辑结构都有一个运算集合;常用的运算:检索/插入/删除/更新/排序;4.数据的逻辑结构可以看作是从具体问题抽象出来的数学模型;数据的存储结构是逻辑结构用计算机语言的实现;5.数据类型:一个值的集合及在值上定义的一组操作的总称;分为:原子类型和结构类型;6.抽象数据类型:抽象数据的组织和与之相关的操作;优点:将数据和操作封装在一起实现了信息隐藏;7. 抽象数据类型ADT:是在概念层上描述问题;类:是在实现层上描述问题;在应用层上操作对象类的实例解决问题;8.数据的逻辑结构,简称为数据结构,有:1线性结构,若结构是非空集则仅有一个开始和终端结点,并且所有结点最多只有一个直接前趋和后继;2非线性结构,一个结点可能有多个直接前趋和后继;9.数据的存储结构有:1顺序存储,把逻辑相邻的结点存储在物理上相邻的存储单元内;2链接存储,结点间的逻辑关系由附加指针字段表示;3索引存储,存储结点信息的同时,建立附加索引表,有稠密索引和稀疏索引;4散列存储,按结点的关键字直接计算出存储地址;10.评价算法的好坏是:算法是正确的;执行算法所耗的时间;执行算法的存储空间辅助存储空间;易于理解、编码、调试;11.算法的时间复杂度Tn:是该算法的时间耗费,是求解问题规模n的函数;记为On;时间复杂度按数量级递增排列依次为:常数阶O1、对数阶Olog2n、线性阶On、线性对数阶Onlog2n、平方阶On^2、立方阶On^3、……k次方阶On^k、指数阶O2^n;13.算法的空间复杂度Sn:是该算法的空间耗费,是求解问题规模n的函数;12.算法衡量:是用时间复杂度和空间复杂度来衡量的,它们合称算法的复杂度;13. 算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关;第二章线性表1.线性表:是由nn≥0个数据元素组成的有限序列;3.顺序表:把线性表的结点按逻辑次序存放在一组地址连续的存储单元里;4.顺序表结点的存储地址计算公式:Locai=Loca1+i-1C;1≤i≤n5.顺序表上的基本运算public interface List {链表:只有一个链域的链表称单链表;在结点中存储结点值和结点的后继结点的地址,data next data是数据域,next是指针域;1建立单链表;时间复杂度为On;加头结点的优点:1链表第一个位置的操作无需特殊处理;2将空表和非空表的处理统一; 2查找运算;时间复杂度为On;public class SLNode implements Node {private Object element;private SLNode next;public SLNodeObject ele, SLNode next{= ele;= next;}public SLNode getNext{return next;}public void setNextSLNode next{= next;}public Object getData {return element;}public void setDataObject obj {element = obj;}}public class ListSLinked implements List {private SLNode head; etData==ereturn p;else p = ;return null;}etData;.getNext;size--;return obj;}etNext;size--;return true;}return false;}环链表:是一种首尾相连的链表;特点是无需增加存储量,仅对表的链接方式修改使表的处理灵活方便;8.空循环链表仅由一个自成循环的头结点表示;9.很多时候表的操作是在表的首尾位置上进行,此时头指针表示的单循环链表就显的不够方便,改用尾指针rear来表示单循环链表;用头指针表示的单循环链表查找开始结点的时间是O1,查找尾结点的时间是On;用尾指针表示的单循环链表查找开始结点和尾结点的时间都是O1;10.在结点中增加一个指针域,prior|data|next;形成的链表中有两条不同方向的链称为双链表;public class DLNode implements Node {private Object element;private DLNode pre;private DLNode next;public DLNodeObject ele, DLNode pre, DLNode next{= ele;= pre;= next;}public DLNode getNext{return next;}public void setNextDLNode next{= next;}public DLNode getPre{return pre;}public void setPreDLNode pre{= pre;}public Object getData {return element;}public void setDataObject obj {element = obj;}}public class LinkedListDLNode implements LinkedList {private int size; etPrenode;node;size++;return node;}etNextnode;node;size++;return node;}etNext;.setPre;size--;return obj;}序表和链表的比较1基于空间的考虑:顺序表的存储空间是静态分配的,链表的存储空间是动态分配的;顺序表的存储密度比链表大;因此,在线性表长度变化不大,易于事先确定时,宜采用顺序表作为存储结构;2基于时间的考虑:顺序表是随机存取结构,若线性表的操作主要是查找,很少有插入、删除操作时,宜用顺序表结构;对频繁进行插入、删除操作的线性表宜采用链表;若操作主要发生在表的首尾时采用尾指针表示的单循环链表;12.存储密度=结点数据本身所占的存储量/整个结点结构所占的存储总量存储密度:顺序表=1,链表<1;第三章栈和队列1.栈是限制仅在表的一端进行插入和删除运算的线性表又称为后进先出表LIFO表;插入、删除端称为栈顶,另一端称栈底;表中无元素称空栈;2.栈的基本运算有:1initstacks,构造一个空栈;2stackemptys,判栈空;3stackfulls,判栈满;4pushs,x,进栈;5pops,退栈;6stacktops,取栈顶元素;3.顺序栈:栈的顺序存储结构称顺序栈;4.当栈满时,做进栈运算必定产生空间溢出,称“上溢”;当栈空时,做退栈运算必定产生空间溢出,称“下溢”;上溢是一种错误应设法避免,下溢常用作程序控制转移的条件;5.在顺序栈上的基本运算:public interface Stack {栈:栈的链式存储结构称链栈;栈顶指针是链表的头指针;7.链栈上的基本运算:public class StackSLinked implements Stack {private SLNode top; 列是一种运算受限的线性表,允许删除的一端称队首,允许插入的一端称队尾;队列又称为先进先出线性表,FIFO表;9.队列的基本运算:1initqueueq,置空队;2queueemptyq,判队空;3queuefullq,判队满;4enqueueq,x,入队;5dequeueq,出队;6queuefrontq,返回队头元素;10.顺序队列:队列的顺序存储结构称顺序队列;设置front和rear指针表示队头和队尾元素在向量空间的位置;11.顺序队列中存在“假上溢”现象,由于入队和出队操作使头尾指针只增不减导致被删元素的空间无法利用,队尾指针超过向量空间的上界而不能入队;12.为克服“假上溢”现象,将向量空间想象为首尾相连的循环向量,存储在其中的队列称循环队列;i=i+1%queuesize13.循环队列的边界条件处理:由于无法用front==rear来判断队列的“空”和“满”;解决的方法有:1另设一个布尔变量以区别队列的空和满;2少用一个元素,在入队前测试rear在循环意义下加1是否等于front;3使用一个记数器记录元素总数;14.循环队列的基本运算:public interface Queue {队列:队列的链式存储结构称链队列,链队列由一个头指针和一个尾指针唯一确定;16.链队列的基本运算:public class QueueSLinked implements Queue {private SLNode front;private SLNode rear;private int size;public QueueSLinked {front = new SLNode;rear = front;size = 0;}etData;}}第四章串1.串:是由零个或多个字符组成的有限序列;包含字符的个数称串的长度;2.空串:长度为零的串称空串;空白串:由一个或多个空格组成的串称空白串;子串:串中任意个连续字符组成的子序列称该串的子串;主串:包含子串的串称主串;子串的首字符在主串中首次出现的位置定义为子串在主串中的位置;3.空串是任意串的子串;任意串是自身的子串;串常量在程序中只能引用但不能改变其值;串变量取值可以改变;4.串的基本运算1intstrlenchars;求串长;2charstrcpycharto,charfrom;串复制;3charstrcatcharto,charfrom;串联接;4intstrcmpchars1,chars2;串比较;5charstrchrchars,charc;字符定位;5.串的存储结构:1串的顺序存储:串的顺序存储结构称顺序串;按存储分配不同分为:1静态存储分配的顺序串:直接用定长的字符数组定义,以“\0”表示串值终结;definemaxstrsize256typedefcharseqstringmaxstrsize;seqstrings;不设终结符,用串长表示;Typedefstruct{Charchmaxstrsize;Intlength;}seqstring;以上方式的缺点是:串值空间大小是静态的,难以适应插入、链接等操作;2动态存储分配的顺序串:简单定义:typedefcharstring;复杂定义:typedefstruct{charch;intlength;}hstring;2串的链式存储:串的链式存储结构称链串;链串由头指针唯一确定;类型定义:typedefstructnode{chardata;structnodenext;}linkstrnode;typedeflinkstrnodelinkstring;linkstrings;将结点数据域存放的字符个数定义为结点的大小;结点大小不为1的链串类型定义:definenodesize80typedefstructnode{chardatanodesize;structnodenext;}linkstrnode;6.串运算的实现1顺序串上的子串定位运算;1子串定位运算又称串的模式匹配或串匹配;主串称目标串;子串称模式串; 2朴素的串匹配算法;时间复杂度为On^2;比较的字符总次数为n-m+1m; Intnaivestrmatchseqstringt,seqstringp{inti,j,k;intm=;intn=;fori=0;i<=n-m;i++{j=0;k=i;whilej<m&&k==j{j++;k++;}ifj==mreturni;}return–1;}2链串上的子串定位运算;时间复杂度为On^2;比较的字符总次数为n-m+1m;LinkstrnodelilnkstrmatchlinkstringT,linkstringP {linkstrnodeshift,t,p;shift=T;t=shift;p=P;whilet&&p{ift->data==p->data{t=t->next;p=p->next;}else{shift=shift->next;t=shift;p=P;}}ifp==NULLreturnshift;elsereturnNULL;}第五章多维数组和广义表1.多维数组:一般用顺序存储的方式表示数组;2.常用方式有:1行优先顺序,将数组元素按行向量排列;2列优先顺序,将数组元素按列向量排列;3.计算地址的函数:LOCAij=LOCAc1c2+i-c1d2-c2+1+j-c2d4.矩阵的压缩存储:为多个非零元素分配一个存储空间;对零元素不分配存储空间;1对称矩阵:在一个n阶的方阵A中,元素满足Aij=Aji0<=i,j<=n-1;称为对称矩阵;元素的总数为:nn+1/2;设:I=i或j中大的一个数;J=i或j中小的一个数;则:k=II+1/2+J;地址计算:LOCAij=LOCsak=LOCsa0+kd=LOCsa0+II+1/2+Jd2三角矩阵:以主对角线划分,三角矩阵有上三角和下三角;上三角的主对角线下元素均为常数c;下三角的主对角线上元素均为常数c;元素总数为:nn+1/2+1;以行优先顺序存放的Aij与SAk的关系:上三角阵:k=i2n-i+1/2+j-i;下三角阵:k=ii+1/2+j;3对角矩阵:所有的非零元素集中在以主对角线为中心的带状区域,相邻两侧元素均为零;|i-j|>k-1/2以行优先顺序存放的Aij与SAk的关系:k=2i+j;5.稀疏矩阵:当矩阵A中有非零元素S个,且S远小于元素总数时,称为稀疏矩阵;对其压缩的方法有顺序存储和链式存储;1三元组表:将表示稀疏矩阵的非零元素的三元组行号、列号、值按行或列优先的顺序排列得到的一个结点均是三元组的线性表,将该表的线性存储结构称为三元组表;其类型定义:definemaxsize10000typedefintdatatype;typedefstruct{inti,j;datatypev;}trituplenode;typedefstruct{trituplenodedatamaxsize;intm,n,t;}tritupletable;2带行表的三元组表:在按行优先存储的三元组表中加入一个行表记录每行的非零元素在三元组表中的起始位置;类型定义:definemaxrow100typedefstruct{tritulpenodedatamaxsize;introwtabmaxrow;intm,n,t;}rtritulpetable;6.广义表:是线性表的推广,广义表是n个元素的有限序列,元素可以是原子或一个广义表,记为LS;7.若元素是广义表称它为LS的子表;若广义表非空,则第一个元素称表头,其余元素称表尾;8.表的深度是指表展开后所含括号的层数;9.把与树对应的广义表称为纯表,它限制了表中成分的共享和递归;10.允许结点共享的表称为再入表;11.允许递归的表称为递归表;12.相互关系:线性表∈纯表∈再入表∈递归表;13.广义表的特殊运算:1取表头headLS;2取表尾tailLS;第六章树1.树:是n个结点的有限集T,T为空时称空树,否则满足:1有且仅有一个特定的称为根的结点;2其余结点可分为m个互不相交的子集,每个子集本身是一棵树,并称为根的子树;2.树的表示方法:1树形表示法;2嵌套集合表示法;3凹入表表示法;4广义表表示法;3.一个结点拥有的子树数称为该结点的度;一棵树的度是指树中结点最大的度数;4.度为零的结点称叶子或终端结点;度不为零的结点称分支结点或非终端结点5.根结点称开始结点,根结点外的分支结点称内部结点;6.树中某结点的子树根称该结点的孩子;该结点称为孩子的双亲;7.树中存在一个结点序列K1,K2,…Kn,使Ki为Ki+1的双亲,则称该结点序列为K1到Kn的路径或道路;8.树中结点K到Ks间存在一条路径,则称K是Ks的祖先,Ks是K的子孙;9.结点的层数从根算起,若根的层数为1,则其余结点层数是其双亲结点层数加1;双亲在同一层的结点互为堂兄弟;树中结点最大层数称为树的高度或深度;10.树中每个结点的各个子树从左到右有次序的称有序树,否则称无序树;11.森林是m棵互不相交的树的集合;12.二叉树:是n个结点的有限集,它或为空集,或由一个根结点及两棵互不相交的、分别称为该根的左子树和右子树的二叉树组成;13.二叉树不是树的特殊情况,这是两种不同的数据结构;它与无序树和度为2的有序树不同;14.二叉树的性质:1二叉树第i层上的结点数最多为2^i-1;2深度为k的二叉树至多有2^k-1个结点;3在任意二叉树中,叶子数为n0,度为2的结点数为n2,则n0=n2+1;15.满二叉树是一棵深度为k的且有2^k-1个结点的二叉树;16.完全二叉树是至多在最下两层上结点的度数可以小于2,并且最下层的结点集中在该层最左的位置的二叉树;17.具有N个结点的完全二叉树的深度为log2N取整加1;18.二叉树的存储结构1顺序存储结构:把一棵有n个结点的完全二叉树,从树根起自上而下、从左到右对所有结点编号,然后依次存储在一个向量b0~n中,b1~n存放结点,b0存放结点总数;各个结点编号间的关系:1i=1是根结点;i>1则双亲结点是i/2取整;2左孩子是2i,右孩子是2i+1;要小于n3i>n/2取整的结点是叶子;4奇数没有右兄弟,左兄弟是i-1;5偶数没有左兄弟,右兄弟是i+1;2链式存储结构结点的结构为:lchild|data|rchild;相应的类型说明:typedefchardata;typedefstructnode{datatypedata;structnodelchild,rchild;}bintnode;typedefbintnodebintree;19.在二叉树中所有类型为bintnode的结点和一个指向开始结点的bintree类型的头指针构成二叉树的链式存储结构称二叉链表;20.二叉链表由根指针唯一确定;在n个结点的二叉链表中有2n个指针域,其中n+1个为空;21.二叉树的遍历方式有:前序遍历、中序遍历、后序遍历;时间复杂度为On;22.线索二叉树:利用二叉链表中的n+1个空指针域存放指向某种遍历次序下的前趋和后继结点的指针,这种指针称线索;加线索的二叉链表称线索链表;相应二叉树称线索二叉树;23.线索链表结点结构:lchild|ltag|data|rtag|rchild;ltag=0,lchild是指向左孩子的指针;ltag=1,lchild是指向前趋的线索;rtag=0,rchild是指向右孩子的指针;rtag=1,rchild是指向后继的线索;24.查找p在指定次序下的前趋和后继结点;算法的时间复杂度为Oh;线索对查找前序前趋和后序后继帮助不大;25.遍历线索二叉树;时间复杂度为On;26.树、森林与二叉树的转换1树、森林与二叉树的转换1树与二叉树的转换:1}所有兄弟间连线;2}保留与长子的连线,去除其它连线;该二叉树的根结点的右子树必为空;2森林与二叉树的转换:1}将所有树转换成二叉树;2}将所有树根连线;2二叉树与树、森林的转换;是以上的逆过程;27.树的存储结构1双亲链表表示法:为每个结点设置一个parent指针,就可唯一表示任何一棵树;Data|parent2孩子链表表示法:为每个结点设置一个firstchild指针,指向孩子链表头指针,链表中存放孩子结点序号;Data|firstchild;3双亲孩子链表表示法:将以上方法结合;Data|parent|firstchild4孩子兄弟链表表示法:附加两个指向左孩子和右兄弟的指针;Leftmostchild|data|rightsibling28.树和森林的遍历:前序遍历一棵树等价于前序遍历对应二叉树;后序遍历等价于中序遍历对应二叉树;29.最优二叉树哈夫曼树:树的路径长度是从树根到每一结点的路径长度之和;将树中的结点赋予实数称为结点的权;30.结点的带权路径是该结点的路径长度与权的乘积;树的带权路径长度又称树的代价,是所有叶子的带权路径长度之和;31.带权路径长度最小的二叉树称最优二叉树哈夫曼树;32.具有2n-1个结点其中有n个叶子,并且没有度为1的分支结点的树称为严格二叉树;33.哈夫曼编码34.对字符集编码时,要求字符集中任一字符的编码都不是其它字符的编码前缀,这种编码称前缀码;35.字符出现频度与码长乘积之和称文件总长;字符出现概率与码长乘积之和称平均码长;36.使文件总长或平均码长最小的前缀码称最优前缀码37.利用哈夫曼树求最优前缀码,左为0,右为1;编码平均码长最小;没有叶子是其它叶子的祖先,不可能出现重复前缀;第七章图1.图:图G是由顶点集V和边集E组成,顶点集是有穷非空集,边集是有穷集;中每条边都有方向称有向图;有向边称弧;边的始点称弧尾;边的终点称弧头;G中每条边都没有方向的称无向图;3.顶点n与边数e的关系:无向图的边数e介于0~nn-1/2之间,有nn-1/2条边的称无向完全图;有向图的边数e介于0~nn-1之间,有nn-1条边的称有向完全图;4.无向图中顶点的度是关联与顶点的边数;有向图中顶点的度是入度与出度的和;所有图均满足:所有顶点的度数和的一半为边数;5.图GV,E,如V’是V的子集,E’是E的子集,且E’中关联的顶点均在V’中,则G’V’,E’是G的子图;6.在有向图中,从顶点出发都有路径到达其它顶点的图称有根图;7.在无向图中,任意两个顶点都有路径连通称连通图;极大连通子图称连通分量;8.在有向图中,任意顺序两个顶点都有路径连通称强连通图;极大连通子图称强连通分量;9.将图中每条边赋上权,则称带权图为网络;10.图的存储结构:1邻接矩阵表示法:邻接矩阵是表示顶点间相邻关系的矩阵;n个顶点就是n阶方阵;无向图是对称矩阵;有向图行是出度,列是入度;2邻接表表示法:对图中所有顶点,把与该顶点相邻接的顶点组成一个单链表,称为邻接表,adjvex|next,如要保存顶点信息加入data;对所有顶点设立头结点,vertex|firstedge,并顺序存储在一个向量中;vertex保存顶点信息,firstedge保存邻接表头指针;11.邻接矩阵表示法与邻接表表示法的比较:1邻接矩阵是唯一的,邻接表不唯一;2存储稀疏图用邻接表,存储稠密图用邻接矩阵;3求无向图顶点的度都容易,求有向图顶点的度邻接矩阵较方便;4判断是否是图中的边,邻接矩阵容易,邻接表最坏时间为On;5求边数e,邻接矩阵耗时为On^2,与e无关,邻接表的耗时为Oe+n;12.图的遍历:1图的深度优先遍历:类似与树的前序遍历;按访问顶点次序得到的序列称DFS序列;对邻接表表示的图深度遍历称DFS,时间复杂度为On+e;对邻接矩阵表示的图深度遍历称DFSM,时间复杂度为On^2;2图的广度优先遍历:类似与树的层次遍历;按访问顶点次序得到的序列称BFS序列;对邻接表表示的图广度遍历称BFS,时间复杂度为On+e;对邻接矩阵表示的图广度遍历称BFSM,时间复杂度为On^2;13.将没有回路的连通图定义为树称自由树;14.生成树:连通图G的一个子图若是一棵包含G中所有顶点的树,该子图称生成树;有DFS生成树和BFS生成树,BFS生成树的高度最小;非连通图生成的是森林;15.最小生成树:将权最小的生成树称最小生成树;是无向图的算法1普里姆算法:1确定顶点S、初始化候选边集T0~n-2;formvex|tovex|lenght2选权值最小的Ti与第1条记录交换;3从T1中将tovex取出替换以下记录的fromvex计算权;若权小则替换,否则不变;4选权值最小的Ti与第2条记录交换;5从T2中将tovex取出替换以下记录的fromvex计算权;若权小则替换,否则不变;6重复n-1次;初始化时间是On,选轻边的循环执行n-1-k次,调整轻边的循环执行n-2-k;算法的时间复杂度为On^2,适合于稠密图;2克鲁斯卡尔算法:1初始化确定顶点集和空边集;对原边集按权值递增顺序排序;2取第1条边,判断边的2个顶点是不同的树,加入空边集,否则删除;3重复e次;对边的排序时间是Oelog2e;初始化时间为On;执行时间是Olog2e;算法的时间复杂度为Oelog2e,适合于稀疏图;16.路径的开始顶点称源点,路径的最后一个顶点称终点;17.单源最短路径问题:已知有向带权图,求从某个源点出发到其余各个顶点的最短路径;18.单目标最短路径问题:将图中每条边反向,转换为单源最短路径问题;19.单顶点对间最短路径问题:以分别对不同顶点转换为单源最短路径问题;20.所有顶点对间最短路径问题:分别对图中不同顶点对转换为单源最短路径问题;21.迪杰斯特拉算法:1初始化顶点集Si,路径权集Di,前趋集Pi;2设置Ss为真,Ds为0;3选取Di最小的顶点加入顶点集;4计算非顶点集中顶点的路径权集;5重复3n-1次;算法的时间复杂度为On^2;22.拓扑排序:对一个有向无环图进行拓扑排序,是将图中所有顶点排成一个线性序列,满足弧尾在弧头之前;这样的线性序列称拓扑序列;1无前趋的顶点优先:总是选择入度为0的结点输出并删除该顶点的所有边;设置各个顶点入度时间是On+e,设置栈或队列的时间是On,算法时间复杂度为On+e;2无后继的顶点优先:总是选择出度为0的结点输出并删除该顶点的所有边;设置各个顶点出度时间是On+e,设置栈或队列的时间是On,算法时间复杂度为On+e;求得的是逆拓扑序列;第八章排序1.文件:由一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字;2.排序是将文件按关键字的递增减顺序排列;3.排序文件中有相同的关键字时,若排序后相对次序保持不变的称稳定排序,否则称不稳定排序;4.在排序过程中,文件放在内存中处理不涉及数据的内、外存交换的称内排序,反之称外排序;5.排序算法的基本操作:1比较关键字的大小;2改变指向记录的指针或移动记录本身;6.评价排序方法的标准:1执行时间;2所需辅助空间,辅助空间为O1称就地排序;另要注意算法的复杂程度;7.若关键字类型没有比较运算符,可事先定义宏或函数表示比较运算;8.插入排序1直接插入排序算法中引入监视哨R0的作用是:1保存Ri的副本;2简化边界条件,防止循环下标越界;关键字比较次数最大为n+2n-1/2;记录移动次数最大为n+4n-1/2;算法的最好时间是On;最坏时间是On^2;平均时间是On^2;是一种就地的稳定的排序;2希尔排序实现过程:是将直接插入排序的间隔变为d;d的取值要注意:1最后一次必为1;2避免d 值互为倍数;关键字比较次数最大为n^;记录移动次数最大为^;算法的平均时间是On^;是一种就地的不稳定的排序;9.交换排序1冒泡排序实现过程:从下到上相邻两个比较,按小在上原则扫描一次,确定最小值,重复n-1次;关键字比较次数最小为n-1、最大为nn-1/2;记录移动次数最小为0,最大为3nn-1/2;算法的最好时间是On;最坏时间是On^2;平均时间是On^2;是一种就地的稳定的排序;2快速排序实现过程:将第一个值作为基准,设置i,j指针交替从两头与基准比较,有交换后,交换j,i;i=j时确定基准,并以其为界限将序列分为两段;重复以上步骤;关键字比较次数最好为nlog2n+nC1、最坏为nn-1/2;算法的最好时间是Onlog2n;最坏时间是On^2;平均时间是Onlog2n;辅助空间为Olog2n;是一种不稳定排序;10.选择排序1直接选择排序实现过程:选择序列中最小的插入第一位,在剩余的序列中重复上一步,共重复n-1次;关键字比较次数为nn-1/2;记录移动次数最小为0,最大为3n-1;算法的最好时间是On^2;最坏时间是On^2;平均时间是On^2;是一种就地的不稳定的排序;2堆排序。

数据结构答案第4章

数据结构答案第4章
【解答】设稀疏矩阵为m行n列,如果采用二维数组存储,其空间复杂度为O(m×n);因为要将所有的矩阵元素累加起来,所以,需要用一个两层的嵌套循环,其时间复杂度亦为O(m×n)。如果采用三元组顺序表进行压缩存储,假设矩阵中有t个非零元素,其空间复杂度为O(t),将所有的矩阵元素累加起来只需将三元组顺序表扫描一遍,其时间复杂度亦为O(t)。当t<<m×n时,采用三元组顺序表存储可获得较好的时、空性能。
⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节,A的第8列和第5行共占()个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。
A 90 B 180 C 240 D 540 E 108 F 114 G 54
⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。
【解答】1140
【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。
Head(Tail(Tail(Head(ST))))=奖金
⑵工资表ST的头尾表示法如图4-7所示。7.若在矩阵A中存在一个元素ai,j(0≤i≤n-1,0≤j≤m-1),该元素是第i行元素中最小值且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。假设以二维数组存储矩阵A,试设计一个求该矩阵所有马鞍点的算法,并分析最坏情况下的时间复杂度。
⑵因为k和i, j之间是一一对应的关系,k+1是当前非零元素的个数,整除即为其所在行号,取余表示当前行中第几个非零元素,加上前面零元素所在列数就是当前列号,即:

数据结构:第5章 数组与广义表1-数组

数据结构:第5章 数组与广义表1-数组

中的元素均为常数。下三角矩阵正好相反,它的主对
数据结构讲义
第5章 数组与广义表
—数组
数组和广义表
数组和广义表可看成是一种特殊的 线性表,其特殊在于,表中的数据 元素本身也是一种线性表。
几乎所有的程序设计语言都有数组 类型。本节重点讲解稀疏矩阵的实 现。
5.1 数组的定义
由于数组中各元素具有统一的类型,并且 数组元素的下标一般具有固定的上界和下 界,因此,数组的处理比其它复杂的结构 更为简单。
nm
aa1221
aa2222
…………....
aam2n2 ………………..
aamm11 aamm22 ………….... aammnn LLoocc(a( iaj)ij=)L=Loco(ca(a111)1+)[+([j(-i1-)1m)n++((i-j1-1)])*]*l l
aa1mn 1 aa2mn2 …………....
其存储形式如图所示:
15137 50800 18926 30251
a00 a10 a 11 a20 a21 a23 ………………..
70613
an-1 0 a n-1 1 a n-1 2 …a n-1 n-1
图 5.1 对称矩阵
在这个下三角矩阵中,第i行恰有i+1个元素,元素总
数为:
n(n+1)/2
5.2 数组的顺序表示和实现
由于计算机的内存结构是一维的,因此用 一维内存来表示多维数组,就必须按某种 次序将数组元素排成一列序列,然后将这 个线性序列存放在存储器中。
又由于对数组一般不做插入和删除操作, 也就是说,数组一旦建立,结构中的元素 个数和元素间的关系就不再发生变化。因 此,一般都是采用顺序存储的方法来表示 数组。

第5章演示

第5章演示

对称矩阵的压缩存储
(2)压缩存储: ③数组Sa中的元素与矩阵元素aij存在着一一对应的 关系。 假设数组元素Sa[k]中存放的是矩阵元素aij,则它们 之间的对应关系实质上就是下标值k和i、j之间的对应 关系。
对称矩阵的压缩存储的下标转换公式为:
i(i-1)/2+(j-1),当i>=j k= j(j-1)/2+(i-1),当i<j
稀疏矩阵
3、稀疏矩阵的存储结构 (2)算法:将矩阵M转置为矩阵T
M.data M.data[1] 1 2 12 M.data[2] 1 3 9 M.data[3] 3 M.data[4] 3 M.data[5] 4 M.data[6] 5 M.data[7] 6 M.data[8] 6 1 6 3 -3 14 24 T.data T.data[1] 1 3 -3 T.data[2] 1 6 15
稀疏矩阵的三元组表表示法节约了存储空间, 实现了压缩存储。
稀疏矩阵
注意:
稀疏矩阵 唯一 三元组表
不唯一
解决办法:在三元表的基础上,再引入总行数、 总列数和非零元素总个数即可。
稀疏矩阵
3、稀疏矩阵的存储结构 (1)三元组顺序表 以顺序存储结构表示的三元组表。 三元组类型定义: typedef struct { int i,j; elemtype e; }Triple;
5.4 广义表的定义
二、表示 (1)用关系定义表示; (2)用图表示。 说明: ①广义表是一个多层次结构; ②广义表之间可以共享; ③广义表可以递归定义; ④表头可以为原子或子表;表尾只能为子表; ⑤( )与( ( ) )不同。
5.4 广义表的定义 A =( ) B =(e) C =(a, (b,c,d)) D =(A, B, C) E =(a, E) F =(( ))

数据结构数组与广义表知识点总结

数据结构数组与广义表知识点总结

数据结构数组与广义表知识点总结数组是一种线性数据结构,可以存储多个相同类型的元素。

它的特点是元素的大小固定,并且在内存中是连续存储的。

数组的访问方式是通过下标来访问,下标从0开始。

数组可以在编程中应用于各种情况,比如存储一组数字、一组字符串等。

广义表是一种扩展的线性数据结构,可以存储不同类型的元素。

它由元素和表构成,其中表可以是空表、原子或子表。

广义表可以递归定义,即子表可以包含更多的子表。

广义表的访问方式是通过递归来访问,可以对表的元素进行遍历和操作。

在数据结构中,数组和广义表都有自己的特点和用途,下面对它们的知识点进行总结:1.数组的特点及应用:-数组是一种线性数据结构,可以存储多个相同类型的元素。

-数组的内存分配是连续的,可以通过下标来访问元素。

-数组的大小固定,一旦定义后不能改变。

-数组的访问速度快,可以通过下标直接访问元素。

-数组适合用于存储一组相同类型的数据,比如一组数字、一组字符串等。

-数组的应用场景包括但不限于:排序算法、查找算法、图像处理、矩阵运算等。

2.数组的操作和常用算法:-初始化:可以直接赋值或使用循环初始化数组。

-访问元素:通过下标访问元素,下标从0开始。

-修改元素:直接通过下标修改元素的值。

-插入元素:需要移动插入位置之后的元素。

-删除元素:需要移动删除位置之后的元素。

-查找元素:可以使用线性查找或二分查找等算法。

-排序算法:比如冒泡排序、选择排序、插入排序等。

-数组还有一些常用的属性和方法,比如长度、最大值、最小值等。

3.广义表的特点及应用:-广义表是一种扩展的线性数据结构,可以存储不同类型的元素。

-广义表由元素和表构成,表可以是空表、原子或子表。

-广义表可以递归定义,即子表可以包含更多的子表。

-广义表的访问方式是通过递归遍历和操作。

-广义表适合存储一组不同类型的数据,比如存储学生信息、函数调用栈等。

-广义表的应用场景包括但不限于:函数式编程、树的表示、图的表示等。

第4章 广义线性表

第4章 广义线性表
⑴ 存取:给定一组下标,读出对应的数组元素; ⑵ 修改:给定一组下标,存储或修改与其相对应的 数组元素。 存取和修改操作本质上只对应一种操作——寻址
数组应该采用何种方式存储?
数组没有插入和删除操作,所以,不用预留空间, 适合采用顺序存储。
广义线性表——多维数组
数组的存储结构与寻址——一维数组
设一维数组的下标的范围为闭区间[ l , h ],每个 数组元素占用 c 个存储单元,则其任一元素 ai 的 存储地址可由下式确定:
矩阵的压缩存储
下三角矩阵的压缩存储 存储
0 1
下三角元素
对角线上方的常数——只存一个
2 3 4 5
k
n(n+1)/2
a00
第0行
a10
a11
a20
a21
第2行
a22

aij

an-1n-1 c
第1行
矩阵中任一元素aij在数组中的下标k与i、j的对应关系: k=
i×(i+1)/2+j
n×(n+1)/2
A=
15 0 0 0 9
0 11 0 0 0
0 0 0 0 0
0 0 6 0 0
0 0 0 0 0
0 0 0 0 0
三元组表=( (0,0,15), (1,1,11), (2,3,6), (4,0,9) ) 如何存储三元组表?
矩阵的压缩存储
稀疏矩阵的压缩存储——三元组顺序表 采用顺序存储结构存储三元组表
广义线性表——多维数组
数组示例
a11 a21 … am1 a12 a22 … am2 … … … … a1n a2n … amn
A=
例如,元素a22受两个线性关系的约束,在行上有

实用数据结构基础(中国铁道出版社_第三版)第6章_多维数组和广义表.ppt

实用数据结构基础(中国铁道出版社_第三版)第6章_多维数组和广义表.ppt
LOC(aijk)=LOC(a000)+( (i×n×p+ j×p +k) ×d (0下标起始的语言)
【例6-1】设二维数组A5×6,每个元素占4个字节(Byte),存储 器按字节编址。已知A的起始地址为2000。计算
(1)数组的大小
n×m×d=5×6×4=120 Byte
(2)数组结点a45的存储地址 LOC(aij)=LOC(a00)+(i*n+j)*d // n为总列数 LOC(a45)=2000+(4×6+5)×4=2116
(3)按行为主存储,计算a32的存储地址 LOC(aij)=LOC(a00)+(i*n+j)*d // n为总列数 LOC(a32)=2000+(3×6+2)×4=2080
(4)按列为主存储,计算a32的存储地址 LOC(aij)=LOC(a00)+(j*m+i)*d // m为总行数 LOC(a32)=2000+(2×5+3)×4=2052
void saddle(int A[][],int n,int m)
{ int i,j,min; for(i=0;i<n;i++) { min=A[i][0] for(j=1;j<m;j++) if(A[i][j]<min) min=A[i][j];
// 按行处理 // 找第i行最小值
for (j=0;j<m;j++) // 检测最小值是否是鞍点 if(A[i][j]==min) { k=j; p=0; while(p<n && A[p][j]<min) p++; if(p>=n) printf("%d,%d,%d\n",i,k,min); }

多维数组与广义表

多维数组与广义表


假设数组各维的下界是1,按“行优先顺序”存储,假
设每个元素占用d个存储单元。
二维数组Amn, aij的地址计算函数为:
LOC(aij)=LOC(a11)+[(i-1)*n+j-1]*d
三维数组Amnp,aijk的地址计算函数为:
LOC(aijk)=LOC(a111)+[(i-1)*n*p+(j-1)*p +(k-1)]*d
5.2 矩阵的压缩存储
在编程时,简单而又自然的方法,是将矩阵描述为
一个二维数组。矩阵在这种存储表示之下,可以对 其元素进行随机存取。
但是在一些特殊矩阵中,非零元素呈某种规律分布
或者矩阵中有大量的零元素,如果仍用二维数组存, 会造成极大的浪费,尤其是处理高阶矩阵的时候。
为了节省存储空间, 我们可以对这类矩阵进行压缩
最基本的原理
Ai1…in的起始地 址 第一个元素 该元素前面 单位 = 〸 ╳ 的起始地址 的元素个数 长度
程序员试题
2006-1
对于二维数组a[0…4,1…5],设每个元素占1个存储单
元,且以行为主序存储,则元素a[2,1]相对于数组空 间起始地址的偏移量是___(40)___。 (40)A.5 B.10 C.15 D.25
2001
二维数组 X 的行下标范围是0~5,列下标范围是1~8,每

个数组元素占六个字节,则该数组的体积为__(6)__个字节, 若已知 X 的最后一个元素的起始字节地址为382,则 X 的 首地址(即第一个元素的起始字节地址)为 __(7)__,记为 Xd 。若按行存储,则 X{1,5] 的起始地址是 __(8)__, 结束字节 地址是 __(9)__。若按列存储,则 X[4,8]的起始字节地址为 __(10)__。 (6): A.210 B.240 C.288 D.294 (7): A.0 B.6 C.94 D.100 (8): A.Xd+24 B.Xd+72 C.Xd+78 D.Xd+144 (6)C (7)D (8)B (9)B (10)D (9): A.Xd+29 B.Xd+77 C.Xd+83

第5章 数据结构 多维数组和广义表

第5章 数据结构 多维数组和广义表

按列优先存储的寻址方法与此类似。
数据结构(C版)
广义线性表——多维数组
数组的存储结构与寻址——多维数组
n(n>2)维 数组一般也采用 按行优先和按列 优先两种存储方 法。请自行推导 任一元素存储地 址的计算方法。 Loc(aijk ) = Loc(a000) +( i×m2×m3 + j×m3 + k )×c
如何压缩存储?
只存储上三角(或下三角)部分的元素。
数据结构(C版)
a00 a10 a 20 a30
a01 a11 a21 a31
a02 a12 a22 a32
a03 a13 a23 a33
上 三 角 矩 阵
a00 a01 a02 a10 a11 a12 a a a 20 21 22
(a) 三对角矩阵
按行 存储
元素aij在一维数组中的序号 =2 + 3(i-1)+( j-i + 1)+1 =2i+ j+1 ∵一维数组下标从0开始 ∴元素aij在一维数组中的下标 =2i+ j (b) 寻址的计算方法
0
1
2
3
4
5
6
7
8
9 10
11 12
a00 a01 a10 a11 a12 a21 a22 a23 a32 a33 a34 a43 a44
数组——线性表的推广
a11 a21 … am1 a12 a22 … am2 … … … … a1n a2n … amn
A=(A1,A2,……,An)
其中: Ai=(a1i,a2i,……,ami) (1≤i≤n)
A=
二维数组是数据元素为线性表的线性表。

数据结构练习试题和答案解析

数据结构练习试题和答案解析

第1章绪论一、判断题1.数据的逻辑结构与数据元素本身的内容和形式无关。

(√)2.一个数据结构是由一个逻辑结构和这个逻辑结构上的一个基本运算集构成的整体。

(√)3.数据元素是数据的最小单位。

(×)4.数据的逻辑结构和数据的存储结构是相同的。

(×)5.程序和算法原则上没有区别,所以在讨论数据结构时可以通用。

(×)6.从逻辑关系上讲,数据结构主要分为线性结构和非线性结构两类。

(√)7.数据的存储结构是数据的逻辑结构的存储映象。

(√)8.数据的物理结构是指数据在计算机内实际的存储形式。

(√)9.数据的逻辑结构是依赖于计算机的。

(×)10.算法是对解题方法和步骤的描述。

(√)二、填空题1.数据有逻辑结构和存储结构两种结构。

2.数据逻辑结构除了集合以外,还包括线性结构、树形结构和图形结构。

3.数据结构按逻辑结构可分为两大类,它们是线性结构和非线性结构。

4.树形结构和图形结构合称为非线性结构。

5.在树形结构中,除了树根结点以外,其余每个结点只有1个前驱结点。

6.在图形结构中,每个结点的前驱结点数和后继结点数可以任意多个。

7.数据的存储结构又叫物理结构。

8.数据的存储结构形式包括顺序存储、链式存储、索引存储和散列存储。

9.线性结构中的元素之间存在一对一的关系。

10.树形结构中的元素之间存在一对多的关系。

11.图形结构的元素之间存在多对多的关系。

12.数据结构主要研究数据的逻辑结构、存储结构和算法(或运算) 3个方面的内容。

13.数据结构被定义为(D,R),其中D是数据的有限集合,R是D上的关系有限集合。

14.算法是一个有穷指令的集合。

15.算法效率的度量可以分为事先估算法和事后统计法。

16.一个算法的时间复杂度是算法输入规模的函数。

17.算法的空间复杂度是指该算法所耗费的存储空间,它是该算法求解问题规模的n的函数。

18.若一个算法中的语句频度之和为T(n)=6n+3nlog2n,则算法的时间复杂度为O( nlog2n)。

数据结构(C)严蔚敏(数组与广义表)PPT课件

数据结构(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

数据结构数组和广义表

数据结构数组和广义表

数据结构05数组与广义表数组与广义表可以看做是线性表地扩展,即数组与广义表地数据元素本身也是一种数据结构。

5.1 数组地基本概念5.2 数组地存储结构5.3 矩阵地压缩存储5.4 广义表地基本概念数组是由相同类型地一组数据元素组成地一个有限序列。

其数据元素通常也称为数组元素。

数组地每个数据元素都有一个序号,称为下标。

可以通过数组下标访问数据元素。

数据元素受n(n≥1)个线性关系地约束,每个数据元素在n个线性关系地序号 i1,i2,…,in称为该数据元素地下标,并称该数组为n维数组。

如下图是一个m行,n列地二维数组A矩阵任何一个元素都有两个下标,一个为行号,另一个为列号。

如aij表示第i行j列地数据元素。

数组也是一种线性数据结构,它可以看成是线性表地一种扩充。

一维数组可以看作是一个线性表,二维数组可以看作数据元素是一维数组(或线性表)地线性表,其一行或一列就是一个一维数组地数据元素。

如上例地二维数组既可表示成一个行向量地线性表: A1=(a11,a12,···,a1n)A2=(a21,a22, ···,a2n)A=(A1,A2, ···,Am) ············Am=(am1,am2, ···,amn)也可表示成一个列向量地线性表:B1=(a11,a21,···,am1)B2=(a12,a22, ···,am2)A=(B1,B2, ···,Bm) ············Bn=(a1n,a2n, ···,amn)数组地每个数据元素都与一组唯一地下标值对应。

数据结构05数组和广义表11

数据结构05数组和广义表11

2021/11/8
12
设有m×n二维数组Amn,下面我们看按元素的下标求其 地址的计算:
以“行为主序”的分配为例:设数组的基址为LOC(a11), 每个数组元素占据l个地址单元,那么aij 的物理地址可用一 线性寻址函数计算:
LOC(aij) = LOC(a11) + ( (i-1)*n + j-1 ) * l 在C语言中,数组中每一维的下界定义为0,则:
(1) 取值操作:给定一组下标,读其对应的数据元素。
(2) 赋值操作:给定一组下标,存储或修改与其相对应的
数据元素。
我们着重研究二维和三维数组,因为它们的应用是广泛的,
尤其是二维数组。
2021/11/8
9
5.1.3 数组的存储结构
• 通常,数组在内存中被映象为向量,即用向量作为数组的 一种存储结构,这是因为内存的地址空间是一维的,数组的行 列固定后,通过一个映象函数,则可根据数组元素的下标得到 它的存储地址。
• 任一数据元素的存储地址可由公式算出:
Loc(a i,j)=loc(a 0,0)+(i*n+j)*L
– 以列序为主序的顺序存储
• 在以列序为主序的存储方式中,数组元素按列向量排列, 即第j+1个列向量紧接在第j个列向量之后, 把所有数组 元素顺序存放在一块连续的存储单元中。
• 任一数据元素的存储地址可由公式算出
–Loc(a i,j)=loc(a c1,c2)+[(j-c1)*(d1-c1+1)+(i-c1)]*L
2021/11/8
8
5.1.2 数组的基本操作
数组一旦被定义,它的维数和维界就不再改变。因此,除了 结构的初始化和销毁之外,数组的基本操作一般不会含有元素 的插入或删除等操作,数组只有访问数组元素和修改元素值的 操作。

数据结构知识点归纳

数据结构知识点归纳

一、数据结构的章节结构及重点构成数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态存储分配。

对于绝大多数的学校而言,“外排,文件,动态存储分配”三章基本上是不考的,在大多数高校的计算机本科教学过程中,这三章也是基本上不作讲授的。

数据结构的章节比重大致为:1.概论:概念,时间复杂度。

2.线性表:基础章节,必考内容之一。

概念,算法设计题。

3.栈和队列:基本概念。

4.串:基本概念。

5.多维数组及广义表: 基本概念。

6.树和二叉树:重点难点章节,各校必考章节。

概念,问答,算法设计题。

7.图:重点难点章节,各校必考章节。

概念,问答,算法设计题。

8.查找:重点难点章节,概念,问答。

9.排序:重点难点章节,问答各种排序算法的排序过程二、各章节的主要内容:第一章概述主要内容:本章主要起到总领作用,为读者进行数据结构的学习进行了一些先期铺垫。

大家主要注意以下几点: (1)数据结构的基本概念。

(数据;数据元素;数据项;数据结构;数据的逻辑结构:线性和非线性,具体分为集合、线性结构、树形结构和图状结构;数据的存储结构:顺序存储和链式存储;运算)(2)算法的度量:时间效率和空间效率,分别用时间复杂度和空间复杂度度量,掌握时间复杂度的度量方法量方法。

(大O表示法)参考题目:填空题:1、数据结构是相互之间存在一种或多种特定关系的数据元素的集合,它包括三方面的内容,分别是数据的逻辑结构、()和()。

2、数据结构按逻辑结构可分为两大类,它们分别是()和()3. 数据的物理结构主要包括()和()两种情况。

4.线性表,栈,队列和二叉树四种数据结构中()是非线性结构,()是线性结构。

5、线性结构中元素之间存在()关系,树形结构中元素之间存在()关系,图形结构中元素之间存在()关系。

6、程序段的时间复杂度是_______。

for(i=1;i<=n;i++){ k++;for(j=1;j<=n;j++)x=x+k;}7.下列算法的时间复杂度是_____。

数据结构讲义第5章-数组和广义表

数据结构讲义第5章-数组和广义表
对于一个矩阵结构,显然用一个二维数组来表示是非常 恰当的.但有时会遇到这样一类矩阵:在这种矩阵中有 许多值相同的元素或者是零元素,为了节省存储空间, 可以对这类矩阵进行压缩存储. 压缩存储是:为多个值相同的元素只分配一个存储空间: 对零元素不分配存储空间. 特殊矩阵:值相同的元素或者零元素在矩阵中的分布有 一定规律,则称此类矩阵为特殊矩阵,反之,称为稀疏 矩阵.
5.4 广义表
5)若广义表不空,则可分成表头和表尾,反之,一对表头和表尾 可唯一确定广义表 对非空广义表:称第一个元素为L的表头,其余元素组成的表称 为LS的表尾; B = (a,(b,c,d)) 表头:a 表尾 ((b,c,d)) 即 HEAD(B)=a, C = (e) D = (A,B,C,f ) 表头:e 表尾 ( ) TAIL(B)=((b,c,d)),
5.4 广义表
4)下面是一些广义表的例子; A = ( ) 空表,表长为0; B = (a,(b,c,d)) B的表长为2,两个元素分别为 a 和子表(b,c,d); C = (e) C中只有一个元素e,表长为1; D = (A,B,C,f ) D 的表长为4,它的前三个元素 A B C 广义表, 4 A,B,C , 第四个是单元素; E=( a ,E ) 递归表.
以二维数组为例:二维数组中的每个元素都受两个线性关 系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继. 在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
a11 a21 ┇ a12 a22 ┇ ai2 ┇ … amj … amn … aij … ain … … a1j a2j … … a1n a2n β1 β2 ┇ βi ┇ βm
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

an-10, an-11,…,an-1n-1的次序存放在一个含有n(n+1)/2个
元素的向量sa[]中(因下三角元素总数为n(n+1)/2)。即
将aij存放在sa[i(i+1)/2+j]中(0≤i≤n-1,0 ≤j≤i)。
VC++
7
表第 五 章
多 维 数 组 和 广 义
算 法 演
②对称矩阵中的元素aij和sa[k]之间的对应关系: 若i≥j,k=i×(i+1)/2+j 0≤k<n(n+1)/2

对于三元组表,除了描述稀疏矩阵的非零元素
外,为了运算方便,还应将矩阵的总行数、总列数
下 一
和非零元素的总数也作为三元组表的属性进行描述。
页 4、三元组表的描述
#define MaxSize 100 //三元组表空间的最大容量
返 typedef int DataType //结点类型
回 typedef struct { //三元组结点定义
和n个直接后继。
下 一
因此,多维数组的逻辑特征是:一个数据元素可能
页 有多个直接前驱和多个直接后继。
三、数组的顺序存储表示

由于计算机内存的结构是一维的,因此用内存来
回 表示多维数组,必须将数组元素按某种次序排成线
性序列后存人存储器。又由于数组一般不做插入和
VC++
删除操作,即数组一旦建立,结构中元素个数和元
按行优先顺序元素aij存放在sa[2i+j]中。
10
表第 五 章
多 维 数 组 和 广 义
算 二、稀疏矩阵的压缩存储
法 演
1、稀疏矩阵的定义:设矩阵Amn中有s个非零元素,
示 若s远远小于矩阵元素的总数(即s<<m×n),则称A为
上 稀疏矩阵。
一 页
2、稀疏矩阵的压缩存储
在存储稀疏矩阵时,为了节省存储单元,只需
5
表第 五 章
多 维 数 组 和 广 义
算 四、数组元素的地址计算公式
法 演
按行优先方式顺序存储的数组,只要知道开始
示 结点的存储地址、多维数组的维数和各维的上下界,
上 以及数组元素在内存中占用的字节数,就可求出
一 页
每个元素的存储地址。因此,数组中的任一元素可
以在相同的时间内存取,即顺序存储的数组是一个
表第 五 章
多 维 数 组 和 广 义

第五章 多维数组和广义表

前面讨论的线性表、链表、栈和队列都是线性
演 示
的数据结构,它们的逻辑特征是:每个数据元素至
多有一个直接前驱和一个直接后继。本章要介绍的
上 数组是指至少二维数组的多维数组,它是一种复杂
一 页
的非线性结构,它的逻辑特征是:一个数据元素可
能有多个直接前驱和多个直接后继。
一 页
aij aji 0 i, j n ,则称A为n阶对称矩阵。
2)对称矩阵的压缩存储:由于对称矩阵中的元素关
下 于主对角线对称,所以只要存储矩阵中上三角或下
一 页
三角中的元素,让每两个对称的元素共享同一个存
储空间,这样可以节约近一半的存储空间。
返 ①按“行优先顺序”存储下三角中的元素

将下三角中的元素aij(i≥j)按线性序列a00,a10,a11,…,
下 随机存取结构。


设二维数组Amn按行优先存储,各维的下界为0,
上界分别为m-1,n-1,每个元素占内存的字节数为d,
返 如果用LOC(a00)表示a00的地址,则aij的地址为:

LOC (aij ) LOC (a00 ) (i n j) d 0 i m, 0 j n
同理,三维数组Amnp按行优先存储,则aijk的地址为:
下 存储非零元素。由于非零元素的分布一般是没有规
一 页
律的,因此在存储非零元素的同时,还必须存储非
零元素所在的行号、列号,才能迅速确定一个非零
返 元素是矩阵中的哪一个元素。于是矩阵中每一个非 回 零元素就由所在的行号、列号和值组成一个三元组(i,
j,aij)惟一确定。稀疏矩阵的压缩存储会失去随机存 取功能。
正好有3n-2个,因此,三对角矩阵可压缩存储到含
返 有3n-2个元素的向量sa[]中。
回 ➢三对角矩阵中aij和sa[k]之间的对应关系
元素aij前共有i行,其中非0元素共有3i-1个;第i
VC++
行中前面已有i-1个0,所以aij前非0元素有j-(i-1)个,
因此aij前已有的非零元素个数为: 3i-1+j-(i-1)=2i+j。
2、三角矩阵
返 1)三角矩阵的定义:把主对角线以下(不包括主对
回 角线)的元素均为常数c的n阶矩阵,称为上三角矩阵;
把主对角线以上(不包括主对角线)的元素均为常数c
的n阶矩阵,称为下三角矩阵;上三角矩阵和下三角
VC++
矩阵统称为三角矩阵。三角矩阵中的常数c在多数情
况下为0。
8
表第 五 章
多 维 数 组 和 广 义
am1 am2 amn
上 一 页
矩阵的每一行和每一列都可以看成是一个向量,因 此,二维数组可以看成是由m个行向量组成的(列)向
量,也可以看成是由n个列向量组成的(行)向量。
下 2、二维数组的逻辑结构
一 页
二维数组中的每个元素aij均属于两个向量:一个
是第i行的行向量,另一个是第j列的列向量。因此,
和两个直接后继。
3
表第 五 章
多 维 数 组 和 广 义
算 3、多维数组的逻辑结构
法 演
1)三维数组:三维数组可以看成是以二维数组为元
示 素的向量。三维数组的每个元素aijk至多有三个直接
前驱和三个直接后继。
上 一
2)n维数组:n维数组可以看成是以n-1维数组为元
页 素的向量。 n维数组的每个元素至多有n个直接前驱
VC++
稀疏矩阵进行压缩存储通常有两类方法:顺序
存储和链式存储(十字链表法)。
11
表第 五 章
多 维 数 组 和 广 义
算 3、三元组表
法 演
若将表示稀疏矩阵的非零元素的三元组按行(或
示 列)优先的顺序排列(跳过零元素),则得到一个结点
均为三元组的线性表,我们将该线性表的顺序存储
上 一
结构称为三元组表。
有n-i个元素,按行优先顺序存放上三角矩阵中的元
下 一
素aij时:aij前有i行(从第0行到第i-1行),一共有:
页 (n-0)+(n-1)+(n-2)+…+(n-i+1)=i(2n-i+1)/2个元素;在
第i行上,aij前恰有j-i个元素,因此aij存放在 返 sa[i(2n-i+1)/2+j-i]中(0≤i≤n-1,i≤j≤n-1)。
示 角线为中心的带状区域中,即除了主对角线和主对
角线相邻两侧的若干条对角线上的元素之外,其余
上 一
元素皆为零的矩阵为对角矩阵。
页 2)k对角矩阵:一个满足条件若|i-j|>(k-1)/2,则aij=0
的矩阵A是k对角矩阵,其中k为奇数。特别,当k=3
下 一
时,称为三对角矩阵。
页 3)三对角矩阵的压缩存储:三对角矩阵中非0元素
返 回
除边界元素外,每个元素aij都恰好有两个直接前驱 aij-1和ai-1j,两个直接后继aij+1和ai+1j。而除开始结点 和终端结点外的边界结点都只有一个直接前驱和一
个直接后继。开始结点没有前驱只有一个直接后继,
VC++
终端结点只有一个直接前驱没有后继。因此,二维
数组的逻辑结构是:每个元素至多有两个直接前驱
VC++
LOC (aijk ) LOC (a000 ) (i n p j p k) d
0 i m,0 j n,0 k p
6
表第 五 章
多 维 数 组 和 广 义

5.2 矩阵的压缩存储
法 演
一、常用矩阵的压缩存储
示 1、对称矩阵
上 1)对称矩阵的定义:如果n阶矩阵A的元素满足
上 一 页
例51}、)T如用矩ri:T三阵uA稀p4元的l5疏eT组 转矩a0003b表置l阵e000实:;1的现把0004三一矩元0002个阵组0600m的表×转表dddn置aaa矩示tttaaa运[[[阵321]]]算A210的行423变成64-相2 应的
下 列,所得到的n×m矩阵B称为da矩ta[阵4] A3的转1置矩-1阵。
一 页
2)运算要求:由于稀疏矩阵A是按行优先的顺序存
储的三元组表稀唯疏矩一阵确定的,所以,求稀疏矩阵A的转

置矩阵B,就是求能唯一确定转置三矩元阵组B表的三元组表, 且该三元组表必须是按行优先的顺序存储的。
回 3)实现方法:
方法一:简单地交换矩阵A的三元组表a->data中row
VC++
和col中的内容,得到按列优先顺序存储的转置矩阵
下 一
2、 列优先顺序

将数组元素按列向量排列,第j+1个列向量紧接
返 在第j个列向量后面。例如,二维数组Amn的按列优 回 先存储的线性序列为:
VC++
a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
注意:C语言中的数组是按行优先顺序存储的,数组
元素下标的下界值为0。
示 若i<j,k=j×(j+1)/2+i 0≤k<n(n+1)/2
相关文档
最新文档