重庆大学《数据结构与算法》复习提纲(学生版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法》复习提纲
一、程序设计原理
理解
二、栈
(1) 栈说明:栈的定义和基本操作
栈是一种特殊的线性表,只能在固定一段进行插入或者删除操作。
包含栈顶,栈底。
表中无元素时,成为空栈。
操作:empty,top,push,pop
(2)栈的实现:顺序栈的实现
利用连续的存储单元依次存放数据元素。
确定那一端表示栈底。
一般top=-1来表示空栈。
进栈操作时,先使top加1,用以指示新的栈顶位置。
先进后出。
上溢,top>=stacksize-1.
下溢,top=-1
(3) 应用-桌面计算器:理解
(4) 应用-括号的匹配:理解
(5) 抽象数据类型及其实现:理解
三、队列
(1) 定义:队列的定义和基本操作
队列也是一种特殊的线性表,删除操作限定在表的一段,而插入操作在表的另一端。
队尾(rear)和对首(front)。
先进先出。
append,server,retrieve,empty,clear,full,size
(2)队列的实现:顺序队列的实现
删除操作由front指示,插入操作由rear指示。
rear》=maxsize队满,rear=front,表示队空。
(3)C++队列的循环实现:顺序队列的实现
(4)演示和测试:理解
(5) 队列的应用-模拟:理解
操作系统中的各种资源请求排队和各种数据缓冲区的先进先出管理,各种应用系统的时间规划、时间模拟,树类和图类问题中的一些非递归搜索算法等等。
四、链式栈和链式队列
(1) 指针和链式结构:理解
链表的思想是为表结构的每一个元素扩充一个指针,这个指针给出了表中下一个元素的位置。
指针被定义为一个对象,经常是变量,用于存储其他对象的位置。
动态内存分配。
动态内存分配的优点:
不需要预先分配存储空间,分配的空间可以根据程序的扩大和缩小(2)链栈:链式栈的实现
(3) 带保护的链栈:理解
(4) 链式队列:链式队列的实现
(5) 应用-多项式运算:理解
(6) 抽象数据类型及其实现:栈和队列的抽象数据类型定义
五、递归
(1) 递归导言:递归算法的两个组成部分、非形式化描述转化为递归定义(如求阶乘等)每个递归过程包括两个部分:终止条件,循环部分
1.不需用递归处理的最小的、基本的问题
2.将特定的问题简化成一个或多个更小的问题的通用方法,由此向前,最终将问题一直简化成基本问题。
非形式化定义:n! = n*(n-1)*(n-2)....
形式化定义:n! = 1 n=0
n*(n-1) n>0
(2)递归的原理:理解
找出关键步骤--找出停止规则--列出算法大纲--检查终止--画出递归树
(3) 回溯法-延缓工作:理解四皇后问题
通过构造部分解,并总是保证部分解与问题的需求保持一致,从而完成关于问题的解的搜索。
之后,将部分解扩展到完善,但当发生与问题需求不一致的情况时,算法通过移去最近构造的解部分并进行倒退(回溯)以尝试另一种可能性。
适用:一开始有多种可能性,但实际只有少数几种会继续存在。
(4) 树结构的程序-在游戏中预测:不做要求
六、表和字符串
(1)表的定义:表的定义和基本操作
表是一种抽象数据类型,允许改变序列中任意元素的操作。
construct, empty, full, size, clear, insert, remove, retrieve, replace, traverse (2)表的实现:顺序实现、简单链式实现、双链表
代码见书上
优缺点比较:
优点:
链表:动态存储的灵活性,除非计算机内存耗尽,否则不会出现上溢。
在中间进行修改比顺序表更快,特别是插入和删除。
缺点:
链表:链本身要占用空间,因此所占的空间要大很多。
不适合随机访问。
需要长时间遍历才打到想要的结点
顺序存储通常更可取:
当个别看起来,元素非常小时;
编写程序是就已知表的长度时;
除了在表尾外只需要很少的插入和删除时;
当随机访问很重要时。
链式存储证明更优:
当元素较大时;
当事先不知道表的长度时;
当再插入、删除和重排元素中需要灵活性时。
(3) 字符串:不做要求
(4) 应用-文本编辑器:不做要求
(5)数组链表:理解
基于数组实现链表
必须事先决定分配给每个数组多大的空间,所以失去了动态存储分配这一特征
数组链表可以获得修改链表的灵活性和在几个链表间共享同一信息域的能力,并通过使用下标直接访问元素从而具有随机访问的优点
(6) 应用-生成排列:不做要求
七、查找
(1) 查找-引言和符号:理解
键:一部分信息
记录:包含与这个键相关的其他信息
(2)顺序查找:算法流程、算法实现、算法分析(比较次数计算)
在表的一段开始往后扫描,直到找到想要的键或者到达表的另一端
平均比较次数:(n+1)/2
成功:最好1次最坏n次不成功:n次
(1)二分查找:两个版本的算法流程、算法实现、算法分析(比较次数计算)
针对有序表
将目标键与中央的键进行比较,然后根据目标见是在中央这个键的前面还是后面,将注意力仅仅限制到表的第一部分或者第二部分。
健忘版:忘记键目标key target可能很快被找到,中央的键不与目标键进行比较,持续对表进行二分,直到剩下的表的长度为1。
Successful search: lg n + 1
Unseccessful search: Lg n +a
识别相等:将中央的键与目标键进行比较
Successful search: 2lgn-3
Unsuccessful search: 2lgn
特定情况下,成功与不成功查找中键的比较的平均次数可以用下式表示:S=(1+1/n)U+3
(1)比较树:画出顺序查找和二分查找(两个版本)的比较树
八、排序
快速排序的方法,在要排序的数据已经基本有序的情况下最不利于发挥其长处。
对初始状态为递增有序的序列进行排序,最省时间的是插入排序,最浪费时间的是快速排序。
已知待排列序列中每个元素距其终点位置不远,则采用插入方法最节省时间。
关键字比较的次数与记录的初始排列次序无关的是选择排序。
(1)插入排序:算法流程、算法实现
基于有序表
最好情况:原始数据元素为正序排列,总比较次数为n-1,元素的移动次数为2(n-1),时间复杂度为O(n)
最坏情况:原始数据为逆序,比较次数n(n-1)/2, 移动次数为(n-1)(n+4)/2 时间复杂度为O(n2)
平均情况:比较次数和移动元素的次数,约为n2/4, 时间复杂度为O(n2)
(2)选择排序:算法流程、算法实现
从待排序的元素中选取一个关键字最小的,然后循环找出最小关键字的排在后头,知道最后一个元素。
(3) 希尔排序:算法流程
对待排序的元素序列分成若干个小组,对同一组内的元素进行插入排序,小组内元素个数增加,小组的个数减少,直至全部元素都在同一个小组内。
时间复杂度在O(nlog2n)和O(n2)之间,最好情况达到O
(4)链表的归并排序:算法流程、算法实现
两路归并,整型变量i,j,k分别指向有序序列ABC的第一个单元,比较A【i】和B[j]的大小,小的那个(设是A【i】)赋给C[k], 然后i++, j不变,之后继续按此方法比较,直至两边元素都比完了。
(5) 顺序表的快速排序:算法内容、算法实现
(6) 堆和堆排序:算法流程、算法实现
堆,是具有下列性质的完全二叉树:没个非中断结点(元素)的关键字大雨等于他的孩子结点的关键字(成为大根堆);或没个非终端节点元素的关键字小于等于他的孩子结点的关键字(成为小根堆)。
(7)冒泡排序:算法流程、算法实现
最大的先到最后,然后依次确定次大的,直至全部排列好。
最多的比较次数是n(n-1)/2, 移动次数为3n(n-1)/2. 平均比较和移动的次数是n(n-1)/4.冒泡排序的时间复杂度为O(n2).
十、二叉树
(1) 二叉树:定义、二叉树遍历、链式实现、通过前序序列和中序序列构造二叉树是N个结点的有限集合。
(2)二叉查找树:定义
二叉查找树里没有两个元素可以具有相等的键。
(3)建立二叉查找树:构建方法
(4)高度平衡-AVL树:构建AVL树
(5) 伸展树-自我调节的数据结构:不做要求
十一、多路树
(1) 果园、树和二叉树:定义、果园与二叉树的对应关系及转换
树转换为二叉树:兄弟结点之间加一条线,保留其与左孩子之间的连线,抹掉其余其他孩子之间的连线。
以树的根结点为轴心,顺时针旋转45度。
森林转化为二叉树:将森林中的树变为二叉树,将每个二叉树的根结点相连,以第一棵树的根结点为二叉树的根,顺时针旋转45度。
(2)词典查找树-trie:不做要求
(3)外部查找:B-树:B-树的生长过程
(4) 红-黑树:不做要求
十二、图
(1) 数学背景:定义
(2)计算机表示:四种表示方式
(3)图的遍历:深度优先遍历和广度优先遍历的算法流程、算法应用
深度优先遍历的过程是递归的。
算法思想:访问定点v,并将其标记为已访问;去他的第一个相邻结点并赋值给w;如果w存在,重复之行前两步。
如果w未被访问,则从顶点w出发进行深度优先遍历;取v的下一个相邻结点并赋值给w.
在广度优先遍历中,先被访问的顶点,其相邻结点也先被访问,所以在算法的视线中需要使用一个队列,用来一次记住被访问过的顶点。
算法思想:初始化队列Q,访问顶点v,并将其标记为已访问,同时v入队列Q;如果队列Q非空,则重复之行前三步。
(4)拓扑排序:算法流程
分为深度优先,广度优先。
那个表格要会画哦。
为了得到顶点的先行序列。
先找到一个没有直接前驱的顶点,将它输出,之后删去这个顶点以及从他出发的弧。
再循环。
没有前驱=入度为0.
(5)贪心算法-最短路径:算法流程、算法应用
求的是点和点之间的最短距离
应用:一个城市到另一个城市之间运输的时间最短或者怎样运送费用最少
(6)最小生成树-算法流程:算法流程、算法应用
在图中代价最小的生成树成为图的最小生成树。
在已添加的结点中找出一个结点,他与为添加节点之间的权最小,一直。
算法应用:一个联通网表示城市之间的通信系统,网的顶点代表城市,网的边代表城市之间架设通信线路的造价,个城市之间的距离不同,地理条件不同。
造价也就不相同。
要求既联通所有城市又使总造价最低,这就是一个求图的最小生成树的问题。
(7) 图作为数据结构:不做要求
十三、案例研究
不做要求。