数据结构复习提纲(大作业在后面)计算机本科(月)
(完整word版)数据结构复习提纲

数据结构复习提纲复习内容:基本概念掌握:数据结构,逻辑结构,存储结构;数据类型;算法;T(n),S(n)的理解。
要学习的数据结构定义形式:n(n〉=0)个数据元素的有限集合.将约束:1、数据元素本身.2、数据元素之间的关系。
3、操作子集。
大多有两种存储(表示、实现)方式:1、顺序存储。
2、链式存储.一、线性结构:1、线性表:n(n〉=0)个相同属性的数据元素的有限序列。
12种基本操作.顺序表:9种基本操作算法实现.单链表:11种基本操作算法实现。
(重点:插入、删除)顺序表与单链表之时间性能、空间性能比较.循环链表:类型定义与单链表同。
算法实现只体现在循环终止的条件不同。
双向链表:重点插入、删除算法。
2、操作受限的线性表有:栈、队列。
栈:顺序栈;链栈(注意结点的指针域指向)。
(取栈顶元素、入栈、出栈)队列:循环队列(三个问题的提出及解决);链队列(注意头结点的作用).(取队头元素、入队、出队。
链队列中最后一个元素出队)3、数据元素受限的线性表有:串、数组、广义表。
串:定长顺序存储;堆分配存储.块链存储(操作不方便)数组:顺序存储。
特殊矩阵的压缩存储;稀疏矩阵(三元组表示、十字链表)广义表:长度、深度.取表头(可以是原子也可以是子表);取表尾(肯定是子表)。
链式存储。
二、树型结构:1、树:n(n>=0)个数据元素的有限集合.这些数据元素具有以下关系:……。
(另有递归定义。
)术语;存储(双亲表示、孩子表示、孩子双亲表示、孩子兄弟表示)。
2、二叉树:n(n〉=0)个数据元素的有限集合。
这些数据元素具有以下关系:……。
(另有递归定义)5个性质(理解、证明;拓展)。
遍历二叉树(定义、序列给出、递归算法、非递归算法);遍历二叉树应用:表达式之前序表达式、后序表达式、中序表达式转换。
线索二叉树(中序线索二叉树)。
树森林与二叉树的转换。
树与森林的遍历.赫夫曼树及其应用:定义、构造、赫夫曼编码。
三、图形结构:n(n〉=0)个数据元素的有限集合。
数据结构复习资料复习提纲知识要点归纳

数据结构复习资料复习提纲知识要点归纳数据结构复习资料:复习提纲知识要点归纳一、数据结构概述1. 数据结构的定义和作用2. 常见的数据结构类型3. 数据结构与算法的关系二、线性结构1. 数组的概念及其特点2. 链表的概念及其分类3. 栈的定义和基本操作4. 队列的定义和基本操作三、树结构1. 树的基本概念及定义2. 二叉树的性质和遍历方式3. 平衡二叉树的概念及应用4. 堆的定义和基本操作四、图结构1. 图的基本概念及表示方法2. 图的遍历算法:深度优先搜索和广度优先搜索3. 最短路径算法及其应用4. 最小生成树算法及其应用五、查找与排序1. 查找算法的分类及其特点2. 顺序查找和二分查找算法3. 哈希查找算法及其应用4. 常见的排序算法:冒泡排序、插入排序、选择排序、归并排序、快速排序六、高级数据结构1. 图的高级算法:拓扑排序和关键路径2. 并查集的定义和操作3. 线段树的概念及其应用4. Trie树的概念及其应用七、应用案例1. 使用数据结构解决实际问题的案例介绍2. 如何选择适合的数据结构和算法八、复杂度分析1. 时间复杂度和空间复杂度的定义2. 如何进行复杂度分析3. 常见算法的复杂度比较九、常见问题及解决方法1. 数据结构相关的常见问题解答2. 如何优化算法的性能十、总结与展望1. 数据结构学习的重要性和难点2. 对未来数据结构的发展趋势的展望以上是数据结构复习资料的复习提纲知识要点归纳。
希望能够帮助你进行复习和回顾,加深对数据结构的理解和掌握。
在学习过程中,要注重理论与实践相结合,多进行编程练习和实际应用,提高数据结构的实际运用能力。
祝你复习顺利,取得好成绩!。
数据结构复习提纲

复习提纲:第一章:1.数据结构的基本概念;2.数据结构的4类基本结构及其特性;3.存储结构的分类及特点;4.算法的时间复杂度计算;第二章:1.线性表的基本概念;2.线性表的顺序存储结构的特点和插入删除算法;3.顺序存储结构的应用;4.单循环链表的存储结构特点,链表空的判断方法、插入、删除结点算法实现,报数游戏算法实现;5.双链表的存储特点,插入、删除结点算法实现。
第三章:1.栈的特点、对同一序列根据栈的特点进行不同入栈、出栈操作所得结果的判断;栈的实现的相关操作;2.顺序栈的4各要素和相关操作关键语句;链栈的4个要素和相关操作关键语句;3.了解队列的特点和可执行的基本操作,并能做相关判断;4.顺序循环队列的队空、队满判断条件,入队、出队操作的相关关键语句;5.顺序循环队列中对同一序列根据队列进行不同的入队、出队操作后队头和队尾指针的变化判断。
第四章:1.串的定义、串长的定义和计算、子串个数计算(注意区分:子串与非空且不同于S本身的子串);2.串的模式匹配(区分BF算法和KMP算法),掌握使用KMP算法计算next数组的值,并且要求掌握匹配过程(BF和KMP的匹配过程不同!)。
前三章程序重点掌握作业四、作业五、作业六、作业八、作业九第五章:1.特殊矩阵的压缩存储地址计算,稀疏矩阵的压缩存储结构图。
2.广义表的定义、区分原子和子表,求表头和表尾,深度和层次计算,存储结构图绘制;3.提供一广义表,写出通过head()和tail()操作求出某个原子的表达式。
4.注意:取表头时即广义表的第一个元素,外面不再加括号;而取表尾时,要将除表头元素外的其他元素一起用圆括号括起来,即将原广义表去掉表头;第六章:1.树的定义和相关基本术语;2.树的表示和各种存储结构的表示;3.二叉树的定义和结点形态;4.熟练使用二叉树的性质进行相关计算;5.掌握提供边集画树及树的存储结构图并将树转换为二叉树;6.根据后序遍历和中序遍历的序列画出二叉树直观图,并给出其先序遍历的序列,画出线索二叉树存储结构图;7.根据二叉树的顺序存储结构图,画出二叉树及二叉链存储结构图,并给出该二叉树转换后的森林。
《数据结构》考试大纲 专升本

《数据结构》考试大纲(专升本)一、考试性质《数据结构》是计算机科学与技术专业的核心课程,是计算机专业专升本入学考试的必考科目之一。
数据结构是计算机程序设计的重要理论基础,主要研究数据的各种内在规律和特性,以及如何在计算机中实现和应用这些规律和特性。
通过对数据结构的学习,可以使考生掌握数据的组织、存储和处理的基本方法,培养考生运用所学知识解决实际问题的能力。
二、考试目标本考试的目的是测试考生对数据结构基本概念、基本原理和基本方法的掌握程度和应用能力。
具体来说,考试应达到以下目标:1. 掌握数据结构的基本概念、基本原理和基本方法,包括数据的逻辑结构、存储结构和算法等。
2. 掌握线性表、栈、队列、树、图等基本数据结构的定义、表示和操作,理解它们的特性和应用场景。
3. 掌握常见的数据结构算法,包括查找、排序、图论算法等,能够分析和评估算法的时间复杂度和空间复杂度。
4. 了解数据结构的实际应用,如动态内存分配、数据压缩、文件存储管理等。
三、考试内容1. 数据结构的基本概念:数据的逻辑结构、存储结构、算法的描述与实现等。
2. 线性表:顺序表和链表的定义、表示和操作,包括插入、删除、查找等操作的时间复杂度分析。
3. 栈:栈的定义、表示和操作,包括入栈、出栈、判断栈是否为空等操作的时间复杂度分析。
4. 队列:队列的定义、表示和操作,包括入队、出队、判断队列是否为空等操作的时间复杂度分析。
5. 树:树的基本概念,包括树、森林、二叉树等;二叉树的定义、表示和操作,包括插入、删除节点等操作的时间复杂度分析;二叉搜索树、平衡二叉树等数据结构的定义和操作。
6. 图:图的基本概念,包括无向图、有向图等;图的表示方法,包括邻接矩阵和邻接表等;图的遍历算法,包括深度优先搜索和广度优先搜索等;最小生成树的概念和构造方法(Prim算法和Kruskal算法);最短路径算法(Dijkstra算法和Floyd-Warshall算法)等。
数据结构复习提纲

