原创:https://blog.csdn.net/mzj15101229871/article/details/107613162
(博主总结的很完整,很厉害,本人为了查看方便,才转载的。本人只是个小白~)
第一章 绪论
考试大纲
1)了解数据元素、数据结构、抽象数据类型、存储结构等概念;了解算法概念及算法设计的基本要求 ;
2)掌握算法分析方法、语句的频度和估算时间复杂度、空间复杂度分析方法。
考查要点
1.数据结构的研究内容
包括数据的逻辑结构、数据的存储结构和对数据元素施加的操作(即数据的运算)三方面。
2.算法概念及其评价
五大特性:有穷性、确定性、可行性、输入性、输出性;
算法评价:正确性、可读性、健壮性、高效性、低存储性;
要特别弄清诸如语句频度、时间复杂度、空间复杂度等的概念,评价一个算法好坏的两个主要标准——时间复杂度和空间复杂度。
3.算法和程序的区别
a. 程序不一定满足有穷性(如操作系统);
b. 程序中的指令必须是机器可执行的,算法中的指令则无此限制;
c. 算法代表了对问题的解,程序则是算法在计算机上的特定的实现(一个算法若用程序设计语言来描述,它才是一个程序);
d. 数据结构+算法=程序。
4.数据结构的相关概念
数据结构包括数据的逻辑结构和数据的存储结构。
数据元素是组成数据的基本单位。
数据项是数据不可分割的最小单位。
数据逻辑结构的两大类型(线性结构、非线性结构)、抽象数据类型(是指一个数学模型以及定义在该模型上的一组操作)。
数据的四种逻辑结构(集合、线性、树形、图形)
数据的四种存储结构(顺序、链式、索引、散列)
不管是顺序存储结构还是链式存储结构,都要存储数据元素本身和数据元素之间的关系
顺序存储结构、链式存储结构都可存各种逻辑结构
5.数据逻辑结构、存储结构的区别和联系
区别:数据的逻辑结构是一个数学模型;数据的存储结构是数据的逻辑结构在计算机内部的存储方式。
联系:一种逻辑结构可以用多种存储结构来存储;一种存储结构可以用来存多种逻辑结构。
课后习题
一、填空题
- 数据结构包括数据的逻辑结构、数据的存储结构和 数据的运算 。
- 数据的逻辑结构可以分为 线性 和 非线性 两大类型。
- 在算法正确的前提下,评价一个算法好坏的两个主要标准是 时间复杂度 和 空间复杂度 。
- 对于给定的n个元素,可以构造出的逻辑结构有线性、树形 、 图形 和 集合 四种。
- 数据的存储结构不仅有顺序存储结构、链式存储结构,还有 索引存储结构 和 散列存储结构 。
- 组成数据的基本单位是 数据元素 。
- 数据结构的两个要素是 数据元素 和 数据元素之间的关系 。
- 语句频度是 语句重复执行的次数 。
- 算法是 对特定问题求解步骤的一种描述,是指令的有限序列 。
- 数值计算问题是 操作对象之间的关系可以用数学方程加以描述的问题 ;非数值计算问题是 操作对象之间的关系不能用数学方程加以描述的问题 。
- 程序是 算法在计算机上的特定的实现 。
- 抽象数据类型是 指一个数学模型以及定义在该模型上的一组操作 。
- 学习数据结构课程的目的是 非数值计算问题的程序设计 。
- 算法可用 自然语言、流程图、N-S图、计算机语言、伪码语言等 描述。
- 存储密度是 一个结点中数据元素所占的存储单元和整个结点所占的存储单元之比 。
二、简答题
- 试说明算法与程序有哪些区别? 答:至少有四点区别:
(1)程序不一定满足有穷性(如操作系统);
(2)程序中的指令必须是机器可执行的,算法中的指令则无此限制;
(3)算法代表了对问题的解,程序则是算法在计算机上的特定的实现(一个算法若用程序设计语言来描述,它才是一个程序);
(4)数据结构+算法=程序。- 举一个数据结构的例子,叙述其逻辑结构、存储结构和运算(操作)三方面的内容。 答:例如有一张学生成绩表,记录了一个班的学生各门课的成绩。按学生的姓名为一行记成的表,这个表就是一个数据结构。每个记录(有姓名、学号、成绩等项)就是一个结点,对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其它的结点则各有一个也只有一个直接前趋和直接后继(它的前面和后面均有且只有一个记录)。这几个关系就确定了这个表的逻辑结构——线性结构。
那么我们怎样把这个表中的数据存储到计算机里呢? 用高级语言如何表示各结点之间的关系呢?
是用一片连续的内存单元来存放这些记录(如用数组存储,亦即顺序存储)还是随机存放各结点数据再用指针进行链接(链式存储)呢?
这就是存储结构的问题,我们都是从高级语言的层次来讨论这个问题的。
最后,我们有了这个表(数据结构),肯定要用它,那么就是要对这张表中的记录进行查询、修改、删除等操作,对这个表可以进行哪些操作以及如何实现这些操作就是数据的运算(操作)问题了。- 什么叫算法效率?如何度量算法效率?
答:算法效率包括时间效率和空间效率。时间效率指算法运行得有多快;空间效率关心算法需要的额外空间。算法效率通常用时间复杂度和空间复杂度来度量。- 数据的逻辑结构与存储结构的区别和联系是什么?
答:区别:数据的逻辑结构是一个数学模型;数据的存储结构是数据的逻辑结构在计算机内部的存储方式。
联系:一种逻辑结构可以用多种存储结构来存储;一种存储结构可以用来存多种逻辑结构。- 算法有什么特性?评价一个算法有几个标准?
答:一个算法应该具有以下五个特性:
(1)有穷性。 一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成 (有限步完成)。
(2)确定性。算法中每一条指令必须有确切的含义。不存在二义性。且算法只有一个入口和一个出口(无二义性)。
(3)可行性。一个算法是可行的。即算法描述的操作都是可以通过已经实现的基本运算执行有限次来实现的(每一步都可通过执行有限次基本操作实现)。
(4)输入性。一个算法有零个或多个输入,这些输入取自于某个特定的对象集合(有零个或多个输入)。
(5)输出性。一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量(有一个或多个输出)。
评价一个算法有以下几个标准:
(1)正确性。算法应满足具体问题的需求。
(2) 可读性。 算法应该好读。以有利于阅读者对程序的理解。
(3)健壮性。算法应具有容错处理。当输入非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。
(4)高效性。指算法执行的时间和执行过程中所需要的最大存储空间要少。一般,这两者与问题的规模有关。
思维导图
第二章 线性表
考试大纲
1)理解线性表的定义和基本操作;线性表的抽象数据类型定义;
2)掌握线性表的顺序存储结构及应用方法;
3)掌握线性表的链式存储结构(单链表,双链表,循环链表)。
具体要求
要求掌握线性表的顺序存储方式下的元素插入、元素删除及线性表遍历算法;要求掌握线性表的链式存储方式下,元素的插入、元素的删除及线性表遍历算法(带头结点及不带头结点的单链表)
考查要点
1.线性表的定义
从数据对象、元素间的关系、基本操作三方面进行阐述。
2.线性表的两种存储结构及其优缺点
线性表的顺序存储是指在内存中用地址连续的一块存储空间对线性表中的各元素按其逻辑顺序依次存放,用这种存储形式存储的线性表称为顺序表。线性表的链式存储结构是用一组任意的存储单元存储线性表的各个数据元素。为了表示线性表中元素的先后关系,每个元素除了需要存储自身的信息外还需保存直接前趋元素或直接后继元素的存储位置。所以,链式存储结构的线性表其元素之间的逻辑关系是通过结点的指针域来表示的。
顺序存储有三个优点:
(1)方法简单,用数组,容易实现。
(2)不用为表示结点的逻辑关系而增加额外开销。
(3)具有按元素序号随机访问的特点。
两个缺点:
(1)进行插入、删除时,平均移动表中一半的元素,
效率较低。
(2)需预先分配足够大的存储空间。空间估计过大,会导致空间闲置(造成浪费);预先分配过小,又会造成溢出。
链表的优缺点恰好与顺序表相反。
与线性表两种存储结构有关的知识有:线性表中逻辑上相邻的两个元素其存放位置不一定相邻;线性表的链式存储表示不一定优于顺序存储表示;链式存储方式以指针表示结点间的逻辑关系;一个需经常作插入、删除运算的线性表应采用链式存储结构;线性表元素个数稳定、很少进行插入和删除操作应采用顺序存储结构;若线性表最常用的操作是存取第 i 个元素及其前驱元素的值,则采用顺序存储方式最节省运算时间;在顺序存储结构、链式存储结构上删除元素的平均时间复杂度。
3.线性表的建立、插入、删除、输出
顺序表的类型定义、插入、删除,单链表的建立(头插建立、尾插建立)、插入(后插的基本操作)、删除、输出历来都是重点。
如删除顺序表中某元素多少元素需移动、在顺序表中插入一个元素有多少元素需移动等。
再如在一个单链表的p所指的结点之后插入一个s所指的结点的操作、根据单链表结点类型定义写出带头结点单链表的升序插入、在带头结点单链表中查找元素并返回其地址、删除带头结点单链表中某元素、统计带头结点单链表中元素个数算法(函数)。
例1:设有一带头结点的数据域为整型数据的单链表h,给出单链表结点类型定义,并设计算法输出单链表中的所有元素。
typedef struct node{ int data;struct node *next;} slnode;
void output(slnode *h){ slnode *p;p=h->next; while(p!=null){ printf(“%d”,p->data);p=p->next; }}
例2 设有一带头结点的数据域为整型数据的单链表H,给出单链表结点类型定义,并设计算法统计单链表中元素x的个数。
typedef struct node{ int data;struct node *next;} slnode;
int tj(slnode *H){ slnode *p;int n=0; p=H->next; while(p!=NULL){ if (p->data==x) n++;p=p->next; }return n; }
4.单链表头结点的作用:简化运算。
课后习题
------------------------------------------ 顺序表 ------------------------------------------
一.填空题
- 当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取 线性表中的元素时,应采用 顺序 存储结构。
- 线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个 元素平均需要移动元素的个数是(n-1)/2 。
- 顺序表中查找某个元素时,从前到后查找与从后到前查找的时间复杂度 相 同。
- 在具有n个元素的顺序表中插入一个元素,合法的插入位置有 n+1 个。
- 在一个长度为n 的顺序表中第i 个元素(1<=i<=n)之前插入一个元素时,需向后移动n-i+1 个元素。
- 顺序存储结构的线性表中所有元素的地址 一定 连续。
- 顺序存储结构的线性表其物理结构与逻辑结构是 一致 的。
- 在具有n个元素的顺序存储结构的线性表任意一个位置中插入一个元素,在等概率条件下,平均需要移动 n/2 _个元素。
- 在具有n个元素的顺序存储结构的线性表任意一个位置中删除一个元素,在等概率条件下,平均需要移动__(n-1)/2 __个元素。
- 在具有n个元素的顺序存储结构的线性表中查找某个元素,平均需要比较(n+1)/2次。
- 顺序存储结构的线性表中,插入或删除某个元素时,元素移动的次数与其位置 有 关(填有或无)。
- 顺序存储结构的线性表中,访问第i个元素与其位置 无 关。(填有或无)。
- 在具有n个元素的顺序存储结构的线性表中要访问第i个元素的时间复杂度是 O(1) 。
- 在顺序表L中的i个位置插入某个元素x,正常插入时,i位置以及i位置以后的元素需要后移,首先后移的是 最后一 个元素。
- 要删除顺序表L中的i位置的元素x,正常删除时,i位置以后的元素需要前移,首先前移的是 第i+1个元素(或i+1位置上的元素)。
- 在具有n个元素的顺序存储结构的线性表中插入某个元素的时间复杂度是 O(n) 。
- 若顺序表中的元素是从1位置开始存放的,要删除具有n个元素的顺序表中某个元素,合法的删除位置是 1到n 。
- 在具有n个元素的顺序存储结构的线性表中删除某个元素的时间复杂度是 O(n) 。
- 什么是顺序存储结构?顺序存储结构的优点和缺点各是什么? 答:顺序存储结构是把逻辑上相邻的元素存储在物理位置相邻的存储单元中。通常用数组实现。
顺序存储有三个优点:
(1)方法简单,用数组,容易实现。
(2)不用为表示结点的逻辑关系而增加额外开销。
(3)具有按元素序号随机访问的特点。
顺序存储有两个缺点:
(1)进行插入、删除时,平均移动表中一半的元素,效率较低。
(2)需预先分配足够大的存储空间。空间估计过大,会导致空间闲置(造成浪费);预先分配过小,又会造成溢出。------------------------------------------ 链表------------------------------------------
一.填空题
- 单链表中增加头结点的目的是为了 简化操作 。
- 用单链表方式存储线性表,每个结点需要两个域,一个是数据域,另一个是 指针域 。
- 在一个单链表的p所指的结点之后插入一个s所指的结点,应执行的操作是:s->next=p->next 和 p->next =s 。
- 某带头结点的单链表的头指针为head,判定该链表为空的条件是 head->next==NULL。
- 在带有头结点的单链表HL中,要在首元素之前插入一个由指针p指向的结点,则应执行p->next=HL->next及 HL->next=p 操作。
- 设指针变量p指向单链表中某结点A,则删除结点A的后继结点需要的操作为p->next=p->next->next (不考虑存储空间的释放)。
- 链式存储结构的线性表其元素之间的逻辑关系是通过结点的 指针 域来表示的。
- 单循环链表L中指针P所指结点为尾结点的条件是 P->next==L 。
- 访问具有n个结点的单链表中任意一个结点的时间复杂度是 O(n) 。
- 在单链表L中,指针P所指的结点有后继结点的条件是_ P->next!=NULL__。
- 链式存储结构的线性表中所有元素的地址 不一定 连续。
- 链式存储结构的线性表中,插入或删除某个元素所需的时间与其位置 无 关(填有或无)
- 在单链表L中,指针P所指的结点为尾结点的条件是_ P->next==NULL__。
- 头插法建立单链表时,元素的输入顺序与在链表中的逻辑顺序是 相反 的。
- 尾接法建立单链表时,元素的输入顺序与在链表中的逻辑顺序是 相同 的。
- 若要将一个单链表中的元素倒置,可以借助 头插法 建立单链表的思想将链表中的结点重新放置。
- 线性表用链式存储结构存储比用顺序存储结构存储所占的存储空间 不一定 多(填一定或不一定)。
- 线性表中逻辑上相邻的两个元素其存放位置 不一定 相邻。
- 什么是链式存储结构?链式存储结构的优点和缺点各是什么?
答:链式存储结构是对逻辑上相邻的元素不要求其物理位置相邻,元素间的逻辑关系通过附加的指针字段来表示。通常用指针来实现。
链式存储有两个优点:
(1)进行插入、删除时,不需移动表中的元素,只需修改指针,效率较高。
(2)不需预先分配存储空间,当需要存储空间时,临时开辟空间,不会造成空间浪费。
链式存储有三个缺点:
(1)方法比顺序存储复杂,不易实现。
(2)为表示结点的逻辑关系需要增加额外空间。
(3)不具有按元素序号随机访问的特点。- 单链表中头指针、头结点和第一个结点(开始结点)三者的区别是什么?
答:头指针是头结点(或第一个结点)的地址。
单链表如果不带头结点的话,头指针是第一个结点的地址;单链表如果带头结点的话,头指针是头结点的地址。
头结点是第一个结点前面的一个结点,它的数据域无定义,指针域中存放的是第一个数据结点的地址,空表时为空。
第一个结点就是第一个存放数据的结点。
思维导图
第三章 栈和队列
考试大纲
1)理解栈的定义和基本操作及栈的抽象数据类型定义;
2)掌握顺序栈及链式栈的操作方法;
3)掌握栈在递归算法、 算术表达式求值及其它应用。
4)理解队列的定义和基本操作及队列的抽象数据类型;
5)掌握顺序队列的操作方法,了解链式队列的操作方法;
具体要求
要求掌握栈的顺序存储和链式存储两种方式下入栈、出栈的算法;循环队列的顺序存储方式下,入队和出队算法。
考查要点
1.栈和队列的概念、特点
如:栈和队列是特殊的线性表
栈和队列的存储方式,既可以是顺序方式,又可以是链式方式。
同一栈内各元素的类型必须一致
栈是限定仅能在表尾一端进行插入、删除操作的线性表;
队列是限定仅能在表头进行删除、表尾进行插入的线性表;
栈的特点是后进先出;
队列的特点是先进先出。
若将1,2,3按先后次序入栈,出栈顺序不可能为3,1,2
在作进栈运算时应先判别栈是否已满,在作退栈运算时应先判别栈是否已空,当栈中元
素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为n。
2.顺序栈、链栈、循环队列、链队列 如循环队列解决什么问题?假溢出 循环队列队空、队满判断: 在少用一个存储单元的前提下 front ==
rear时队空; (rear + 1) % maxsize == front 时队满。
例:循环队列用数组A[0…m-1]存放其元素值,已知其头尾指针分别为front和rear,则当前元素个数为 (rear-front+m)
% m; 为了解决普通顺序存储结构队列的“假溢出”现象,节约内存单元,通过在队列操作中加入 数学中的求余运算,可以将其构造成循环队列;
在循环队列中,为了能够区分队满和队空,往往少用一个元素空间。在这种情况下,队满的 条件是尾指针+1等于头指针。
3.什么情况下要用栈?什么情况下要用队列?
后进先出;先进先出。
如括号匹配、图的深度遍历等用栈实现。
二叉树的层次遍历、图的广度遍历等用队列实现。
例:解决计算机与打印机之间速度不匹配问题,须设置一个数据缓冲区,应是一个队列结构。
4.栈容量大小判断
如设栈S和队列Q的初始状态均为空,元素e1,e2,e3,e4,e5,e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队序列为 e2,e4,e3,e6,e5,e1, 则栈S的容量至少为多少?(至少为3)。
5.对同一问题的求解程序,递归程序无论时间还是空间都不如非递归程序。
例:对同一问题的求解程序,递归程序比非递归程序要花费更多的时间;
任何一个递归过程都可以转换成非递归过程;
思维导图
课后习题
一.填空题
- 为了解决普通顺序存储结构队列的“假溢出”现象,节约内存单元,通过在队列操作中 加入数学中的 求余 运算,可以将其构造成循环队列。
- 解决计算机与打印机之间速度不匹配问题,须设置一个数据缓冲区,应是一个 队列 结构。
- 循环队列是为了解决 假溢出 问题而将一个顺序表想像成一个首尾相接的顺序表。
- 在循环队列中,如果其头指针为front,队列中元素个数为len,则该队列为空队的条件 是 len==0 。
- 队列的插入操作在 队尾 进行。
- 队列的删除操作在 队头 进行。
- 一个栈的输入序列是:1,2,3 则不可能的栈输出序列是 3,1,2 。
- 队列是限制插入只能在表的一端,而删除在表的另一端进行的线性表,其特点是 先进先出(或后进后出) 。
- 队列的特点是 先进先出(或后进后出) 。
- 队列 称作先进先出表。
- 栈和队列是两种 操作受限制的 线性表。
- 在作进栈运算时要判别栈是否 已满 。
- 在作退栈运算时要先判别栈是否 已空 。
- 在循环队列中,为了能够区分队满和队空,往往少用一个元素空间。在这种情况下,队 满的条件是 (rear + 1) % MAXSIZE == front ( 假定循环队列的最大容量为MAXSIZE,队首是front,队尾是rear)。
- 栈的特点是 先进后出(或后进先出) 。
二.简答题
循环队列的优点是什么?如何判别循环队列的"空"或"满"? 答:循环队列的优点是:它可以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得到充分的利用。
判别循环队列的"空"或"满"通常有两种方法: (1)另设一个变量num记录当前队列中的元素个数,当num == 0时队空,
num==maxsize时队满。 (2)少用一个存储单元(即少存一个元素), 队空条件为front = =rear,队满条件为(rear +1) % maxsize == front 。栈的特点是什么?队列的特点是什么? 答:栈的特点是先进后出,队列的特点是先进先出。
什么是递归?递归有什么优点? 答:一个直接调用自己或通过一系列调用间接调用自己的过程称为递归。 递归程序结构清晰,可读性强,而且容易用数学归纳法来证明程序的正确性。
什么是栈顶?什么是栈底? 答:允许插入和删除的一端是栈顶。
不允许插入和删除的一端是栈底。出栈和读栈顶元素有无区别?若有,其区别是什么? 答:出栈和读栈顶元素有区别。在栈s存在且非空的情况下,出栈是将栈s的顶部元素从栈中删除,栈中少了一个元素,栈发生变化;读栈顶元素是读栈顶元素,栈不变化。
链栈和单链表有什么相同点和不同点? 答:链栈实际就是不带头结点的单链表。其结构完全一样,不同的是链栈只允许头插、头删,而单链表可在其它位置插入和删除。
链队列和单链表有什么相同点和不同点? 答:相同点:结点类型相同。
不同点:链队列只允许头删、尾插,而单链表可在其它位置插入和删除。什么是顺序表?什么是顺序栈?两者之间有什么联系和区别? 答:线性表的顺序存储是指在内存中用地址连续的一块存储空间对线性表中的各元素按其逻辑顺序依次存放,用这种存储形式存储的线性表称为顺序表。利用顺序存储方式实现的栈称为顺序栈。顺序栈是顺序表的特殊情况,顺序栈只允许在栈顶插入和删除,而顺序表可在其它位置插入和删除。
设栈S和队列Q的初始状态均为空,元素e1,e2,e3,e4,e5,e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队序列为 e2,e4,e3,e6,e5,e1, 则栈S的容量至少为多少?写出其分析过程。 答:至少为3(分析过程略)。
补充
1、利用栈实现表达式的转换(中缀转后缀,中缀赚前缀)
- 中缀转后缀
利用栈将中缀表达式转化成后缀表达式
目的:将中缀表达式(即标准形式的表达式)转换为后缀式。
例子:a+bc+(de+f)g转换成abc+def+g+转换原则
遇到操作数, 直接输出
操作符的优先级为 () 最大, * / 次之, ± 最小. 遇到操作符后, 假如操作符堆栈为空, 则直接压入操作符, 否则判断当前操作符与栈顶操作符的优先关系, 假如栈顶操作符的优先级大于 等于当前操作符的优先级, 那么弹出栈顶操作符, 持续弹出,
直到栈顶操作符优先级小于当前操作符优先级或栈为空. 最后将当前操作符入栈如果遇到右括号, 那么将栈顶操作符弹出, 持续弹出直到遇到左括号, 左括号弹出但不输出
表达式读入完毕, 若栈不为空, 则持续弹出栈顶操作符, 直到栈为空
- 中缀转前缀
建立一个栈来保存运算符,和一个字符容器存字符及运算符的输出。 从后向前扫描中缀表达式: 1、如果遇到的是普通字符那么存入容器中
2、如果遇到的是‘)’,存入容器中 3、如果遇到的是运算符(大于等于栈顶的优先级就入栈,否则弹栈)
如果当前栈为空或者当前运算符的优先级大于等于栈顶元素的优先级,那么入栈。 如果栈顶元素是‘)’,还是入栈。
如果当前运算符的优先级小于栈顶元素的优先级,那么弹栈存入容器中,一直到栈顶元素为‘)’或
者当前运算符的优先级大于或者等于栈顶元素的优先级。将当前运算符入栈。 4、如果遇到‘(’,那么弹栈存入容器一直遇到到‘)’,将‘)’弹出
5、返向输出容器中的字符
2、链栈进栈出栈代码实现
第四章 串
考试大纲
1)了解字符串的定义和基本操作及字符串的存储结构;
2)了解字符串的基本操作;
3)了解字符串模式匹配应用。
了解基本概念即可,不做重点处理
第五章 数组与矩阵广义表
考试大纲
1)理解数组的定义和基本操作;
2)掌握数组的顺序存储结构及应用;
3)掌握特殊矩阵和稀疏矩阵的压缩存储。
具体要求
掌握三角矩阵的压缩存储方法和稀疏矩阵三元组法的压缩存储方法。
考察要点
元素值 行下标 列下标
0 5 4 4 //第一行,元素值表示该矩阵中稀疏元素的个数,行下标值该矩阵的行数,列下标指该矩阵的列数。
1 1 0 3
2 3 1 2
3 2 1 3
4 1 2 0
5 2 3 1
课后习题
一.填空题
- 将10阶的下三角矩阵A按列优先顺序压缩存储在一维数组C中,则C数组的大小应为55 。
- 已知二维数组A[10][20]采用行优先方式存储,每个元素占2个存储单元,并且A[0][0]的 存储地址是1000, 则A[2][8]的存储地址是 1096 。
- 对5×5的下三角矩阵进行压缩存储时,如果每个元素要占3个字节,共需的存储单元数为 45 个。
- 设数组B[0…3,1…5],数组中的任一元素B[i,j]均占两个单元,从首地址SA开始,把 数组B按行序为主序进行存放,则元素B[3,4]的地址为 SA+36 。
- 已知具有n个元素的一维数组采用顺序存储结构,每个元素占k个存储单元,第一个元素的地址为LOC(a1),那么,LOC(ai)= LOC(a1)+(i-1)*k 。
- 字符串(简称串)是一种特殊的线性表,它的 数据元素 仅由一个字符组成。
- 字符串和线性表一样,它通常采用的存储方式也是 顺序存储 和 链式存储 。
- 二维数组的顺序存储可以采用以行为主序存储,也可采用 以列为主序 存储。
- 值相同元素或者零元素分布有一定规律的矩阵称为 特殊矩阵 。
- 对称矩阵是满足 aij= aji(0 i,j n-1) 条件的矩阵。
- 有较多值相同元素或较多零元素,且值相同元素或者零元素分布没有一定规律的矩阵称 为 稀疏矩阵 。
- 稀疏矩阵的压缩存储除了要保存非零元素的值外,还要保存非零元素在矩阵中的 行和列 。
- 矩阵压缩存储是指为多个值相同的元素分配一个存储空间,对 值为0的元素 不分配存储空间。
- 稀疏矩阵的压缩存储通常采用 三元组表 和 十字链表 存储。
- n阶对称矩阵元素可以只存储下三角部分,共需 n(n+1)/2 个单元的空间。
二.简答题
- 简述下列术语:空串与空白串,主串和子串,串值和串名。 答:空串与空白串:串中所包含的字符个数称为该串的长度。长度为零的串称为空串,它不包含任何字符。仅由一个或多个空格组成的串称为空白串。空串和空白串不同,例如“
”和“”分别表示长度为1的空白串和长度为0的空串。 主串与子串:串中任意连续的字符组成的子序列称为该串的子串。包含子串的串相应的称为主串。
串值和串名:串是零个或多个字符组成的有限序列。一般记作S=“a1a2a3…an”,其中ai(1≦i≦n)
是一个任意字符,可以是字母、数字或其它字符,S 是串名,引号引起来的字符序列为串值。- 按以行序为主序的存储顺序,列出四维数组a[2][3][2][4]中所有元素在内存中的存储顺 序。
答:
a[0][0][0][0]、a[0][0][0][1]、a[0][0][0][2]、a[0][0][0][3]、
a[0][0][1][0]、a[0][0][1][1]、a[0][0][1][2]、a[0][0][1][3]、
a[0][1][0][0]、a[0][1][0][1]、a[0][1][0][2]、a[0][1][0][3]、
a[0][1][1][0]、a[0][1][1][1]、a[0][1][1][2]、a[0][1][1][3]、
a[0][2][0][0]、a[0][2][0][1]、a[0][2][0][2]、a[0][2][0][3]、
a[0][2][1][0]、a[0][2][1][1]、a[0][2][1][2]、a[0][2][1][3]、
a[1][0][0][0]、a[1][0][0][1]、a[1][0][0][2]、a[1][0][0][3]、
a[1][0][1][0]、a[1][0][1][1]、a[1][0][1][2]、a[1][0][1][3]、
a[1][1][0][0]、a[1][1][0][1]、a[1][1][0][2]、a[1][1][0][3]、
a[1][1][1][0]、a[1][1][1][1]、a[1][1][1][2]、a[1][1][1][3]、
a[1][2][0][0]、a[1][2][0][1]、a[1][2][0][2]、a[1][2][0][3]、
a[1][2][1][0]、a[1][2][1][1]、a[1][2][1][2]、a[1][2][1][3]、- 给定整型数组b[3][5],已知每个元素占2个字节,b[0][0]的存储地址为1200,试求在行 序为主序的存储方式下: (1) b[2][4]的存储地址。 (2) 该数组占用的字节个数。 答:(1)loc(b[2][4])=
loc(b[0][0])+(25+2)2=1200+24=1224 应该是:loc(b[2][4])=
loc(b[0][0])+(25+4)2=1200+28=1228 (2)352=30- 已知数组A[8][10],问按列存储数组元素时A[4][6]的起始地址与数组A按行存储时的哪 一个元素的起始地址相同?稀疏矩阵的压缩存储有哪两种方法? 答:(1)假定每个元素占L个存储单元,按列存储时loc(A[4][6])=
loc(A[0][0])+(86+4)L, 设其与数组A按行存储时的A[i][j]的起始地址相同,则
loc(A[0][0])+(86+4)L = loc(A[0][0])+(10i+j)L 即86+4=10i+j
所以i=5,j=2 也就说,数组A[8][10]按列存储数组元素时A[4][6]的起始地址与数组A按行存储时A[5][2]的起始地址相同。
(2)稀疏矩阵的压缩存储有三元组表和十字链表两种存储方法。- 什么是稀疏矩阵的三元组表存储?试写出以下矩阵A的三元组顺序表。
答:存储稀疏矩阵非零元素的值、所在行和列,以及稀疏矩阵非零元素的个数、行数、列数的顺序存储叫稀疏矩阵的三元组表存储。 矩阵A的三元组顺序表为: A=( (4,6,5), (1,3,1), (1,5,2), (2,1,3), (3,4,4), (4,2,5)
) (用A[0]存储稀疏矩阵行数、列数、非零元个数)- 设A是一个具有m 行n列的元素的二维数组,每个元素占用s 个存储单元, Loc(aij )为元素aij 的存储地址,Loc(a00 ) 是a00存储位置, 也是二维数组A的基址。若以行序为主序的方式存储二维数组,则元素aij
的存储位置是什么?若以列序为主序的方式存储二维数组,则元素aij 的存储位置又是什么? 答:若以行序为主序的方式存储二维数组,则元素aij
的存储位置为: Loc(aij ) = Loc(a00 ) +(ni+j ) s 若以列序为主序的方式存储二维数组,则元素aij
的存储位置为:
Loc(aij ) = Loc(a00) +(mj+i ) s- 什么是字符串?它和线性表有什么联系和区别? 答:字符串(简称串)是一种特殊的线性表,它的数据元素仅由一个字符组成。 字符串的逻辑结构、存储结构和线性表一样,除第一个元素外,其它每一个元素有一
个且仅有一个直接前驱,除最后一个元素外,其它每一个元素有一个且仅有一个直接后继,它通常采用的存储方式也是顺序存储和链式存储。字符串和线性表的区别仅在于,线性表中的数据元素可以是任意数据,而字符串中的数据元素只能是一个字符。- 什么是三角矩阵?如何将三角矩阵存储到一个一维数组中? 答:以主对角线划分,三角矩阵有上三角和下三角两种。上三角矩阵如图所示,它的下三角(不包括主对角线)中的元素均为常数。下三角矩阵正好相反,它的主对角线上方均为常数,如图所示。在大多数情况下,三角矩阵常数为零。
a00 a01 … a0n-1 a00 c … c
c a11 … a1n-1 a10 a11 … c
…………………… …………………
c … c an-1n-1 an-10 an-11 … an-1n-1
(a)上三角矩阵 (b)下三角矩阵 三角矩阵中的重复元素c可共享一个存储空间,其余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩存储到一维数组sa[0…n(n+1)/2]中,其中c存放在数组的最后一个分量中。
上三角矩阵中,主对角线之上的第p行(0≦p<n)恰有n-p个元素,按行优先顺序存放上三角矩阵中的元素aij时,aij之前的i行一共有个元素,在第i行上,aij前恰好有j-i个元素:aii,aii+1,…,aij-1。因此,sa[k]和aij的对应关系是:
当i≦j k= i(2n-i+1)/2+j-i
当i>j k=n(n+1)/2 下三角矩阵的存储和对称矩阵类似,sa[k]和aij对应关系是:
当i≧j k=i(i+1)/2+j
当i<j k=n(n+1)/2