1、1数据结构与算法设计知识点试题类型:本课程为考试科目(闭卷笔试) ,试题类型包括:概念填空题(10 %) ,是非判断题(10 %) ,单项选择题( 40 %) ,算法填空题(10% ) ,算法应用题(20 %),算法设计题(10 % ) 。第一章 绪论重点内容及要求:1、 了解与数据结构相关的概念(集合、数据、数据元素、数据项、关键字、元素之间的关系等) 。数据: 所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。是计算机处理的信息的某种特定的符号表示形式。数据元素:是数据(集合)中的一个“个体” ,数据结构中的基本单位,在计算机程序中通常作为一个整体来考虑和处理
2、。数据项:是数据结构中讨论的最小单位,数据元素可以是一个或多个数据项的组合关键码:也叫关键字(Key) ,是数据元素中能起标识作用的数据项。其中能起到唯一标识作用的关键码称为主关键码(简称主码) ;否则称为次关键码。通常,一个数据元素只有一个主码,但可以有多个次码。关系:指一个数据集合中数据元素之间的某种相关性。数据结构:带“结构”的数据元素的集合。这里的结构指元素之间存在的关系。2数据类型:是一个值的集合和定义在此集合上的一组操作的总称。2、 掌握数据结构的基本概念、数据的逻辑结构(四种)和物理结构(数据元素的表示与关系的表示、两类存储结构:顺序存储结构和链式存储结构) 。数据结构包括逻辑结
3、构和物理结构两个层次。数据的逻辑结构:是对数据元素之间存在的逻辑关系的一种抽象的描述,可以用一个数据元素的集合和定义在此集合上的若干关系来表示逻辑结构有四种:线性结构、树形结构、图状结构、集合结构数据的物理结构:是其逻辑结构在计算机中的表示或实现,因此又称其为存储结构。存储结构:顺序存储结构和链式存储结构顺序存储结构:利用数据元素在存储器中相对位置之间的某种特定的关系来表示数据元素之间的逻辑关系;链式存储结构:除数据元素本身外,采用附加的“指针” 表示数据元素之间的逻辑关系。3、 了解算法分析的基本方法,掌握算法时间复杂度相关的概念。算法:是为了解决某类问题而规定的一个有限长的操作序列或处理问
4、题的策略一个算法必须满足以下五个重要特性:1有穷性 2确定性 3可行性 4有输入 5有输出设计算法时,通常还应考虑满足以下目标:1.正确性,2.可读性, 3.健壮性34.高效率与低存储量需求如何估算 算法的时间复杂度?算法 = 控制结构 + 原操作(固有数据类型的操作)算法的执行时间 = 原操作(i)的执行次数 原操作(i) 的执行时间算法的执行时间与 原操作执行次数之和成正比 算法的空间复杂度定义为:S(n) = O(g(n)表示随着问题规模 n 的增大,算法运行所需存储量的增长率与 g(n) 的增长率相同。算法的存储量包括:1. 输入数据所占空间2. 程序本身所占空间3. 辅助变量所占空间
5、第二章 线性表重点内容及要求:1、 掌握线性表的顺序存储结构,了解顺序表的存储特点(数据元素在内存中依次顺序存储) ,优点:可随机存取访问;缺点:结点的插入/ 删除操作不方便。线性表:是一种最简单的数据结构,也是构造其它各类复杂数据结构的基础。一个数据元素的有序(次序)集。它有顺序和链式两种存储表示方法。 线性表必有:41集合中必存在唯一的一个“第一元素”2集合中必存在唯一的一个 “最后元素”3除最后元素在外,均有 唯一的后继;4除第一元素之外,均有 唯一的前驱定义如下:typedef int ElemType;typedef structElemType*elem; /存储数据元素的一维数组
6、; int length; /线性表当前长度; int listsize; /当前分配数组容量;SqList;Void InitSqList(SqList A,int maxsize)/初始化线性表 A.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!A.elem) exit(0); A.length = 0; A.listsize = LIST_INIT_SIZE; return ; 2、 了解线性表的链式存储结构,重点掌握带头结点的单链表的基本操作(结点的插入与删除运算) ,了解单向循环链表和双向链表存储表示方法。
7、单链表:用一组地址任意的存储单元存放线性表中的数据元素。以元素(数据元素的映象) + 指针(指示后继元素存储位置) = 结点(表示数据元素 或 数据元素的映象)单链表是一种顺序存取的结构,求以此为存储表示的线性表长度,可设置一个计数器53、了解有序线性表的特点(顺序有序表、有序链表) 。有序线性表:线性表中的数据元素相互之间可以比较,并且数据元素在线性表中依值非递减或非递增有序排列,即 aiai-1 或 aiai-1(i = 2,3, n),则称该线性表为有序表(Ordered List)4、学会对线性表设计相关的算法进行相应的处理。第三章 排序重点内容及要求:1、掌握对顺序表数据记录进行排序
8、的基本思路和常规操作(比较、移动) ,了解排序算法的稳定性问题。2、掌握简单选择排序、直接插入排序、冒泡排序算法,了解各种排序算法的特点及时间复杂度。排序:将一组“无序”的记录序列按某一关键字调整为“有序”的记录序列。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序;反之则为外部排序。 选择排序:从记录的无序子序列中“选择” 关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度基本代码如下for(i=0;i1) / i1 表明上一趟曾进行过记录的交换lastExchangeIndex = 1;for (j = 1; j using namespa
9、ce std;#define INITSIZE 100#define RESIZE 20typedef struct int *base;int *top;int stacksize;Sqstack;int Initstack(Sqstack S)S.base=(int *)malloc(INITSIZE*sizeof(int);if(!S.base) return false;S.top=S.base;S.stacksize=INITSIZE;return true;int Clearstack(Sqstack S.base=(int *)malloc(INITSIZE*sizeof(int
10、);S.top=S.base;return true;int Stackempty(Sqstack S)if(S.base=S.top) return true;else return false;int Push(Sqstack if(!S.base) return false;S.top=S.base+S.stacksize;S.stacksize+=RESIZE;*S.top+=e;return true;9int Pop(Sqstack e=*-S.top; return true; int main()Sqstack S;int t,e;Initstack(S);cint; /需要输
11、入元素的个数while(t-)cine;Push(S,e); /进栈while(S.top!=S.base) Pop(S,e);couttop;while(p) q=p;p=p-next;free(q);S-count=0;return OK;3、掌握栈的典型应用背包问题求解的基本方法。背包问题假设有 n 件体积分别为 w1,w2,wn 的物品和一个能装载体积10为 T 的背包.能否从 n 件物品中选择若干件恰好装满背包, 即 wi1+wi2+wik = T,则背包问题有解;否则无解.以 W(1,8,4,3,5,2), T=10 为例 (1,4,3,2 ), (1,4,5 ), (8,2)和(
12、3,5, 2)是其解。算法如下void knapsack(int w, int T, int n) / T 在算法中是剩余的容积,初值为背包的体积InitStack(S); k=0;do while (T0 T =wk;k+;if (T=0) StackTraverse(S); / 输出一个解Pop (S, k); T+ =wk; / 退出栈顶物品k+; while (!StackEmpty(S) | kfront=q-rear-NULL; /初始化 int QueueEmpty(LiQueue *q) if(q-rear=NULL)return 1;else return 0; /判空voi
13、d enQueue( LiQueue *s=(QNode *)malloc(sizeof(QNode);s-data=e;s-next=NULL;if(q-rear=NULL)q-front=q-rear=s;elseq-rear-next=s;q-rear=s;/入队int deQueue( LiQueue *if(q-rear=NULL)return0;12t=q-front;if(q-front=q-rear)q-front=q-rear=NULL;elseq-front=q-front-next;e=t-data;free(t);return 1; /出队int deQueue( Li
14、Queue *if(q-rear=NULL)return0;t=q-front;if(q-front=q-rear)q-front=q-rear=NULL;elseq-front=q-front-next;e=t-data;break;free(t);return 1; /取队头135、对于采用顺序存储结构的循环队列,掌握队列为空、队列满的条件,及队列的基本操作。循环队列判断空满有两种方法: 1.另设一个标志位以区分队列空满;2.少用一个元素空间,当队头指针在队尾指针下一位时,队列为满,当队头指针与队尾指针相同是队列为空。在循环队列下,仍定义 front=rear 时为队空,而判断队满则用两种
15、办法,一是用“牺牲一个单元”,即 rear+1=front(准确记是(rear+1)%m=front,m 是队列容量)时为队满。另一种解法是“设标记”方法,如设标记 tag,tag 等于 0 情况下,若删除时导致 front=rear 为队空;tag=1 情况下,若因插入导致 front=rear 则为队满。第五章 串和数组重点内容及要求:1、掌握字符串类型的定义及存储表示方法。一般情况之下用 char 定义,串(String ) ,或称字符串是由零个或多个字符组成的有限序列。记作:S = a0a1aian-1 (n0)其中,ai 属于字符集, n 为串的长度,当 n=0 时串为空串存储特点串
16、的实际长度可在这个予定义长度的范围内随意设定,超过予定义长度的串值则被舍去,称之为“截断” 按这种串的表示方法实现的串的运算时,其基本操作为 “字符序列的复制”2、掌握数组的定义和存储结构,熟悉二维数组中数据元素按行存储的基本方法,会计14算元素的存储地址。数组的定义和存储结构数组是线性表的一种扩充,一维数组即为线性表,二维数组定义为“ 其数组元素为一维数组” 的线性表3、了解矩阵压缩存储的目的、原理及基本思路和方法。矩阵压缩存储的目的1) 零值元素占了很大空间;2) 计算中进行了很多和零值的运算,遇除法,还需判别除数是否为零。原理及基本思路和方法1) 尽可能少存或不存零值元素;2) 尽可能减
17、少没有实际意义的运算;3) 操作方便。 即:能尽可能快地找到与下标值(i, j)对应的元素,能尽可能快地找到同一行或同一列的非零值元。154、了解随机稀疏矩阵的压缩存储方法(三元组顺序表、十字链表) 。三元组顺序表十字链表第六章 二叉树重点内容及要求:1、掌握二叉树的定义、特点及相关概念。16结点的层次:假设根结点的层次为 1,第 l 层的结点的子树根结点的层次为 l+1树的深度:树中叶子结点所在的最大层次二叉树的定义二叉树是 n(n0)个元素的有限集,它或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。2、了解二叉树的性质和存储结构特点,掌握二叉树的顺序存储结构
18、主要用于完全二叉17树。二叉树的性质:1. 在二叉树的第 i 层上至多有 2i-1 个结点 (i1) 。2. 深度为 k 的二叉树上至多含 2k-1 个结点(k1) 。3. 对任何一棵二叉树,若它含有 n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0 = n2+1。4. 具有 n 个结点的完全二叉树的 深度为 log2n +1 。若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:(1) 若 i=1,则该结点是二叉树的根,无双亲,否则,编号为 i/2 的结点为其双亲结点;(2) 若 2in,则该结点无左孩子,否则
19、,编号为 2i 的结点为其左孩子结点;(3) 若 2i+1n,则该结点无右孩子结点,否则,编号为 2i+1 的结点为其右孩子结点。3、掌握二叉树的二叉链表存储结构。184、了解二叉树遍历的基本方法(先根次序、中根次序及后根次序遍历二叉树) 。 195、了解堆排序的基本方法、了解二叉排序树的基本特点以及如何构造一棵哈夫曼树。树和森林树和森林的存储结构20第七章 图重点内容及要求:1、了解图的基本概念和相关术语。图是较树结构更复杂的非线性结构图 Graph 是由一个顶点集 V 和一个弧集 E 构成的数据结构,记作 Graph = (V , E )。其中,图的顶点为数据结构中的数据元素,弧的集合 E
20、 是定义在顶点集合 V 上的一个关系。有序对 表示从 v 到 w 的一条弧,并称 v 为弧头,w 为弧尾。谓词 P(v,w) 定义了弧 的意义或信息由于“弧”是有方向的,因此称由顶点集和弧集构成的图为有向图2、了解图的存储结构特点(邻接矩阵、邻接表存储结构) 。21邻接矩阵:邻接表存储3、了解图的遍历方法(深度优先搜索 DFS 和广度优先搜索 BFS) 。深度优先搜索 DFS连通图的深度优先搜索遍历从图中某个顶点 V0 出发,访问此顶点,然后依次从 V0 的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和 V022有路径相通的顶点都被访问到。void DFS(Graph G, int
21、 v) / 从顶点 v 出发,深度优先搜索遍历连通图 Gvisitedv = TRUE; VisitFunc(v);for (w=FirstAdjVex(G, v);w!=0; w=NextAdjVex(G,v,w) )if (!visitedw) DFS(G, w); / 对 v 的尚未访问的邻接顶点 w / 递归调用 DFS / DFS非连通图的深度优先搜索遍历首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。void DFSTraverse(Graph G ) / 对图 G 作深度优先遍历f
22、or (v=0; vID.elemhigh.key) return 0; / 给定值 kval 大于查找表中所有关键字while ( low ID.elemmid.key ) low = mid +1;else found = TRUE; low = mid; /whiles = ID.elemlow.stadr; / 经索引表查找后,下一步的查找范围定位在第 low块if ( low data.key) return TRUE; / 查找成功else if ( kval data.key) f = p ; p = p-lchild; / 在左子树中继续查找else f = p; p = p-
23、rchild; / 在右子树中继续查找 / whilereturn FALSE; / 查找不成功 / SearchBST284、 了哈希表的相关概念和基本原理(哈希表的定义、哈希函数的构造、处理冲突的方法、哈希表查找) 。查找的过程为给定值依次和关键字集合中各个关键字进行比较查找的效率取决于和给定值进行比较的关键字个数。因此在一般情况下,需在关键字与记录在表中的存储位置之间建立一个函数关系,以 f(key) 作为关键字为 key 的记录在表中的位置,通常称这个函数 f(key) 为哈希函数。哈希表的定义:根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“象” 作为相应记录在表中的 存储位置,如此构造所得的查找表称之为“哈希表” 。哈希函数的构造方法:如果没有关键字,必须进行数字化处理处理冲突的方法:“处理冲突” 的实际含义是:为产生冲突的地址寻找下一个哈希地址。1. 开放定址法; 2. 链地址法29