数据结构复习提纲第一章绪论1.基本术语:数据,数据元素,数据对象,数据结构及其分类。
2.什么是算法?算法的特性。
3.时间复杂度及其简单计算。
第二章线性表1.线性表的定义,线性表的存储结构常有哪几种?各有何优缺点?2.顺序表的类型说明及其基本操作算法的实现3.链表结构的类型说明及其基本操作算法的实现。
表空条件,申请结点,插入,删除操作语句。
第三章栈和队列1.栈的定义及其特点。
队列的定义及其特点。
2.顺序栈的类型说明及其算法实现。
栈空,栈满条件,入栈出栈操作语句。
3.循环队列的类型说明及其算法实现。
队空,队满条件,入队出队操作,计算队列的长度语句。
第五章数组与广义表1.二维数组的两种存储方式及地址计算。
2.矩阵的压缩存储,对称矩阵,三角矩阵的地址计算。
3.什么是稀疏矩阵?稀疏矩阵的两种存储结构,算法的实现。
4.广义表的定义。
广义表的两种存储结构,广义表的表头,表尾计算第六章树和二叉树1.树的概念与定义。
2.二叉树。
满二叉树,完全二叉树的定义,二叉树的性质及其证明。
3.二叉树的存储结构及其类型说明。
4.二叉树的三种遍历及其递归算法实现。
5.树的三种存储结构。
6.树,森林与二叉树的转换。
7.哈夫曼树的定义。
哈夫曼树的构造及其哈夫曼编码。
第七章图1.图的定义及其术语。
2.图的存储结构。
邻接表,邻接矩阵。
3.图的深度,广度遍历及其应用4.最小生成树的两种构造算法。
5.什么是AOV网?拓扑排序的定义及其方法。
6.求关键路径的算法及其计算。
7.从源点到其余各顶点的最短路径的算法及其计算。
8.各对顶点的最短路径的算法及其计算。
第九章查找1.顺序表的查找算法及其算法实现ASL计算。
2.有序表的查找算法及其算法实现。
ASL计算3.二叉排序树的定义,特点,构造及其查找算法的实现ASL 计算。
4.B-树的定义,插入,删除,构造。
5.哈希函数,哈希冲突的定义。
构造哈希函数的方法,解决冲突的方法。
6.给出哈希函数,哈希冲突的解决方法,构造哈希表ASL计算。
《数据结构》考前复习大纲要点

《数据结构》考前复习大纲本复习大纲按章分别叙述三方面的内容:1、考试大纲要求,2、复习考试知识点,3、应用举例。
为了方便考生复习,知识点还给出较详细的描述内容,举例题型也给出具体的分析过程和完整的参考答案。
第一章绪论考纲要求:1.数据的四种逻辑结构与四种存储结构(理解)2. 时间复杂度的估算及比较(掌握)知识点:1 、数据结构:研究是是数据元素之间抽象化的相互关系和这种关系在计算机中的存贮表示,并对每种结构定义各自的运算,设计出相应的算法,而且经过运算后所得的新结构一般仍然是原来的结构类型。
2、数据的四类基本组成形式:①集合中任何两个结点之间都没有逻辑关系,组成形式松散。
②线性结构中结点按逻辑关系一次排列形成一条“锁链”。
③树形结构具有分支、层次特性,其形态有点像自然界中的树。
④图状结构最复杂,其中的各个结点按逻辑关系互相缠绕,任何两个结点都可以邻接。
算法:是执行特定计算的有穷过程。
特点:·动态有穷·确定性·输入·输出·可行性。
1、以算法在所有输入下的计算量的最大值作为算法的计算量,这种计算量称为算法的最坏时间复杂性或最坏时间复杂度。
2、以算法在所有输入下的计算量的加权平均值作为算法的计算量,这种计算量称为算法的平均时间复杂性或者平均时间复杂度。
3. 时间复杂度从好到坏的级别依次是:常量阶O(1),对数阶O(log2n),线性阶O(n), 优化的平方阶O(n*log2n),平方阶O(N2),立方阶O(n3),指数阶O(2),阶乘阶O(n!)4、数据结构的基本任务可以概括为数据结构的设计和实现。
应用举例:设n为正整数,利用大"O"记号,将下列程序段的执行时间表示为n的函数。
(1) i=1; k=0;while(i<n){ k=k+10*i;i++;}分析:i=1; //1k=0; //1while(i<n) //n{ k=k+10*i; //n-1i++; //n-1}由以上列出的各语句的频度,可得该程序段的时间消耗:T(n)=1+1+n+(n-1)+(n-1)=3n可表示为T(n)=O(n)第二章线性表:考纲要求:1线性表的顺序存储、链式存储的各种算法(掌握) 2 线性表的插入、删除算法(掌握),3 双向链表及循环链表的插入、删除过程(掌握)知识点:1、线性结构是n(n>=0)个结点的有穷序列。
数据结构复习提纲

《数据结构》考试内容及要求:第一章绪论一、考核知识点数据结构,数据类型,抽象数据类型基本概念;算法基本概念;算法复杂度基本概念;常见基本算法的时间复杂度分析;时间复杂度的表示法;二、考核要求1、了解数据、数据结构、抽象数据类型以及算法等概念的确切含义;2、熟悉数据逻辑结构、存贮结构等概念;3、掌握算法复杂度分析的基本概念及分析方法;第二章线性表一、考核知识点线性表的定义、基本操作;顺序表、链表的存储表示以及基本操作(插入、删除、归并等)。
二、考核要求1、了解线性表的概念2、掌握顺序表上各种运算的实现方法3、掌握各种链表的存储结构及运算。
第三章栈和队列一、考核知识点栈和队列的结构特性、基本操作及在两种存储结构上基本操作的实现;栈和队列的应用、递归算法的设计。
二、考核要求1、了解栈与队列的概念2、掌握顺序栈、顺序队列,链栈、队列的各种运算的实现方法3、掌握栈与递归的概念。
第六章树和二叉树一、考核知识点树的基本概念;二叉树的定义、性质、存储表示;二叉树的遍历;线索二叉树;树的应用:哈夫曼树及哈夫曼编码。
二、考核要求1、了解树和二叉树的概念2、掌握二叉树遍历的方法及二叉树遍历的实现算法,线索化二叉树及其运算,哈夫曼树及哈夫曼编码等概念。
第七章图一、考核知识点图的基本概念、存储表示(邻接矩阵、邻接表、十字链表,邻接多重表)。
二、考核要求1、了解图的概念2、掌握图的存贮表示法;3、图的两种遍历方法;第九章查找一、考核知识点查找表是集合类型的数据结构,其操作借助静态查找表、动态查找表、哈希表实现;二、考核要求1、掌握查找的概念2、掌握线性表的查找(顺序查找,二分法查找,分块查找),树表的查找(二叉排序树),哈希表的概念及冲突处理。
第十章排序一、考核知识点内部排序介绍插入排序、快速排序(交换排序)、选择排序、归并排序;排序的基本思想和算法分析。
二、考核要求1、掌握排序的基本概念2、掌握插入排序(直接插入排序,shell排序),交换排序(起泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序等算法的实现3、掌握各种内排序算法的评价与比较方法。
数据结构复习大纲

数据结构复习大纲第一章绪论1. 数据结构的基本概念和术语1.1 数据、数据元素、数据项、数据结构等基本概念1.2 数据结构的逻辑结构、存储结构及数据运算的含义及其相互关系1.3 数据结构的两大逻辑结构和四种常用的存储表示方法2. 算法的描述和分析2.1 算法、算法的时间复杂度和空间复杂度、最坏的和平均的时间复杂度等概念2.2 算法描述和算法分析的方法,对于一般算法能分析出时间复杂度第二章线性表1. 线性表的逻辑结构1.1 线性表的逻辑结构特征2. 线性表的顺序存储结构2.1 顺序表的含义及特点,即顺序表如何反映线性表中元素之间的逻辑关系2.2 顺序表上的插入、删除操作及其平均时间性能分析3. 线性表的链式存储结构3.1 链表如何表示线性表中元素之间的逻辑关系3.2 链表中头指针和头结点的使用3.3 单链表、双(向)链表、循环链表链接方式上的区别3.4 单链表上实现的建表、查找、插入和删除4. 顺序表和链表的比较4.1 顺序表和链表的主要优缺点4.2 针对线性表上所需要执行的主要操作,知道选择顺序表还是链表作为其存储结构才能取得较优的时空性能第三章栈和队列1.栈的逻辑结构、存储结构及其相关算法1.1 栈的逻辑结构特点,栈与线性表的异同1.2 顺序栈和链栈上实现的进栈、退栈等基本算法1.3 栈的“上溢”和“下溢”的概念及其判别条件2. 队列的逻辑结构、存储结构及其相关算法2.1 队列的逻辑结构特点,队列与线性表的异同2.2 顺序队列(主要是循环队列)和链队列上实现的入队、出队等基本算法2.3 队列的“上溢”和“下溢”的概念及其判别条件2.4 使用数组实现的循环队列取代普通的顺序队列的原因2.5 循环队列中对边界条件的处理方法3. 栈和队列的应用3.1 栈和队列的特点,什么样的情况下能够使用栈或队列3.2 表达式求值的算法思想,及栈变化情况。
第四章串、数组和广义表1.串1.1 串的有关概念及基本运算1.2 串与线性表的关系2.多维数组2.1 多维数组的逻辑结构特征2.2 多维数组的顺序存储结构及地址计算方式2.3 数组是一种随机存取结构的原因2.4 矩阵的压缩存储(对称矩阵、三角矩阵、稀疏矩阵)的表示方式和对应的地址计算方式。
数据结构考试大纲

数据结构考试大纲数据结构是计算机科学中非常重要的一门课程,它关注的是数据的组织、存储和管理方式。
为了帮助同学们更好地准备并掌握数据结构,以下是数据结构考试大纲的详细内容。
第一部分:数据结构的基础知识(300字)1. 数据结构的定义和基本概念- 数据结构的概念和作用- 数据和数据元素的区别- 数据结构的分类(线性结构、非线性结构等)2. 算法的基本概念- 算法的定义和特性- 算法的评价指标(时间复杂度、空间复杂度等)- 算法设计的基本方法(递归法、分治法等)3. 时间复杂度和空间复杂度分析- 大O表示法的基本理解和使用- 常见的时间复杂度和空间复杂度分析技巧第二部分:线性结构(500字)1. 线性表- 线性表的定义和基本操作- 顺序表和链表的特点和实现方式- 线性表的应用举例2. 栈和队列- 栈和队列的定义和基本操作- 栈的实现方式(顺序栈、链式栈等)- 队列的实现方式(顺序队列、链式队列等)- 栈和队列的应用举例3. 字符串- 字符串的定义和基本操作- 串的模式匹配算法(朴素算法、KMP算法等) - 字符串的应用举例第三部分:树结构(600字)1. 树的基本概念- 树的定义和基本术语- 二叉树的定义和性质- 树和森林的转换2. 二叉树- 二叉树的基本操作(遍历、查找等)- 二叉树的存储方式(顺序存储、链式存储等)- 二叉树的应用举例3. 查找树- 二叉查找树的定义和基本操作- 平衡二叉树的定义和实现方式(AVL树、红黑树等) - 查找树的应用举例第四部分:图结构(400字)1. 图的基本概念- 图的定义和基本术语- 图的分类(有向图、无向图等)2. 图的表示方式- 邻接矩阵的表示方法及其特点- 邻接表的表示方法及其特点3. 图的遍历算法- 深度优先搜索(DFS)算法- 广度优先搜索(BFS)算法4. 最短路径算法- Dijkstra算法的原理和实现方式- Floyd算法的原理和实现方式第五部分:高级数据结构(200字)1. 堆和优先队列- 堆的定义和基本操作- 优先队列的实现方式和应用举例2. 并查集- 并查集的定义和基本操作- 并查集的应用举例3. 哈希表- 哈希表的定义和基本操作- 哈希冲突的处理方法和应用举例综上所述,数据结构考试大纲包括了数据结构的基础知识、线性结构、树结构、图结构以及高级数据结构的内容。
数据结构复习提纲整理

复习提纲第一章数据结构概述基本概念与术语(P3)1.数据结构是一门研究非数值计算程序设计问题中计算机的操作对象以及他们之间的关系和操作的学科.2.数据是用来描述现实世界的数字,字符,图像,声音,以及能够输入到计算机中并能被计算机识别的符号的集合2.数据元素是数据的基本单位3.数据对象相同性质的数据元素的集合4.数据结构包括三方面内容:数据的逻辑结构.数据的存储结构.数据的操作. (1)数据的逻辑结构指数据元素之间固有的逻辑关系.(2)数据的存储结构指数据元素及其关系在计算机内的表示( 3 ) 数据的操作指在数据逻辑结构上定义的操作算法,如插入,删除等.5.时间复杂度分析--------------------------------------------------------------------------------------------------------------------1、名词解释:数据结构、二元组2、根据数据元素之间关系的不同,数据的逻辑结构可以分为集合、线性结构、树形结构和图状结构四种类型。
3、常见的数据存储结构一般有四种类型,它们分别是___顺序存储结构_____、___链式存储结构_____、___索引存储结构_____和___散列存储结构_____。
4、以下程序段的时间复杂度为___O(N2)_____。
int i,j,x;for(i=0;i<n:i++) n+1for(j=0;j<n;j++) n+1x+=i;------------------------------------------------------------------------------------------------------------------第二章线性表1.顺序表结构由n(n>=0)个具有相同性质的数据元素a1,a2,a3……,an组成的有穷序列//顺序表结构#define MAXSIZE 100typedef int DataType;Typedef struct{DataType items[MAXSIZE];Int length;}Sqlist,*LinkList;//初始化链表void InitList(LinkList *L){(*L)=(LinkList)malloc(sizeof(LNode));if(!L){cout<<”初始化失败!”;return;}(*L)->next=NULL;}//插入数据void InsertList(LinkList L,int pos,DataType x){LinkList p=L,q;int i=0;while(p&&i<pos-1){p=p->next;i++;}if(!p||i>pos-1){cout<<”插入位置错误”;return;}InitList(&q);q->next=p->next;p->next=q;q->data=x;}//销毁链表void DestoryList(LinkList L){LinkList t;while(L){t=L;L=L->next;free(t);}}//遍历链表void TraverseList(LinkList L){LinkList t=L;while(L){t=t->next;cout<<t->data<<” ”;}cout<<endl;}//删除元素void DeleteList(LinkList L,int pos){LinkList p=L,q;int i=0;while(p&&i<pos-1){p=p->next;i++;}if(!p||i>pos-1){cout<<”删除位置错误!!”;return;}q=p->next;p->next=q->next;free(q):}第三章栈和队列1.栈(1)栈的结构与定义(2)顺序栈操作算法:入栈、出栈、判断栈空等(3)链栈的结构与定义2.队列(1)队列的定义----------------------------------------------------------------------------------------------------------------1、一个栈的入栈序列为“ABCDE”,则以下不可能的出栈序列是()A. BCDAEB. EDACBC. BCADED. AEDCB2、栈的顺序表示仲,用TOP表示栈顶元素,那么栈空的条件是()A. TOP==STACKSIZEB. TOP==1C. TOP==0D. TOP==-13、允许在一端插入,在另一端删除的线性表称为____队列____。
数据结构与算法复习提纲(详细版)

数据结构与算法复习提纲(详细版)一、数学知识复习1、对数(重要公式:XA=B当且仅当A=logXB;关键思路:将对数转化成为指数分析)2、级数(重要公式:∑Ai和∑iA;关键思路:同时乘上某个系数再相减)3、证明方法(数学归纳法和反证法:三个关键步骤(归纳基础、归纳假设、归纳证明))二、C++类1、构造函数(使用默认参数的构造函数;初始化列表)2、访问函数和修改函数(关键字const)3、接口与实现的分离(声明与实现必须精确匹配,两个例外:默认参数和explicit)三、C++细节1、参数传递(一般情形:单向传递/引用:双向传递/常引用:避免大对象的拷贝)2、★三大函数(当数据成员含有指针类型,三大函数必须显式给出;避免浅复制)⑴、析构函数(形式:~类名()/作用:释放资源)⑵、复制构造函数(形式:类名(const 类名rhs)/作用:利用已有对象复制一个新对象)⑶、operator=(形式:const 类名operator=(const 类名rhs)/作用:赋值)四、模板1、★函数模板定义(template <typename 虚拟类型comparable> 通用函数定义)2、★类模板⑴、定义(template <typename 类型参数object> class 类模板名)</typename> </typename>⑵、调用(class 类模板名<实际参数> 对象名(参数))</实际参数>3、函数对象(定义一个包含零个数据成员和一个成员函数的类,然后传递该类的实例)五、矩阵1、基本思想(矩阵利用向量的向量来实现,即vector<vector object> array)2、典型代码分析(包括构造函数和operator[]重载)</vector>第二章算法分析一、数学基础1、重要定义⑴、f(N)=Ο(g(N))(若存在正常数C和n0,使得当N≥n0时,有f(N)≤Cg(N))⑵、f(N)=Ω(g(N))、f(N)=Θ(g (N))和f(N)=ο(g(N)))2、★重要工具⑴、性质:logkN=O(N)⑵、洛比塔法则:判断两个函数的相对增长率二、最大子列和问题1、算法Ⅰ⑴、算法思想(i表示序列起点,j表示序列终点,k从i扫描到j)⑵、★时间复杂度分析(注意分析方法:∑(i:0~N-1)∑(j:i~N-1)∑(k:i~j))⑶、★算法的缺陷(重复计算)2、算法Ⅱ算法思想(i表示序列起点,j表示序列终点(省略辅助变量k))3、算法Ⅲ⑴、★分治策略(递归程序:传递数组和左右边界,后者界定了数组要被处理的范围/单行驱动程序:传递数组和0,N-1而启动递归程序)⑵、算法思想(递归出口分析;最大子序列和的三种可能情况)⑶、★时间复杂度分析(重要公式:T(N)=2T(N/2)+N)4、算法Ⅳ(任何负的子序列不可能是最优子序列的前缀)三、折半搜索1、概念:折半查找(在已排好序的队列中查找数X)2、算法思想(关键是分析low、high和mid)第三章表、栈和队列一、STL中的向量和表(STL,Standard Template Library,标准模板库)1、STL定义了vector(向量)和list(双向链表)两个类模板2、★★迭代器(iterator)⑴、迭代器的作用(位置标记)⑵、迭代器的声明(典例:vector<object>::iterator)⑶、迭代器的重要方法(STL定义了一对方法:iterator begin()、iterator end()(返回最后一项的后面位置)、*itr(返回itr所指位置的对象的引用))⑷、const_iterator(保证*itr返回常引用)二、★向量的实现1、数据成员(theSize:元素个数/theCapacity:容量/objects:基本数组)2、构造函数和三大函数(重点分析operator=;复制构造函数与operator=的区别与联系)3、两个基本操作(reserve(改变容量)和resize(改变大小))4、重要操作(push_back和pop_back)三、表的实现1、Node类(数据成员:data、prev和next/重点:构造函数)2、const_iterator类(数据成员:current/运算符重载:operator*,前后置++,==和!=)3、iterator类(const_iterator的子类;注意两者唯一的区别)4、list类⑴、数据成员(theSize,头结点和尾结点(注意指向的位置))⑵、构造函数和三大函数(关键:利用init例程,创建空双向链表)⑶、基本操作(insert和erase操作)⑷、重要操作(push_front、push_back、pop_front和pop_back)四、栈ADT1、栈的顺序实现⑴、★重要概念:base和top(base:始终指向栈底位置/top:指向栈顶元素的下一个位置)⑵、★重要条件(栈空条件:top=base;栈满条件:top-base=stackSize)2、栈的应用(分析算法思想:首先创建一个空栈并顺序读入符号)⑴、平衡符号(关键:三种出错情况)⑵、后缀表达式(遇见数则压栈;遇见操作符则连续两次弹栈,计算后再压栈)⑶、中缀到后缀的转换(遇见数输出/遇见操作符,级别高则入栈,否则一直弹栈直到遇见级别更低的操作符/遇见(,入栈,直到遇见),则将()之间的所有操作符弹栈)五、队列ADT(循环队列)1、★重要概念:头指针和尾指针(front:指向对头元素;rear:指向队尾元素下一个位置)2、★重要操作:入队和出队(入队rear++;出队front++)3、★重要条件(队空条件:front=rear;队满条件:front=(rear+1)%maxSize第四章树一、二叉查找树1、二叉查找树的概念(对于每个结点X,左子树中的所有结点的值<x,右子树> X)2、二叉查找树结点类BinaryNode(element、left和right)3、★二叉查找树的类模板⑴、数据成员(根结点root)</x,右子树>⑵、析构函数和operator=(分别采用makeEmpty和clone例程)⑶、基本操作(contains、findMIn和findMax操作)(分别利用递归和非递归方式实现)⑷、重要操作(insert和remove操作)二、AVL树(平衡二叉树)1、★AVL树的概念和性质(空树的高度为-1)⑴、概念:AVL树(双重条件:二叉查找树,且每个结点的左右子树高度差至多为1)⑵、性质(高度h的AVL树,最少结点数s (h)=s(h-1)+s(h-2)+1))2、★★AVL树的四种基本旋转(关键:作图分析)⑴、理论分析:(当插入一个新结点时,通过旋转可以保持这棵树仍然是AVL树)⑵、实际分析:(一字形:使用单旋转;Z字形:使用双旋转)⑶、典例分析:(P107:倒序插入10~16)3、★★AVL树的插入算法⑴、AVL树的结点类AvlNode(同标准BinaryNode相比,增加一个height字段)⑵、AVL树的插入操作(利用height()例程和四种基本旋转)⑶、基本操作(右旋转(rotateWithLeftChild);左右旋转(doubleWithLeftChild))三、伸展树1、伸展树的基本思想(当一个结点被访问以后,它就要通过一系列旋转被推至根)2、伸展树的效率(平均摊还时间为O(logN))3、基本操作(一字形旋转和Z字形旋转)(通过P114典例分析)四、树的遍历(使用递归实现)1、中序遍历二叉查找树2、利用后序遍历计算树的高度五、B树(M叉查找树的一种实现方式;磁盘的访问代价太高)1、重要概念:M阶B树(叶结点:数据;非叶结点:键/根、非根和叶结点的限制)2、基本操作(插入:分裂方式/删除:领养和合并方式)六、标准库中的set和map(了解内容)1、set(排序后的,没有重复值的容器)2、map(排序后的,由键和值组成的项的集合)(典例:map<string,vector> <string> ::const_iterator itr;)</string> </string,vector>第五章散列一、★★链地址法1、基本思想(将hash值相同的所有记录保存在同一个线性链表中)2、实现链地址法的HashTable类模板⑴、数据成员(thelists(链表数组)和currentsize(已存储结点个数))⑵、核心操作:myhash()(散列到合适位置)⑶、基本操作:makeEmpty()和contains()(关键:利用find例程)⑷、重要操作:insert()和remove()二、★★探测法1、基本思想(hi(x)=(hash(x)+f(i))mod TableSize;其中f为冲突解决函数)2、线性探测法和平方探测法(f(i)=i;f(i)=i2)3、实现探测法的HashTable类模板⑴、数据成员(HashEntry(通过HashType)定义;数组array和currentsize)⑵、核心操作:findPos()(若x存在,返回位置;否则返回待插入位置)⑶、基本操作:makeEmpty()(关键:打上EMPTY 标记)⑷、重要操作:insert()和remove()三、★再散列(3个基本步骤:备份;增容并初始化;拷贝)1、链地址法的再散列2、探测法的再散列数据结构与算法复习提纲(详细版).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印支付<i>7</i> 元已有<i id="dl">10</i> 人下载本文链接:(转载请注明文章优先队列(堆)一、★★二叉堆1、基本概念:二叉堆(双重条件:完全二叉树;且堆序(任意结点小于它的所有后裔))2、二叉堆的类模板(BinaryHeap)⑴、数据成员(数组array;currentSize(当前堆的大小))⑵、基本操作:(插入和删除操作必须考虑特殊情况)Ⅰ、insert操作(关键:上滤)Ⅱ、deleteMin操作(两种格式)(关键:下滤;调用percolateDown例程)⑶、重要操作:buildHeap操作(从而得出构造函数)3、重要定理:高为h的满二叉树的结点的高度和为2h+1-1-(h+1)(分析证明)4、基本概念:d堆(二叉堆的简单推广)二、★★左式堆1、★★基本概念和性质⑴、概念:零路径长npl(null path length,the shortest path from x to a node with null point)Ⅰ、重要性质:结点X的npl=min(左右孩子的npl)+1Ⅱ、初值分析:npl(null)=0;npl(叶结点;度为1的结点)=1⑵、重要概念:左式堆(双重条件:堆序;且npl(左孩子)=npl (右孩子))⑶、定理:在右路径上有r个结点的左式堆至少有2r-1个结点(左侧全部铺满)2、★★左式堆的类模板(LeftistHeap)⑴、数据成员(LeftistNode *root;左式堆结点LeftistNode增加一个npl字段)⑵、关键操作:merge操作(驱动程序加两个merge完成;思想:大的合并到小的右子树)⑶、重要操作:insert操作和deleteMin 操作3、斜堆(斜堆与左式堆的关系,类似伸展树与AVL树的关系)⑴、概念:斜堆(具有堆序性质的二叉树)(即左式堆去掉npl限制)⑵、基本操作:merge(除右路径上最后一个结点,每次合并都必须交换)三、★★二项队列1、基本概念和性质⑴、概念:二项树(双重条件:堆序;Bk的递归定义)⑵、重要概念:二项队列(由若干棵二项树构成)⑶、重要性质(二项队列的两个性质:每个高度上至多有一棵二项树;可以用二项树的集合唯一表示任意大小的优先队列)2、★★二项队列的类模板(BinomialQueue)⑴、结点类BinomialNode(孩子兄弟表示法:leftchild指向结点最多的子树;rightsibling)⑵、数据成员(指针数组theTrees;currentSize(按递减方式存放))⑶、核心操作:combineTrees(同等高度的合并;保持堆序性质)⑷、基本操作:merge(三个步骤:resize、carry和whichcase、清空(currentSize的作用))⑸、重要操作:findMinIndex(寻找最小项)和deleteMin(H2:deletedTree和deletedQueue)第七章排序一、★插入排序1、算法思想(插入到前面有序序列)2、插入算法(关键:分析清楚边界情况(i控制插入趟数,j控制每趟中的插入位置))二、一些简单排序算法的下界1、逆序的概念、性质(一次相邻结点的交换,逆序改变1;逆序数=插入算法比较次数))2、定理:N个互异元素的数组,其平均逆序数为N(N-1)/43、定理:通过交换相邻元素进行排序的任何算法平均需要Ω(N2)时间三、希尔排序(ShellSort,缩减增量排序)1、算法思想(由若干趟Hk排序构成;每趟Hk排序使用插入算法)2、使用希尔增量的希尔排序(关键:三重循环(gap表Shell增量,i和j作用同插入排序)3、定理:使用希尔增量的希尔排序的最坏运行时间为Ω(N2)(注意构造和严格证明)四、★堆排序(heapSort)1、算法思想(两个步骤:创建大堆;首尾交换并下滤)2、堆排序算法(关键:基于二叉堆的buildHeap和percolateDown (修改为大堆))五、★★归并排序(mergeSort)1、算法思想(分治算法;合并两个已排序的表)2、归并算法(由驱动程序、mergeSort和merge构成;关键:tempArray临时数组;而merge包含三个while和一个拷贝)3、★算法分析(关键公式:T(N)=2T(N/2)+N,叠缩求和法)六、★★快速排序(quickSort)1、算法思想(分治算法:选取枢纽元素pivot;将S分割S1和S2;对S1和S2递归调用)2、快速算法(median3(关键:3元素中值法选取枢纽元素);quickSort(关键:i向右搜索第一个≥pivot的结点,j相反操作(注意i和j起始位置);还原pivot并从i处分割)3、★★算法分析(关键公式:T(N)=T(i)+T(N-i-1)+CN)(i为S1中元素个数)七、其它1、间接排序(解决comparable对象复制代价太高的问题)2、定理:只使用元素间比较的任何排序算法需要Ω(NlogN)次比较3、桶排序(前提条件(正整数)和算法思想)4、外部排序⑴、外部排序的概念(大文件的排序,排序过程中需要进行多次的内、外存之间的交换)⑵、基本思想(归并算法)第八章不相交集一、基本操作1、find(x)操作(查找操作:返回x所属的集合)2、unionSets(S1,S2)操作(求并操作:求集合S1和S2的并)二、DisjSets类(不相交集类)1、基本思想(利用树表示每个集合,根表示这个集合的名称;整个集合表示为一颗森林)2、基本数据结构(关键:双亲表示法)⑴、数据成员(数组S:(S[i]为i的双亲,其中-1表示根))⑵、构造函数(数组S全部初始化为-1)⑶、基本操作:find()操作和unionSets()操作3、算法分析(unionSets操作为O(1),find操作的最坏情形为O(1))三、灵巧求并算法第八章不相交集类一、基本概念1、关系R:A Relation R is defined on a set S is for every pair (a,b),a,b∈S,either True or False.2、等价关系:满足自反、对称和传递等三条性质的关系3、等价类(更准确的名称为:集合S上的R关系等价类)等价类的作用:形成对集合S的一个划分(即:根据关系R将集合S划分为S1,S2,S3??等等)二、基本操作1、find(x)操作:Return the name of set containing a givenelement. 2、unionSets(S1,S2)操作:(求并操作)Union two disjoint sets S1,S2(对两个不相交的非空集合S1和S2求并)三、不相交集类的基本数据结构1、数据结构的表示⑴、Use a tree to represent each set,the root can be used to name the set.(利用树来表示每一个集合,而且利用该树的根结点来表示这个集合的名称)⑵、这样,整个集合S可表示为一颗森林2、数据结构的实现采用双亲表示法实现(注意:双亲表示法是利用数组来存贮一棵树)其中:⑴、S[i]表示元素i的双亲结点⑵、若i是根结点,则S[i]=-13、★★不相交集类的算法实现(包括类的定义、构造函数的实现以及两个基本操作find和unionSets的实现)4、★算法分析⑴、unionSets操作的时间复杂度为O(1)⑵、find操作的最坏时间复杂度为O(N)Ⅰ、unionSets操作和find操作在算法效率上是一对矛盾的操作Ⅱ、连续的求并操作,在最坏情况下会建立起一棵深度为N-1的树Ⅲ、一般情况下,运行时间使针对连续混和使用M个指令来计算的在这种情况下,M次连续操作在最坏情形下可能花费O(MN)时间四、算法的改进1、union Sets操作的改进⑴、按大小求并(与按高度求并非常类似)⑵、按高度求并(保证将比较浅的子树并入比较深的子树)思路1:可利用每个根的数据元素来存贮整颗子树高度的负值思路2:为了同原算法类定义和构造函数实现的兼容,我们假定只有一个根结点的树的高度为-1,依此类推⑶、★算法分析两种算法都将find操作的时间复杂度改进为O(log N)(给出详细的证明)(另外的一个结论是:对于连续M个指令,平均需要O(M)时间,但最坏情形还是O(M log N))2、find操作的改进-路径压缩(Path compression)⑴、路径压缩的概念:Every node on the path from x to the root has its parent changed to the root. (从x到根的路径上每一个结点都使它的父结点变成根)⑵、★路径压缩的算法实现⑶、结论:路径压缩与按大小求并完全兼容,与按高度求并部分兼容五、按秩求并和路径压缩的最坏情形1、秩(rank)的概念:一个结点的秩,是指以该结点为根结点的子树的高度2、几个重要引理⑴、引理1:当执行一系列union指令以后,一个秩为r的结点必然至少有2r个后裔结点(包括它自己)⑵、引理2:秩为r的结点至多有N/2r个⑶、引理3:在求并查找算法的任意时刻,从树叶到根结点路径上的结点的秩单调增加3、★重要定理:当使用求并探测法和路径压缩时,算法在最坏情况下需要的时间为O(α(M,N))其中,α(M,N)是Ackermann函数的逆(推论:任意次序的M=Ω(N)次union/find操作花费的总运行时间为O(M log*N))六、迷宫问题1、算法思想:对于随机选中的一堵墙,使用union/find操作2、算法分析:时间复杂度为O(N log*N)图论算法一、图的表示1、邻接矩阵(adjacent matrix)表示法(分析优缺点)2、★邻接表(adjacency list)Ⅰ、对每一个顶点,使用一个链表来存放与之邻接的所有顶点Ⅱ、图的邻接表的一种简单的表示方式:Vector <vertex> array (使用一个数组来存放所有的顶点)</vertex>二、拓扑排序1、概念:拓扑排序是对有向无环图的顶点的一种排序2、★★拓扑排序的算法思想(可以使用Stack或者Queue来实现)⑴、计算每一个顶点的入度⑵、将所有入度为0的顶点放入一个初始为空的队列中⑶、若队列非空,则v出队,且所有与v邻接的顶点的入度减1⑷、若有顶点的入度降为0,则该顶点入队3、★拓扑排序的算法(使用伪码描述)(注意:利用一个辅助变量来判断是否出现回路)4、★算法分析:时间复杂度为O(|E|+|V|)三、最短路径1、无权最短路径(加权最短路径的特殊情形)⑴、采用广度优先搜索(Breadth CFirst Search)的策略(层次遍历的推广)⑵、★Vert ex的数据结构Ⅰ、known:当一个顶点被访问以后,其known置为true Ⅱ、dist:从s到该顶点的距离Ⅲ、path:引起dist变化的最后顶点(通过追溯path,可以得到s到该顶点的完整最短路径)⑶、★无权最短路径的算法思想和算法(关键:使用一个队列来实现)⑷、算法分析:时间复杂度为O(|E|+|V|)2、加权最短路径⑴、贪心算法(greed algorithm)Ⅰ、Solve the problem in stages(分阶段进行)Ⅱ、每个阶段都把出现的方案当成最优的解决方案⑵、、★★Dijkstra算法思想和算法Ⅰ、对所有结点初始化Ⅱ、在所有known标记为false的结点中,寻找一个其dist值最小的结点Ⅲ、扫描与v邻接的所有known标记为false的结点w,分析是否有必要update其dist值Ⅳ、更新w的path⑶、★★Dijkstra的算法分析Ⅰ、常规方法:通过扫描存放顶点的数组来寻找最小值,时间是O(|E|+|V|2)Ⅱ、使用优先队列的deleteMin方法寻找最小值:,其时间是O(|E|log|V|+|V|log|V|)3、具有负边值的图⑴、★算法思想和算法:综合了无权最短路径(采用队列)和Dijkstra算法(需要update)的思想Ⅰ、不需要再设置known来判断结点是否已经被访问过Ⅱ、扫描与v邻接的所有结点w,分析是否有必要update其dist 值,再分析w是否入队⑵、★算法分析:时间是O(|E|×|V|)(给出详细证明)4、无环图⑴、★算法思想以Dijkstra算法作为基础,但是顶点的选取采用拓扑原则(而不是寻找dist值最小的顶点)⑵、基本概念:动作结点图和事件结点图(注意:两者的转换方法)⑶、基本概念:最早完成时间,最晚完成时间,松弛时间(分析其计算公式)⑷、基本概念:关键路径-由零松弛边组成的路径四、网络流问题1、概念:最大流问题设有向图G=(V,E)的每条边表示边容量,求从给定的源点s 到汇点t可通过的最大流量2、算法思想⑴、辅助工具:流图(初始:每条边均为0)和残余图(初始:等于原图)⑵、从残余图中选择一条增长路径(关键:对流图和残余图进行调整)⑶、算法一直运行到没有增长路径为止五、最小生成树1、基本概念和性质⑴、生成树的概念和性质概念:Spanning tree is a tree formed from graph edges that connects all vertices of G. 性质:生成树的边数为N-1 ⑵、最小生成树的概念和性质MST性质:若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树2、Prim算法⑴、★Prim算法的基本思想:设G=(V,E),TE是G上最小生成树的边的集合Ⅰ、初始:U={u0},TE={}Ⅱ、从所有的(u,v)中寻找一条代价最小的边(u0,v0),其中u0∈U,v0∈V-U Ⅲ、U=U∪{u0},TE=TE∪(u0,v0)Ⅳ、上述操作一直做到U=V为止⑵、★★Prim算法Ⅰ、同Dijkstra算法非常类似,唯一区别在于dv的含义和更新方法不同(这里dv是指从v到所有known顶点的最短边)Ⅱ、注意:如何获取最后的最小生成树和计算出其代价3、Kruskal算法⑴、★★Kruskal算法的基本思想和算法Ⅰ、使用优先队列来存放所有的边Ⅱ、利用等价类的思想来决定(u,v)边是应该添加还是舍弃⑵、Kruskal的算法分析:同Prim算法一样,其时间复杂度为(|E|log|V|)六、深度优先搜索的应用1、深度优先搜索(DFS,Depth-first search)(DFS是对前序遍历的推广)⑴、★DFS算法思想和算法通常情况下,DFS算法均由两个模板构成Ⅰ、外围模板:针对整个图G进行(初始化,再扫描结点,若unvisited则调用核心模板)Ⅱ、核心模板:是一个从指定顶点开始的,非常简练的DFS递归程序⑵、DFS算法分析:时间复杂度为O (|E|+|V|)2、无向图⑴、★概念:前序编号(对图G进行DFS,图中的各个顶点被依次访问的顺序编号)⑵、★概念:DFS树(深度优先生成树)对图G进行DFS以后,图中的所有边被分成两大类:前向边和后向边其中所有的前向边构成了DFS树⑶、算法思想和算法(分析以上概念的算法实现)3、无向图的双连通性⑴、概念:双连通性和割点⑵、★low(v)的概念和计算方法Low(v)是顶点v可到达的最低顶点编号(关键:计算low的三条法则)⑶、割点的判断条件若顶点v存在一个孩子结点w,有low(w)=num(v),则v必然是一个割点⑷、★算法:寻找连通图中的所有割点该算法通过对图的两次遍历而实现(一次前序遍历和一次后序遍历)Ⅰ、结点Vertex包含以下域:visited,num,low,parent Ⅱ、首先计算图G的每个顶点的前序编号(计算出num和parent)Ⅲ、利用一趟后序遍历对各个顶点计算low,并判断是否割点4、欧拉回路⑴、概念:欧拉环游和欧拉回路⑵、欧拉定理:任何一个连通图存在欧拉回路的充分必要条件是图中所有顶点的度为偶数⑶、★欧拉回路的算法思想Ⅰ、数据结构的设计:遍历的路径采用链表保存;为避免重复扫描邻接表,对每一个邻接表必须保留最后扫描到的边Ⅱ、对给定的顶点进行一次DFSⅢ、选定一个拼接点,从该顶点开始进行DFS Ⅳ、上述步骤重复进行,直到所有的边都被遍历⑷、欧拉回路的算法和算法分析:时间复杂度为O(|E|+|V|)5、有向图⑴、按照与无向图相同的策略,对有向图进行DFS (若图G非强连通的,则产生DFS森林)⑵、有向图DFS的虚边有三种类型(无向图只有一种,即后向边)后向边、前向边和交叉边⑶、对有向图进行DFS的一个作用是:判断该有向图是否无环图法则如下:一个有向图是无环图当且仅当它没有后向边6、查找强分支⑴、★查找强分支的算法思想:两次DFSⅠ、首先对图G进行第一次DFS,得到DFS森林(通过对DFS的后序遍历得到每个顶点的后序编号;并且将G 的所有边反向得到GR)Ⅱ、再对GR进行第二次DFS,总是在编号最高的顶点开始一次新的深度优先搜索⑵、★定理:按照上述算法生成的DFS森林中的每棵树都是一个强连通的分支(分析其证明)七、NP完全性介绍1、P问题指保证以多项式时间运行的算法2、不可判定问题⑴、可以证明:计算机不可能解决所有的问题,这些不可能解出的问题称为不可判定问题⑵、著名的不可判定问题:停机问题Ⅰ、什么是停机问题?Ⅱ、停机问题的实质是:一个程序很难检查它自己3、NP类⑴、NP类代表非确定型多项式时间这类问题在难度上稍逊于不可判定问题⑵、判断一个问题是否NP问题的方法如果我们能在多项式时间内证明一个问题的任意“是”的实例是正确的,那么这个问题就属于NP类典例:哈密尔顿回路问题就是一个NP问题⑶、NP类同其它集合的关系Ⅰ、性质:NP类包括P类,即包括所有具有多项式时间解的问题Ⅱ、性质:不是所有的可判定问题都是NP问题(即NP问题并不是不可判定问题的补集)典例:无哈密尔顿回路问题显然是一个可判定问题,但不是NP问题4、NP完全问题⑴、NP完全问题是NP问题的一个子集⑵、重要性质:NP中的任何一个问题都可以多项式地归约成NP 完全问题⑶、证明一个问题是NP完全问题的方法Ⅰ、首先证明该问题是NP问题Ⅱ、然后将一个适当的NP问题变换到此问题典例:假设哈密尔顿回路问题是一个NP完全问题,证明旅行商问题也是一个NP完全问题第十章算法设计技巧一、贪心算法1、★贪心算法(greed algorithm)⑴、Solve the problem in stages(分阶段进行)⑵、每个阶段都把出现的方案当成最优的解决方案(当算法终止时,希望局部最优成为全局最优)2、调度问题⑴、★调度问题的概念:将作业平均完成的时间最小化(假设:非抢占调度,即一旦开始一个作业,就必须把该作业运行完)⑵、多处理器情形Ⅰ、实现步骤:(首先排序,然后按顺序开始作业,处理器之间轮流分配作业)Ⅱ、证明:按照这种算法思想实现的,一定是最优解⑶、将最后完成时间最小化(这是一个NP完全问题)3、赫夫曼(Huffman)编码⑴、概念:满树和前缀码⑵、赫夫曼编码的算法思想(频率出现高的字符编码要短)⑶、★赫夫曼编码的算法和算法分析(采用优先队列时,运行时间为O(ClogC))4、装箱问题⑴、基本概念Ⅰ、★概念:装箱问题(将物品装到最少数量的箱子中)Ⅱ、★概念:联机装箱(每一件物品必须放入一个箱子之后才能处理下一个物品)⑵、联机算法Ⅰ、重要性质:对于联机装箱问题不存在最优算法(分析其证明)Ⅱ、★定理一:任意联机装箱算法的下界为4M/3(分析其证明)⑶、下项适配Ⅰ、下项适配的基本思想(能放入当前箱子则放,否则开辟一个新的箱子)Ⅱ、★定理二:下项适配算法的上界为2M(分析其证明)⑷、首次适配Ⅰ、首次适配的基本思想(扫描并寻找第一个能放入的箱子,否则开辟一个新箱子)Ⅱ、定理三:首次适配算法的上界为17M/10 ⑸、最佳适配最佳适配的基本思想和上界分析(放入所有能够容纳它的最满的箱子中)⑹、脱机装箱Ⅰ、★首次适配递减的算法思想(首先排序,然后再使用首次适配算法)Ⅱ、引理一:大小至多是1/3(分析其证明)Ⅲ、引理二、个数至多是M-1(放入其它箱子中的物品个数至多是M-1,分析其证明)Ⅳ、★定理四、首次适配递减算法的上界是(4M+1)/3 Ⅴ、定理五、首次适配递减算法的上界可以缩减为11M/9+4二、分治算法1、分治算法(divide and conquer)⑴、★分治算法的基本思想:分治算法由两个阶段构成Ⅰ、分:递归解决较小的问题Ⅱ、治:从子问题的解构建原问题的解⑵、分治算法的特性(至少含有两个递归调用,且子问题是不相交的)2、分治算法的运行时间K⑴、★定理六:方程T(N)=aT(N/b)+O(N)的解(分析其。
数据结构学习复习提纲

数据结构学习复习提纲
一、算法
1、定义算法:算法是一个有效的求解一些问题的一系列指令的集合,它是由一些可以执行的操作组成的一个有序序列,只要按正确的顺序进行
安排,就能解决问题。
2、算法分类:根据执行方式,算法可分为顺序算法、选择算法、分
支算法、循环算法等;根据具体操作,算法可分为检索算法、排序算法、
图算法、数论算法、动态规划等。
3、算法时间复杂度:时间复杂度指的是算法的执行效率,即算法在
给定的输入量时所需的时间。
算法时间复杂度可以用大O表示法来描述,
其常见分为O(1)、O(logN)、O(N)、O(NlogN)和O(N^2)等。
二、数据结构
1、定义数据结构:数据结构是指把数据元素相互关联,组织在一起
形成一个整体,它是一个计算机中存储、组织数据的方法。
2、数据结构分类:根据数据间关系,数据结构可分为线性结构和非
线性结构;根据存储模式,数据结构可分为顺序存储结构和链式存储结构;根据逻辑结构,数据结构可分为简单结构、树形结构、图形结构等。
3、数据结构实现:数据结构的实现一般采用顺序表和链表两种形式。
数据结构复习提纲

复 习 题一、填空题若一个算法的时间复杂度用T(n)表示,其中n 的含义是 问题规模二叉树第k 层的最大结点数为 2k-1 . 栈和队列的共同特点是只允许在端点处插入和删除元素。
有128个结点构成的完全二叉树,其深度为 8 。
一个有n 个顶点的无向连通图至少有 n-1 条边。
最多有 n(n-1)/2 条边在二叉排序树中,关键字值最小的结点 左指针一定为空。
在待排序的元素逆序的情况下,直接插入排序的比较次数为 ( n-1)(n+2)/2 次。
正序情况下比较次数为 n-1前序序列和后序序列相同的二叉树为 空或只有根结点的二叉树 。
带头结点的单循环链表head 为空的判定条件是 head->next==head 。
假设以数组S[0..m-1]作为循环队列的存储结构,同时设变量front 和rear 分别指向队头元素的前一个位置和队尾元素位置,则队列中元素个数为 (rear-front+m)%m 。
设数组data[m]作为循环队列SQ 的存储空间,front 为队头指针,rear 为队尾指针,则执行出队操作后其头指针front 值为 front=(front+1)%m一个有n 个顶点的有向图至多有 n(n-1) 条弧。
在二叉排序树中,关键字值最大的结点 右指针一定为空 。
一组记录的排序码为(72,73,71,23,94,5,68),则利用快速排序方法,以第一个记录为基准得到的第一趟排序结果为 (68,5,71,23,72,94,73) 。
在数据结构中,从逻辑上可以把数据结构分成___线性结构和非线性结构_____对线性表进行二分查找时,要求线性表必须_____以顺序方式存储,且结点按关键字有序排序 一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是________108_________一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是__dceab 。
数组A[8][10]中,每个元素A 的长度为3个字节,从首地址SA 开始连续存放在存储器内,该数组按列存放时,元素A[4][7]的起始地址为_____ SA+180___。
数据结构复习提纲

1.数据元素是数据的基本单位,可有若干数据项组成,数据项是具有独立含义的最小标识单位,数据对象是具有相同性质的数据元素的集合,是数据的子集。
2.数据结构是带有结构的数据元素的集合,一般包括以下三方面内容:数据的逻辑结构、数据的存储结构、数据的运算①数据元素之间的逻辑关系,也称数据的逻辑结构,数据的逻辑结构是从逻辑关系上描述数据,与数据的存储无关,是独立于计算机的。
②数据元素及其关系在计算机存储器内的表示,称为数据的存储结构。
数据的存储结构是逻辑结构用计算机语言的实现,它依赖于计算机语言。
③数据的运算,即对数据施加的操作。
最常用的检索、插入、删除、更新、排序等。
3.数据的逻辑结构分类: 线性结构和非线性结构①线性结构:若结构是非空集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。
线性表是一个典型的线性结构。
栈、队列、串等都是线性结构。
②非线性结构:一个结点可能有多个直接前趋和直接后继。
数组、广义表、树和图等数据结构都是非线性结构。
4.数据的四种基本存储方法: 顺序存储方法、链接存储方法、索引存储方法、散列存储方法(1)顺序存储方法:该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。
通常借助程序语言的数组描述。
(2)链接存储方法:该方法不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系由附加的指针字段表示。
通常借助于程序语言的指针类型描述。
(3)索引存储方法:该方法通常在储存结点信息的同时,还建立附加的索引表。
索引表由若干索引项组成。
若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引,稠密索引中索引项的地址指示结点所在的存储位置。
若一组结点在索引表中只对应一个索引项,则该索引表称为稀疏索引稀疏索引中索引项的地址指示一组结点的起始存储位置。
索引项的一般形式是:(关键字、地址)关键字是能唯一标识一个结点的那些数据项。
数据结构复习资料(亲自整理)

数据结构复习资料(亲自整理)数据结构复习资料(亲自整理)引言:数据结构是计算机科学中的重要基础知识,掌握良好的数据结构能够提高程序的运行效率,同时也是进行算法设计和优化的关键。
本文将为大家提供一份亲自整理的数据结构复习资料,旨在帮助读者回顾和巩固数据结构的知识,并提供一些实践经验和应用场景。
一、数据结构的概念和基本知识1.1 数据结构的定义数据结构是指数据元素之间的相互关系和组织形式,它包括线性结构、树形结构、图形结构等多种形式。
数据结构可以用来描述程序的运行状态和过程中产生的数据,是程序设计的基础。
1.2 常见的数据结构类型介绍常见的数据结构类型,如数组、链表、栈、队列、树、图等,并分别阐述它们的特点、适用场景和基本操作。
1.3 数据结构的时间复杂度和空间复杂度分析详细解释时间复杂度和空间复杂度的概念,分析不同数据结构及其操作的时间和空间复杂度,并通过实例演示如何计算和评估复杂度。
二、线性结构2.1 数组(Array)介绍数组的定义和基本操作,包括初始化、插入、删除、查找等操作。
通过示例展示如何使用数组解决实际问题,并探讨数组的优缺点及应用场景。
2.2 链表(Linked List)介绍链表的概念和分类,包括单向链表、双向链表和循环链表。
详细说明链表的插入、删除和查找操作,并讨论链表的优缺点及适用场景。
2.3 栈(Stack)解释栈的概念和特点,包括栈的基本操作(push、pop、top等)。
演示如何使用栈来解决实际问题,如逆序输出、括号匹配等,同时介绍栈的应用领域。
2.4 队列(Queue)描述队列的定义和基本操作(enqueue、dequeue等),并通过实例介绍队列的应用,如打印任务调度、消息传递等。
三、树形结构3.1 二叉树(Binary Tree)解释二叉树的定义和性质,包括满二叉树、完全二叉树和二叉查找树等。
介绍二叉树的遍历方式(前序、中序、后序)和常见操作,并给出实际应用案例。
3.2 堆(Heap)介绍堆的概念和特点,包括最大堆、最小堆和堆排序。
数据结构复习资料复习提纲知识要点归纳

第一章数据结构概述基本概念与术语1.数据:数据是用来描述现实世界的文字,字符,图像,声音,以及能够输入到计算机中并能被计算机处理的符号。
2.数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。
(补充:一个数据元素可由若干个数据项组成。
数据项是数据的不可分割的最小单位。
)3.数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
(有时候也叫做属性。
)4.数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
(1)数据的逻辑结构:数据的逻辑结构是指数据元素之间存在的固有逻辑关系,常称为数据结构。
数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。
依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:a.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系。
b.线性结构:结构中的数据元素之间存在“一对一“的关系。
若结构为非空集合,则除了第一个元素之外,和最后一个元素之外,其他每个元素都只有一个直接前驱和一个直接后继。
c.树形结构:结构中的数据元素之间存在“一对多“的关系。
若数据为非空集,则除了第一个元素(根)之外,其它每个数据元素都只有一个直接前驱,以及多个或零个直接后继。
d.图状结构:结构中的数据元素存在“多对多”的关系。
若结构为非空集,折每个数据可有多个(或零个)直接后继。
(2)数据的存储结构:数据元素及其关系在计算机内的表示称为数据的存储结构。
想要计算机处理数据,就必须把数据的逻辑结构映射为数据的存储结构。
逻辑结构可以映射为以下两种存储结构:a.顺序存储结构:把逻辑上相邻的数据元素存储在物理位置也相邻的存储单元中,借助元素在存储器中的相对位置来表示数据之间的逻辑关系。
b.链式存储结构:借助指针表达数据元素之间的逻辑关系。
不要求逻辑上相邻的数据元素物理位置上也相邻。
5.时间复杂度分析:a.常量阶:算法的时间复杂度与问题规模n无关系T(n)=O(1)b.线性阶:算法的时间复杂度与问题规模n成线性关系T(n)=O(n)c.平方阶和立方阶:一般为循环的嵌套,循环体最后条件为i++时间复杂度的大小比较:O(1)< O(log 2 n)< O(n )< O(n log 2 n)< O(n2)< O(n3)< O(2 n )<O(n!)<O(n n)6.算法与程序:(1)算法的5个特性a、输入:有零个或多个输入b、输出:有一个或多个输出c、有穷性:要求序列中的指令是有限的;每条指令的执行包含有限的工作量;整个指令序列的执行在有限的时间内结束。
数据结构与算法复习提纲

数据结构与算法复习提纲一、引言
- 数据结构与算法的重要性
- 复习的目的与意义
二、基本概念回顾
A. 数据结构回顾
1. 线性结构
2. 非线性结构
B. 算法回顾
1. 算法的定义与特性
2. 算法复杂度分析
a. 时间复杂度
b. 空间复杂度
三、线性结构复习
A. 数组
1. 定义与特点
2. 基本操作
3. 数组与链表的区别与应用场景
B. 链表
1. 定义与分类
2. 基本操作
3. 单链表与双链表的比较
C. 栈与队列
1. 定义与特点
2. 基本操作与应用场景
3. 栈与队列的联系与区别
四、非线性结构复习
A. 树
1. 二叉树与二叉搜索树
2. 平衡二叉树与红黑树
3. 堆与二叉堆
B. 图
1. 图的定义与分类
2. 图的表示方法
3. 图的遍历算法
五、常见算法复习
A. 搜索算法
1. 广度优先搜索算法(BFS)
2. 深度优先搜索算法(DFS)
B. 排序算法
1. 冒泡排序
2. 插入排序
3. 快速排序
C. 查找算法
1. 顺序查找
2. 二分查找
六、应用场景与综合题目
A. 常见应用场景下的数据结构选择
1. 栈与递归
2. 队列与广度优先搜索
3. 常用数据结构选择总结
B. 综合题目解析与思考
七、总结与复习建议
A. 复习要点总结
B. 复习策略与建议
结语
- 数据结构与算法的重要性再强调
- 希望本复习提纲对您的复习有所帮助。
祝您顺利掌握数据结构与算法知识。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构复习提纲(大作业在后面)计算机本科(2004年11月)第一部分题型1.单选题:2分×14=28分2.判断题:1分×10=10分3.填空题:2分×10=20分4.应用题:8分×4=32分5.程序题:5分× 2=10分第二部分复习提纲(不分题型,弄清原理,不要死记硬背)1.简单复杂性的判断:(1)i=n。
while(i>=1)i=i/2。
其中i=n,n/2,n/22,…,n/2k, 需n/2k>=1,即2k<=n,所以复杂性为O(log2n)(2)i=1。
while(i<=n) i=i+2。
其中i=1,3,5,…,(2k-1),需2k-1<=n,则频度k<=(n+1)/2,复杂性为O(n)(3)i=1。
while(i<=n) i=i*3。
其中i=1,3,32,…,3k, 需3k<=n,则频度k<=log3n,复杂性为O(log3n)(4)i=1。
while(i*i<=n) i++。
其中i=1,2,3,…,k,需k2<=n,则频度k<=n1/2,复杂性为O(n1/2)2.四种基本存储方式的特点?什么时候逻辑关系可以由存储地址表示?什么时候由指针表示?什么时候存储地址与结点内容有关系?3.逻辑结构、存储结构、运算、算法、算法复杂性等,哪些与计算机有关?无关?1.顺序表、单链表的存储、插入、删除运算特点?是否可以随机存取?顺序存取?2.单链表中插入结点的基本步骤?3.有头结点、无头结点的循环、非循环单链表为空的条件分别是什么?4.用尾指针表示循环单链表有什么好处?5.例:删除顺序表中所有的正数,要求移动次数小。
解:搜索顺序表,对每一个正数,先不删除,而是累计当前正数个数s,于是,对每个非正数,将它一次性前移s位。
算法复杂性为O(n)。
voiddels(sqlist *L) {int s,i。
s=0。
//正数计数器for(i=0。
i<L->n。
i++)if(L->data[i]>0 s++。
//累计当前正数else if(s>0) L->data[i-s]=l->data[i]。
//向前移动s位L->n=L->n-s。
//调整表长}6.例:将顺序表中所有负数移动到表的前端,要求移动次数小。
解:双向扫描:从前向后找一个正数,再从后向前找一个负数,然后交换两者位置。
复杂性为O(n)。
voidmoves(sqlist *L) {int i,j。
datatype x。
i=1。
j=L->n。
//删除A[1]到A[n]的所有零元素,设数组下标从1开始while(i<j) {while(L->data[i]<0 && i<j) i++。
//从前向后找正数while(L->data[j]>=0 && i<j) j−−。
//从后向前找负数if(i<j) {x=L->data[i]。
L->data[i]=L->data[j]。
L->data[j]=x。
//交换i++。
j−−。
}}}1.链队列、链栈是否都有必要设置头结点?2.循环队列A[m]中,已知头指针、尾指针与元素个数中的任意两个,求另一个?队满条件?len=(rear-front+m)%m。
rear=(front+len)%m。
front=(rear-len+m)%m。
队满:front=(rear+1)%m3.串长、空串、空白串、串连接、子串定位(模式匹配)等是何意?1.稀疏矩阵、特殊矩阵的含义?为什么要对矩阵进行压缩存储?2.三元组含义?一般矩阵按三元组存储能否节省空间?3.广义表可分成几种?它们的图形表示特点如何?4.例:从广义表A=(x,(a,b,c),y)中取出原子b。
在广义表中取某个元素,需要将该元素所在的子表逐步分离出来,直到所求的元素成为某个子表的表头,再用取表头运算取出。
注意,最终取出某个元素时,不能用取表尾,因为它得到的是该元素组成的子表,而不是元素本身。
本例的运算过程为①取表尾tail(A):得到B=((a,b,c),y)②取表头head(B):得到C=(a,b,c)③取表尾tail(C):得到D=(b,c)④取表头head(D):得到b总的过程为:head(tail(head(tail(A))))。
1.树所有结点的度数之和与结点数有何关系?与边数有何关系?解:边数=度数和=结点数-1。
因为度数就是孩子数,而根不是孩子,故度数和比结点总数少1。
2.只有3个结点的二叉排序树有几种形态?解:有5种,见下图所示。
3.二叉树是否是树的特殊情形?是否是有序树的特殊情形?解:都不是 4.树和二叉树的度有何特点?二叉树的度肯定为2吗?解:二叉树每个结点最多两个孩子,即结点的度最大为2,但也可能所有结点的度都不为2,如只有1个结点,或单枝树等,所以二叉树的度并不一定是2。
5.某完全二叉树有600个结点,则叶子数有多少?度1结点有多少?解:由层次编号规律,结点i 的左孩子编号为2i ,若结点i 为叶子,则它没有左孩子,即2i>n ,即i>n/2=300的结点为叶子,叶子号为301,302,…,600,共300个。
由于n 0=n 2+1,现在n 0=300,所以n 2=299。
另外,结点总数n=n 0+n 1+n 2,所以n 1=600-300-299=1 6.二叉树每层只有一个结点,则高度为k 的二叉树有多少种?解:每种这样的二叉树只能有一个叶子,在最底层,而叶子可能有2k-1种情况,故有2k-1种。
7.完全二叉树有6个叶子,则结点总数就是11吗?解:已知叶子数的完全二叉树一般有两棵,结点数差1,见下图:AB C DEFGH I J K AB C D EF GH I J K L一般,结点数n =n 0+n 1+n 2,而n 0=n 2+1(二叉树性质),所以n =2n 0-1+n 1。
完全二叉树树中度为1的结点最多只有1个,即n 1=1或0,所以n =2n 0或n =2n 0-1。
8.二叉树各结点在先、中、后序序列中的相对位置是否不变?解:若是叶子结点,则在先、中、后序序列中的相对位置不变,其它结点未必。
9.给定二叉树先、中、后序序列中的任意两个,是否就可还原出二叉树?解:若给定的是先序和后序,则由于不能确定根,也就不能还原出二叉树(不唯一)。
10.如何由先序+中序、后序+中序还原出二叉树? 解:由遍历方法以下几点是显然的:①对前序序列,序列的第一个点就是整个二叉树的根; ②对后序序列,序列的最后一个点就是整个二叉树的根;③对中序序列,以根为界,序列的前一部分结点在根的左子树中,后一部分结点在根的右子树中;并且,由前一部分构成的子序列是左子树的中序序列,由后一部分构成的子序列是右子树的中序序列。
若给定了前序和中序序列,反复利用上面的①和③,就可获得结点完整的逻辑信息,即由前序序列找到根,由中序序列得到左、右子树;再在对每个子树由前序序列找到子树的根,由中序序列得到子树的左、右子树,等等类推,每次都可得到一个点(子树的根),从而逐渐获得树的全部信息,也就可以还原和构造出该二叉树。
这个过程参见下图。
中序遍历序列:前序遍历序列:右子树根isie i例:已知二叉树的中序和后序序列分别为:BCDAFEHJIG 、DCBFJIHGEA ,画出该二叉树。
解:由后序序列可知,整个二叉树的根为A ,其左边为BCD ,对应A 的左子树,右边为FEHJIG ,对应根的右子树。
对每个子树进行同样分析即可画出此二叉树。
比如对左子树BCD ,从原后序序列可找到它对应的后根序列为DCB ,于是左子树的根为B ,然后再由中序序列BCD 可知B 的左子树为空,CD 在B 的右子树,等等继续下去,直到每个结点都画出来。
11.完全二叉树的深度为⎣⎦1n log 2+或⎡⎤1)(n log 2+,是否是说深度有两种可能?解:只一种,它们的具体值相等。
12.树的常用存储方法有哪些?如何将树转换为二叉树?树的遍历与对应二叉树的遍历有何关系?13.怎样知道线索二叉树某结点是否有左右孩子,是否为叶子?解:看结点的线索标志位,比如左线索标志位ltag=1则无左孩子,左右线索标志位都为1则为叶子。
14.如何画中序、先序、后序线索二叉链表?线索二叉链表是否就没有空指针了?解:以中序线索二叉链表为例,下列二叉树的中序线索二叉链表如图所示。
详细过程见课本。
AB CNULLD EF15.线索二叉树上求结点的前趋和后继时,是否可不再需要遍历了?16.什么是前缀码?17.哈夫曼树如何构造?WPL如何求?其结点总数可以为1000吗?其中有度1结点吗?解:哈夫曼树的结点总数为2n-1,必为奇数,不可能为偶数。
其中n为叶子数。
构造过程是每次两个结点合并,故不会出现度1的结点。
18.例:求二叉树中度为1的结点数。
解:设二叉树结点类型为bitree,函数名为sum1,函数返回结点数。
int sum1(bitree t) {int L,R。
if(t==NULL) return 0。
//当前树为空,递归出口L= sum1(t->lchild)。
//求左子树中相应结点数R= sum1(t->rchild) //求右子树中相应结点数if((t->lchild==NULL && t->rchild!=NULL) ||(t->lchild!=NULL && t->rchild==NULL)) //当前结点度为也1return L+R+1。
//度1结点数=左子树中度1结点数+右子树中度1结点数+1elsereturn L+R。
}19.例:求二叉树中度为2的结点数。
解:设二叉树结点类型为bitree,函数名为sum2,函数返回结点数。
int sum2(bitree t) {int L,R。
if(t==NULL) return 0。
//当前树为空,递归出口L= sum1(t->lchild)。
//求左子树中相应结点数R= sum1(t->rchild) //求右子树中相应结点数if(t->lchild!=NULL && t->rchild!=NULL) //当前结点度为也2return L+R+1。
//度2结点数=左子树中度2结点数+右子树中度2结点数+1elsereturn L+R。
}1.图的DFS和BFS遍历分别用到什么数据结构?解:栈、队列2.一个图有n个顶点,则每个顶点的度最大是多少?解:对无向图,最大为n-1;对有向图,最大可为2(n-1),因为每个顶点到其余n-1顶点都可有一条入边和出边。