算法设计与分析考试重点归纳

合集下载

算法设计与分析重点总结

算法设计与分析重点总结

算法设计与分析重点总结考试题型:选择 2* 10个填空2* 10个简答 3* 4个程序分析填空 4* 4个综合(代码)8* 4个第⼀章基础知识1.算法的定义算法就是解决问题的⽅法,是解决某⼀特定问题的⼀组有穷指令的序列,是完成⼀个任务所需要的具体步骤和⽅法2.算法的特征有限性 ⼀个算法总是在执⾏了有穷步的运算之后终⽌确定性:算法的每种运算必须要有确切的定义,不能有⼆义性。

输⼊:每个算法有0个或多个输⼊。

所谓0个输⼊是指算法本⾝定出了初始条件。

输出:⼀个算法产⽣⼀个或多个输出,这些输出是同输⼊有某种特定关系的量可⾏性:算法中有待实现的运算都是基本的运算,原理上每种运算都能由⼈⽤纸和笔在有限的时间内完成。

(实数的算术运算是“不能⾏”的)3.计算过程只满⾜确定性、能⾏性、输⼊、输出四个特性但不⼀定能终⽌的⼀组规则4.算法的有穷性意味着不是所有的计算机程序都是算法5.算法正确性证明数学归纳法,反例:能够使算法运⾏失败的输⼊实例6.算法的好坏:通过数学⽅法进⾏分析,时间复杂度,空间复杂度,循环次数(归并,快排,贪⼼的复杂度)7.算法运⾏中主要影响运⾏时间的语句是基本操作,即占有最多⽐例的语句8.时间复杂度分析:1)确定⽤来表⽰问题规模的变量;2)确定算法的基本操作;3)写出基本操作执⾏次数的函数(运⾏时间函数);4)如果函数依赖输⼊实例,则分情况考虑:最坏情况、最好情况、平均情况;5)只考虑问题的规模充分⼤时函数的增长率,⽤渐近符号O 、Θ、Ω 、o 来表⽰。

6)常⽤O和Θ9.基本操作算法中的某个初等操作,基本操作的选择,必须反映出该操作随着输⼊规模的增加⽽变化的情况第⼆章递归算法1.递归若⼀个对象部分地包含它⾃⼰, 或⽤它⾃⼰给⾃⼰定义, 则称这个对象是递归的;若⼀个过程直接地或间接地调⽤⾃⼰, 则称这个过程是递归的过程。

分为直接递归和间接递归2.特点(1)将问题分解成为形式上更加简单的⼦问题来进⾏求解,递归过程⼀般通过函数或⼦过程来实现(2)问题求解规模缩⼩,把问题转化为规模缩⼩了的同类问题的⼦问题(3)相邻两次重复之间有紧密的联系(4)是否收敛,即终⽌条件3.使⽤递归的三种情况问题的定义数据结构问题求解的过程4.递归模型递归边界(递归的终⽌条件)和递归体5.过程先将整个问题划分为若⼲个⼦问题,通过分别求解⼦问题,最后获得整个问题的解。

算设计与分析复习要点总结

算设计与分析复习要点总结

1. 算法定义:算法是解决问题的方法或过程。

算法的性质:输入:一个算法有零个或多个输入。

输出:一个算法有一个或多个输出。

确定性:算法中每一条指令必须有确切的含义,不存在二义性。

可行性:算法中的每条指令执行次数有限,执行时间时间也有限。

2.程序是算法用某种程序设计语言的具体实现,程序可以满足算法的有限性。

最基本的运算有:赋值运算,算数运算,逻辑运算,关系运算。

3. 数据分为,对象数据,结果数据,他们可以是所有类型中的任何一种类型。

表示方式有集合(枚举),结构体,指针。

数据类型分为:boolean,byte,char,double,float,int,long,short.4. 描述算法的几种方式:自然语言方式,表格方式,图标(流程图),伪码语言(类程序设计语言)。

5. 算法的复杂性:是该算法所需要的计算机资源的多少,时间资源的量称为时间复杂性和空间资源的量称为空间复杂性。

用n,i,a表示算法要解的问题的规模,算法的输入,算法本身,而且c表示复杂性,应该有c=f(n,i,a)。

5.递归:直接或间接的调用本身的算法成为递归算法。

用函数自身给出定义的函数成为递归函数。

阶乘函数;n!={1 n=0;n(n-1)!n>0;}Public static int factorial(int n){If (n==0)return 1;Return n* factorial (n-1);}斐波那契(Fibonacci)数列F(n)= 1 n==0,1; F(n-1)+F(n-2) n>1;Public static int fib(int n){ if (n<=1) return 0;if (n>1) return fib(n-1)+fib(n-2);}排列问题:Public static void perm (obejt[]list,int k,int m){If (k==m){For (int i=0;i<=m;i++)System.out.print(list[i])System.out.println() }ElseFor (int i=k;i<=m;i++){mymath.swap(list ,k,i);Perm(list,k+1,m);Mymath.swap(list ,k,i); }}整数划分问题Public static int q(int n ,int m ){if ((n<1)||(m<1))return 0;If((n==1)||(m==1))return 1;If(n<m)return q(n,m-1)+1;Return q(n,m-1)+q(n-m,m);}6.系统需要在运行调用算法前先完成3件事情:1.为所有实参指针,返回地址等信息给被调用算法。

算法设计与分析复习要点

算法设计与分析复习要点

·算法是指解决问题的方法和过程。

算法是由若干条指令组成的有穷序列。

·算法特性:输入、输出、确定性、有限性(执行时间和执行次数)(有五个空再加上可行性)。

·程序是算法用某种程序设计语言的具体实现,程序可不满足有限性的特性。

·程序调试只能证明程序有错,不能证明程序无错误!·算法复杂性= 算法所需要的计算机资源。

·算法的复杂性取决于:(1)求解问题的规模N;(2)具体的输入数据I;(3)算法本身的设计A。

·可操作性最好且最有实际价值的是最坏情况下的时间复杂性。

第二章递归与分治策略二分搜索技术:O(logn)大整数乘法:O(n log3)=O(n1.59)Strassen矩阵乘法:O(n log7)=O(n2.81) 棋盘覆盖:O(4k)合并排序和快排:O(nlogn)线性时间选择:O(n)最接近点对问题:O(nlogn) 循环赛日程表:O(n2)·分治法思想:将一个难以解决的问题分割成一些规模较小的相同问题,以便逐个击破,分而治之。

边界条件与递归方程是递归函数的两大要素。

递归优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。

缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

·分治法时间复杂度分析:T(n)<= O(1) n=n0aT(n/b)+f(n) n>n0若递归方式为减法:T(n) = O(a n)若递归方式为除法:f(n)为合并为原问题的开销:f(n)为常数c时:T(n)=O(n p)f(n)为线性函数:O(n) a<ba是子问题个数,b是递减的步长T(n)= O(nlog b n) a=bO(n p) a>b,p=log b af(n)为幂函数n x时:O(n x) a<f(b)T(n)= O(n p log b n) a=f(b)O(n p) a>f(b),p=log b a·证明算法的正确性:部分正确性、终止性。

!算法设计与分析总复习

!算法设计与分析总复习

!算法设计与分析总复习算法设计与分析是计算机科学中非常重要的一个领域,它涉及到了算法的设计、性能分析和优化等方面。

在准备考试之前,我们需要对算法设计与分析的基本概念和常用算法进行全面复习。

一、算法设计与分析基本概念1.算法的定义:算法是一系列解决特定问题的有限步骤。

2.算法的特性:算法具有明确性、有限性、确定性和输入/输出。

3.算法的正确性:算法必须能够解决问题,并得到正确的答案。

4.算法的效率:算法的时间复杂度和空间复杂度是衡量算法效率的重要指标。

二、常用算法1.排序算法:常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。

需要了解每种排序算法的思想、时间复杂度和空间复杂度,并能够对其进行实现和优化。

2.查找算法:常用的查找算法包括顺序查找、二分查找、哈希查找等。

需要了解每种查找算法的思想和时间复杂度,并能够对其进行实现和应用。

3. 图算法:图算法包括深度优先(DFS)、广度优先(BFS)、最短路径算法(Dijkstra算法、Floyd算法)等。

需要了解这些算法的思想、时间复杂度和应用场景,并能够对其进行实现和应用。

4.动态规划算法:动态规划算法适用于具有重叠子问题和具有最优子结构性质的问题。

需要了解动态规划算法的基本思想、时间复杂度和应用场景,并能够对具体问题进行动态规划的设计和实现。

5.贪心算法:贪心算法常用于解决最优化问题,每一步都选择当前最优解,以期最终达到全局最优解。

需要了解贪心算法的基本思想、时间复杂度和应用场景,并能够对具体问题进行贪心算法的设计和实现。

三、算法的时间复杂度和空间复杂度1. 时间复杂度:算法的时间复杂度表示算法的执行时间和输入数据规模之间的关系。

常见的时间复杂度有O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)等。

需要掌握各种时间复杂度的计算方法和复杂度的比较。

2.空间复杂度:算法的空间复杂度表示算法的内存消耗和输入数据规模之间的关系。

算法设计与分析考试重点归纳

算法设计与分析考试重点归纳

算法设计考试重点整理题型:一选择题(10*2=20 分)二简答题(4*5=20 分)三应用题(3*10=30 分)四算法题(3*10=30 分)第一、二章算法的定义:解某一特定问题的一组有穷规则的集合(对特定问题求解步骤的一种描述,是指令的有限序列)算法的特征:1)有限性 2)确定性 3)输入 4)输出 5)能行性算法分析的目的:基本数据结构:线性结构(元素之间是一对一的关系)用顺序存储结构存储的线性表称为顺序表用链式存储结构存储的线性表称为链表。

树形结构(元素之间是一对多的关系)图(网)状结构(元素之间是多对多的关系)栈:是一种只允许在表的一端进行插入或删除操作的线性表。

允许进行插入、删除操作的一端称为栈顶,另一端称为栈底。

当栈中没有数据元素时,称之为空栈。

栈的插入操作称为进压栈,删除操作称为出栈。

队列:只允许在一端进行插入操作,在另一端进行删除操作的线性表。

允许进行插入操作的一端称为队尾。

允许进行删除操作的一端称为队头。

当队列中没有数据元素时,称之为空队列。

队列的插入操作称为进队或入队。

队列的删除操作称为退队或出队。

树:树型结构是一种非线性结构,它用于描述数据元素之间的层次关系图图:G=(V,E)是一个二元组其中:V是图G中数据元素(顶点)的非空有限集集合E是图G中关系的有限集合由表达式求渐进表达式:例:(n2+n)/4 n2/4(增长速率最快的那一项)时间复杂度的计算:(P23)性能的比较:O(1) < O(log2n) < O(n) < O(nlog2n) =O(nlogn)< O(n2) < O(n3) < O(n k) < O(2n)第三章算法思想、稳定性、时间复杂度、应用、排序的移动次数:希尔排序(数据结构P265):先将待排序列分割为若干个子序列分别进行直接插入排序;待整个序列基本有序时,再对全体记录进行一次直接插入排序。

也称缩小增量的直接插入排序。

算法设计与分析复习要点

算法设计与分析复习要点

算法设计与分析的复习要点第一章:算法问题求解基础算法是对特定问题求解步骤的一种描述,它是指令的有限序列。

一.算法的五个特征:1.输入:算法有零个或多个输入量;2.输出:算法至少产生一个输出量;3.确定性:算法的每一条指令都有确切的定义,没有二义性;4.可行性:算法的每一条指令必须足够基本,它们可以通过已经实现的基本运算执行有限次来实现;5.有穷性:算法必须总能在执行有限步之后终止。

二.什么是算法?程序与算法的区别1.笼统地说,算法是求解一类问题的任意一种特殊的方法;较严格地说,算法是对特定问题求解步骤的一种描述,它是指令的有限序列。

2.程序是算法用某种程序设计语言的具体实现;算法必须可终止,程序却没有这一限制;即:程序可以不满足算法的第5个性质“有穷性”。

三.一个问题求解过程包括:理解问题、设计方案、实现方案、回顾复查。

四.系统生命周期或软件生命周期分为:开发期:分析、设计、编码、测试;运行期:维护。

五.算法描述方法:自然语言、流程图、伪代码、程序设计语言等。

六.算法分析:是指对算法的执行时间和所需空间的估算。

算法的效率通过算法分析来确定。

七.递归定义:是一种直接或间接引用自身的定义方法。

一个合法的递归定义包括两部分:基础情况和递归部分;基础情况:以直接形式明确列举新事物的若干简单对象;递归部分:有简单或较简单对象定义新对象的条件和方法八.常见的程序正确性证明方法:1.归纳法:由基础情况和归纳步骤组成。

归纳法是证明递归算法正确性和进行算法分析的强有力工具;2.反证法。

第二章:算法分析基础一.会计算程序步的执行次数(如书中例题程序2-1,2-2,2-3的总程序步数的计算)。

二.会证明5个渐近记法。

(如书中P22-25例2-1至例2-9)三.会计算递推式的显式。

(迭代法、代换法,主方法)四.会用主定理求T(n)=aT(n/b)+f(n)。

(主定理见P29,如例2-15至例2-18)五.一个好的算法应具备的4个重要特征:1.正确性:算法的执行结果应当满足预先规定的功能和性能要求;2.简明性:算法应思路清晰、层次分明、容易理解、利于编码和调试;3.效率:算法应有效使用存储空间,并具有高的时间效率;4.最优性:算法的执行时间已达到求解该类问题所需时间的下界。

算法设计与分析复习要点

算法设计与分析复习要点

算法设计与分析复习要点一、单项选择题(本大题共15小题,每小题2分,共30分)二、填空题(本大题共15空,每空1分,共15分)三、分析题(本大题共5小题,每小题5分,共25分)四、综合题(本大题共4小题,1、2题每题6分,3题8分,4题10分,共30分)第2章,导引与基本数据结构:1、什么是算法, 算法的5个特性;对一个算法作出全面分析的两个阶段。

P245个特性:确定性、能行性、输入、输出、有穷性两个阶段:事前分析、事后测试2、O(g(n)),Ω(g(n)), (g(n))的含义。

3、多项式时间算法:可用多项式(函数)对其计算时间限界的算法。

4、常见的多项式限界函数所表示算法时间复杂度的排序:Ο(1) <Ο(logn) < Ο(n) < Ο(nlogn) < Ο(n2) < Ο(n3)5、指数时间算法:计算时间用指数函数限界的算法6、常见的指数时间限界函数:Ο(2n) < Ο(n!) < Ο(n n)11()2(1)11()21nn T n T n n T n =⎧=⎨-+>⎩⇒=-7、什么是算法的复杂性:是该算法所需要的计算机资源的多少,它包括时间和空间资源。

8、复习栈和队列、树、图的基本知识,了解二元树、完全二元树,满二元树、二分检索树、了解图的邻接矩阵和邻接表存储方法。

9、能写出图的深度优先序列和广度优先序列。

10、会求如下一些简单的函数的上界表达式: 3n 2+10n =O(n 2)第3、4章 递归与分治算法1、理解递归算法的优缺点,深刻理解递归算法的执行过程。

如能写出解决n 阶汉诺塔问题的解,并能分析写出3阶汉诺塔问题的递归执行轨迹。

2、递归算法的优点:结构清晰,可读性强,容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。

3、递归算法的缺点:运行效率较低,耗费的计算时间和占用的存储空间都多。

为了达到此目的,根据具体程序的特点对递归调用工作栈进行简化,尽量减少栈操作,压缩栈存储空间以达到节省计算时间和存储空间的目的。

算法设计与分析期末备考知识点总结

算法设计与分析期末备考知识点总结

算法设计与分析期末备考知识点总结●通俗地说,算法是解决咨询题的办法,严格地讲,算法是对特定咨询题求解步骤的一种描述,是指令的有限序列。

●算法还必须满脚一下五个重要特性:输入、输出、有穷性、确定性、可行性。

●程序(Program)是对一具算法使用某种程序设计语言的具体实现,原则上,算法能够用任何一种程序设计语言来实现。

啥是算法的计算复杂性?●算法分析指的是对算法所需要的两种计算机资源——时刻和空间(时刻复杂性和空间复杂性举行估算,所需要的资源越多,该算法的复杂性就越高。

●表示计算复杂性的O你掌握了?若存在两个正的常数c和n0,关于任意n≥n0,都有T(n)≤c×f(n),则称T(n)=O(f(n))(或称算法在O(f(n))中)。

我们要紧介绍了哪几种算法设计办法?分治法:将一具难以直截了当解决的大咨询题,分割成一些规模较小的子咨询题,以便各个击破,分而治之。

减治法:减治法在将原咨询题分解为若干个子咨询题后,利用了规模为n 的原咨询题的解与较小规模(通常是n/2)的子咨询题的解之间的关系,这种关系通常表现为:(1)原咨询题的解只存在于其中一具较小规模的子咨询题中;(2)原咨询题的解与其中一具较小规模的解之间存在某种对应关系。

由于原咨询题的解与较小规模的子咨询题的解之间存在这种关系,因此,只需求解其中一具较小规模的子咨询题就能够得到原咨询题的解。

动态规划法、贪心算法、回溯算法、概率RAM程序分治法------合并排序设算法4.3对n个元素排序的时刻复杂性为T(n),则该二路归并排序算法存在如下递推式:二路归并排序的时刻代价是O(nlog2n)。

所需空间只要O(m+n+min(m, n))的空间就够了(假设两个合并串的长度分不为m和n)。

分治法------快速排序在最好事情下在具有n个记录的序列中,一次划分需要对整个待划分序列扫描一遍,则所需时刻为O(n)。

时刻复杂度为O(nlog2n)。

在最坏事情下必须通过n-1次递归调用才干把所有记录定位,而且第i趟划分需要通过n-i 次关键码的比较才干找到第i个记录的基准位置,所以,总的比较次数为:时刻复杂度为O(n2)分治法------最大子段递推式:算法时刻复杂度:O(nlog2n)分治法------棋盘覆盖咨询题T(k)满脚如下递推式:分治法------循环赛日安排咨询题基本语句的执行次数是:算法的其时刻复杂性为O(4k)。

算法设计与分析考点精讲串烧

算法设计与分析考点精讲串烧

一、选择题(每小题3分,共15分)1.算法与程序的主要区别在于算法具有()。

A.能行性 B.确定性 C.有限性 D.输入和输出答案:C。

2.对一个有序序列,以比较为基础的搜索算法的最坏情况时间复杂性的下界为()。

A.Ω(n) B.Ω(n2) C.Ω(n log n) D.Ω(log n)答案:D。

3.背包问题:n=6,C=10,V(1:6)=(15,59,21,30,60,5),W(1:6)=(1,5,2,3,6,1)。

该问题的最大价值为()。

A.101 B.110 C.115 D.120答案:C。

4.矩阵连乘积问题:M1(5×10), M2(10×4), M3(4×6)。

矩阵链乘M1M2M3需要的最少乘法次数为()。

A.348 B.328 C.720 D.320答案:D。

5.用贪心策略设计算法的关键是()。

A.将问题分解为多个子问题来分别处理 B.选好贪心策略C.获取各阶段间的递推关系式 D.满足最优性原理答案:B。

二、填空题(每小题4分,共20分)1.某算法的计算时间T(n)满足递归关系式:T(n)=2T(n-1)+O(1),n>1;T(1)=1。

则T(n)= 。

答案:2n-1。

2.用方法对状态空间树进行搜索时,每个结点有可能多次成为扩展结点。

3.子集和数问题一般陈述如下:已知n+1个正数:w i(1≤i≤n)和M,要求找出w i的和数是M 的所有子集。

其解可以表示为n-元组(x1, x2,⋯, x n),这里x i∈{0,1},1≤i≤n。

如果没有选择w i,则相应的x i=0;如果选择了w i,则x i=1。

此解空间的空间树上有个叶结点,共有个结点。

答案:2n,2n+1-1。

4.已知将两个分别包含n个和m个记录的已分类文件归并在一起得到一个分类文件需作n+m 次记录移动。

现有五个已分类文件F1,F2,F3,F4,F5,它们的记录个数分别为25,40,15,10,40,将这五个文件归并成一个分类文件需作次记录移动。

算法分析与设计考前复习重点

算法分析与设计考前复习重点
动态规划法与分治法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。
分治法中的各个子问题是独立的(即不包含公共的子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。不足之处:如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。
程序是算法用某种程序设计语言的具体实现。
程序可以不满足算法的性质(4)有限性。
2算法分析是对算法所需要的两种计算机资源——时间和空间进行估算。
3何谓递归?构成递归需具备的2个条件(要素)。
递归(recursion)是数学与计算机科学中的基本概念。直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。
动态规划法通常以自底向上的方式求解各个子问题,而贪心法则通常以自顶向下的方式做出一系列的贪心选择。
10、什么是最优子结构性质?动态规划法如何利用问题的最优子结构性质求解问题的最优解?(利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。)
该问题可以分解为若干个规模较小的相同问题,即该问题具有结构自相似性质
利用该问题分解出的子问题的解可以合并为该问题的解;
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
6、求解背包问题和0/1背包问题的约束条件有什么不同?
7、动态规划法和分治法之间有什么共同点?有什么不同点?
动态规划的实质是分治思想和解决冗余
(1)最近邻点策略:从任意城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。
最近顶点策略:任选一个顶点,并以此建立起生成树,每一步的贪心选择是简单地把不在生成树中的最近顶点添加到生成树中。

算法设计与分析 复习整理汇编

算法设计与分析 复习整理汇编

《算法设计与分析》复习要点2.算法的概念:答:算法是求解一类问题的任意一种特殊的方法。

一个算法是对特定问题求解步骤的一种描述,它是指令的有限序列。

注:算法三要素:1、操作2、控制结构3、数据结构3.算法有5大特性:答:输入、输出、确定性、能行性、有穷性。

注:输入:一个算法有0个或多个输入;输出:一个算法将产生一个或多个输出。

确定性:一个算法中每一步运算的含义必须是确切的、无二义性的;可行性:一个算法中要执行的运算都是相当基本的操作,能在有限的时间内完成;有穷性:一个算法必须在执行了有穷步运算之后终止;4.算法按计算时间可分为两类:答:多项式时间算法的渐进时间复杂度:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3),具有此特征的问题称为P为题。

有效算法。

指数时间算法的渐进时间复杂度之间的关系为:O(2^n)<O(n!)< O(n^n),具有此特征的问题称为NP问题。

注:可以带1或2这些数字来判断它们之间的大小关系。

5.一个好算法的4大特性:答:正确性、简明性、效率、最优性。

注:正确性:算法的执行结果应当满足预先规定的功能和性能要求。

简明性:算法应思路清晰、层次分明、容易理解。

利于编码和调试。

效率:时间代价和空间代价应该尽可能的小。

最优性:算法的执行时间已经到求解该类问题所需要时间的下界。

6.影响程序运行时间的因素:1、答:程序所以来的算法。

问题规模和输入数据。

计算机系统系能。

注:算法运行的时间代价的度量不应依赖于算法运行的软件平台,算法运行的软件包括操作系统和采用的编程语言及其编译系统。

时间代价用执行基本操作(即关键操作)的次数来度量,这是进行算法分析的基础。

7.关键操作的概念答:指算法运行中起主要作用且花费最多时间的操作。

1.简述分治法是怎样的一种算法设计策略:答:将一个问题分解为若干个规模较小的子问题,且这些子问题互相独立且与原问题类型相同,递归地处理这些子问题,直到这些子问题的规模小到可以直接求解,然后将各个子问题的解合并得到原问题的解。

算法设计与分析复习知识点

算法设计与分析复习知识点

算法设计与分析复习知识点算法设计与分析是计算机科学中的重要概念,它涉及到各种问题的解决方法和效率分析。

在本文中,我将回顾一些算法设计与分析的核心知识点。

一、算法的基本概念1. 算法的定义:算法是一系列明确指定的步骤,用于解决特定问题或执行特定任务。

2. 算法的特性:输入、输出、确定性、可行性和有穷性。

3. 算法的效率:时间复杂度和空间复杂度是衡量算法效率的两个重要指标。

4. 算法的分类:常见的算法分类有分治法、贪心法、动态规划、回溯法等。

二、时间复杂度和空间复杂度1. 时间复杂度:描述算法的时间耗费,通常使用大O符号表示。

常见的时间复杂度有O(1)、O(log n)、O(n)、O(n log n)、O(n^2)等。

2. 空间复杂度:描述算法在执行过程中所需的额外空间,也使用大O符号表示。

常见的空间复杂度有O(1)、O(n)、O(n^2)等。

三、常见的算法思想和技巧1. 分治法:将一个大问题划分成若干个小问题,然后逐个解决,并将结果合并得到最终解。

2. 贪心法:在每一步选择中都采取当前状态下最好或最优的选择,从而希望能得到全局最优解。

3. 动态规划:将一个大问题分解成若干个子问题,通过求解子问题得到最优解,从而得到原问题的解。

4. 回溯法:通过不断地尝试所有可能的选择,然后进行回溯,找到问题的解。

四、常见算法的应用1. 排序算法:快速排序、归并排序、插入排序等。

2. 搜索算法:深度优先搜索、广度优先搜索、A*算法等。

3. 图算法:最短路径算法、最小生成树算法、拓扑排序等。

4. 字符串匹配算法:暴力匹配算法、KMP算法、Boyer-Moore算法等。

五、算法复杂度分析1. 最优复杂度:最好情况下算法执行所需的最小资源。

2. 平均复杂度:在所有输入情况下算法执行所需的资源的平均值。

3. 最坏复杂度:最坏情况下算法执行所需的最大资源。

六、常见问题和优化技巧1. 递归算法的优化:尾递归优化、记忆化搜索等。

计算机算法设计与分析-期末考试复习资料

计算机算法设计与分析-期末考试复习资料

一、算法设计实例1、快速排序(分治法)int partition(float a[],int p,int r) {int i=p,j=r+1;float x=a[p];while(1){while(a[++i]<x);while(a[--j]<x);if(i>=j)break;swap(a[i],a[j]);}a[p]=a[j];a[j]=x;return j;}void Quicksort(float a[],int p,int r){//快速排序if(p<r){int q=partition(a,p,r);Quicksort(a,p,q-1);Quicksort(a,p+1,r);}}2、归并排序(分治法)void mergesort(Type a[],int left,int right) {if(left<rigth){int mid=(left+right)/2;//取中点mergesort(a,left,mid);mergesort(a,mid+1,right);mergesort(a,b,left,right);//合并到数组bmergesort(a,b,left,right);//复制到数组a}}3、背包问题(贪心算法)void knapsack(int n,float m,float v[],float w[],float x[]) {sort(n,v,w)//非递增排序int i;for(i=1;i<=n;i++)x[i]=0;float c=m;for(i=1;i<=n;i++){if(w[i]>c)break;x[i]=1;c-=w[i];}if(i<=n)x[i]=c/w[i];}4、活动安排问题(贪心算法)void Greadyselector(int n,Type s[],Type f[],bool A[]) {//s[i]为活动结束时间,f[j]为j活动开始时间A[i]=true;int j=1;for(i=2;i<=n;i++){if(s[i]>=f[j]){A[i]=true;j=i;}elseA[i]=false;}}5、喷水装置问题(贪心算法)void knansack(int w,int d,float r[],int n){//w为草坪长度d为草坪宽度r[]为喷水装置的喷水半径,//n为n种喷水装置,喷水装置的喷水半径>=d/2sort(r[],n);//降序排序count=0;//记录装置数for(i=1;i<=n;i++)x[i]=0;//初始时,所有喷水装置没有安装x[i]=0for(i=1;w>=0;i++){x[i]=1;count++;w=w-2*sqart(r[i]*r[i]-1);}count<<装置数:<<count<<end1;for(i=1;i<=n;i++)count<<喷水装置半径:<<r[i]<<end1;}6、最优服务问题(贪心算法)double greedy(rector<int>x,int s){rector<int>st(s+1,0);rector<int>su(s+1,0);int n=x.size();//st[]是服务数组,st[j]为第j个队列上的某一个顾客的等待时间//su[]是求和数组,su[j]为第j个队列上所有顾客的等待时间sort(x.begin(),x.end());//每个顾客所需要的服务时间升序排列int i=0,j=0;while(i<n){st[j]+=x[i];//x[i]=x.begin-x.endsu[j]+=st[j];i++;j++;if(j==s)j=0;}double t=0;for(i=0;i<s;i++)t+=su[i];t/=n;return t;}7、石子合并问题(贪心算法)float bebig(int A[],int n) {m=n;sort(A,m);//升序while(m>1){for(i=3;i<=m;i++)if(p<A[i])break;elseA[i-2]=A[i];for(A[i-2]=p;i<=m;i++){A[i-1]=A[i];m--;}}count<<A[1]<<end1}8、石子合并问题(动态规划算法)best[i][j]表示i-j合并化最优值sum[i][j]表示第i个石子到第j个石子的总数量|0f(i,j)=||min{f(i,k)+f(k+1,j)}+sum(i,j)int sum[maxm]int best[maxm][maxn];int n,stme[maxn];int getbest();{//初始化,没有合并for(int i=0;i<n;i++)best[i][j]=0;//还需要进行合并for(int r=1;r<n;r++){for(i=0;i<n-r;i++){int j=i+v;best[i][j]=INT-MAX;int add=sum[j]-(i>0!sum[i-1]:0);//中间断开位置,取最优值for(int k=i;k<j;++k){best[i][j]=min(best[i][j],best[i][k]+best[k+1][j])+add;}}}return best[0][n-1];}9、最小重量机器设计问题(回溯法)typedef struct Qnode{float wei;//重量float val;//价格int ceng;//层次int no;//供应商struct Qnode*Parent;//双亲指针}Qnode;float wei[n+1][m+1]=;float val[n+1][m+1]=;void backstack(Qnode*p){if(p->ceng==n+1){if(bestw>p->wei){testw=p->wei;best=p;}}else{for(i=1;i<=m;i++)k=p->ceng;vt=p->val+val[k][i];wt=p->wei+wei[k][i];if(vt<=d&&wt<=bestw){s=new Qnode;s->val=vt;s->wei=wt;s->ceng=k+1;s->no=1;s->parent=p;backstrack(S);}}}10、最小重量机器设计问题(分支限界法)typedef struct Qnode{float wei;//重量float val;//价格int ceng;//层次int no;//供应商struct Qnode*Parent;//双亲指针}Qnode;float wei[n+1][m+1]=;float val[n+1][m+1]=;void minloading(){float wt=0;float vt=0;float bestw=Max;//最小重量Qnode*best;s=new Qnode;s->wei=0;s->val=0;s->ceng=1;s->no=0;s->parent=null;Iinit_Queue(Q); EnQueue(Q,S);do{p=OutQueue(Q);//出队if(p->ceng==n+1){if(bestw>p->wei){bestw=p->wei;best=p;}}else{for(i=1;i<=m;i++){k=p->ceng;vt=p->val+val[k][i];wt=p->wei+wei[k][i];if(vt<=d&&wt<=bestw){s=new Qnode;s->ceng=k+1;s->wt=wt;s->val=val;s->no=i;s->parent=p;EnQueue(Q,S);}}}}while(!empty(Q));p=best;while(p->parent){count<<部件:<<p->ceng-1<<end1;count<<供应商:<<p->no<<end1;p=p->parent;}}11、快速排序(随机化算法—舍伍德算法)int partion(int a[],int l,int r){key=a[l];int i=l,j=r;while(1){while(a[++i]<key&&i<=r);while(a[--j]>key&&j>=l);if(i>=j)break;if(a[i]!=a[j])swap(a[i],a[j]);}if((j!=l)&&a[l]!=a[j])swap(a[l],a[j]);return j;}int Ranpartion(int a[],int l,int r) {k=rand()%(r-1+l)+1;swap(a[k],a[l]);int ans=partion(a,l,r);return ans;}int Quick_sort(int a[],int l,int r,int k){int p=Randpartion(a,l,r);if(p==k)return a[k];else if(k<p)return Quick_sort(a,l,p-1,k);else{int j=0;for(int i=p+1;i<=r;i++)b[j++]=a[i]return Quick_sort(b,1,j,k-p);}}12、线性选择(随机化算法—舍伍德算法)二、简答题1.分治法的基本思想分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。

《算法设计与分析》复习提纲

《算法设计与分析》复习提纲

《算法设计与分析》复习提纲2021.1.4 1 引言(ch1)1.什么是算法及其特征2.问题实例和问题规模2 算法初步(ch2)1.插入排序算法2.算法复杂性及其度量(1)时间复杂性和空间复杂性;(2)最坏、最好和平均情形复杂性;3.插入排序的最坏、最好和平均时间4.归并排序算法及其时间复杂性3函数增长率(ch3)1.渐近记号O、Ω、θ的定义及其使用2.标准复杂性函数及其大小关系3.和式界的证明方法4 递归关系式(ch4,Sch1)1.替换法(1)猜测解 数学归纳法证明;(2)变量变换法;2.迭代法(1)展开法;(2)递归树法;3.主定理4.补充1:递归与分治法(sch1)- 递归设计技术- 递归程序的非递归化- 算法设计(1)Fibonacci数;(2)生成全排列;(3)二分查找;(4)大整数乘法;(5)Stranssen矩阵乘法;(6)导线和开关(略);5 堆排序(ch6)1堆的概念和存储结构2.堆的性质和种类3.堆的操作:建堆;整堆;4.堆排序算法和时间复杂性5.优先队列及其维护操作6 快速排序(ch7)1.快速排序算法及其最好、最坏时间和平均时间2.随机快速排序算法及其期望时间3.Partition算法7 线性时间排序(ch8)1.基于比较的排序算法下界:Ω(nlogn)2.计数排序适应的排序对象、算法和时间3.基数排序适应的排序对象、算法和时间4.桶排序适应的排序对象、算法和时间8 中位数和顺序统计(ch9)1.最大和最小值的求解方法2.期望时间为线性的选择算法3.最坏时间为线性的选择算法及其时间分析9 红黑树(ch13)1.红黑树的定义和节点结构2.黑高概念3.一棵n个内点的红黑树的高度至多是2log(n+1)4.左旋算法5.插入算法的时间、至多使用2次旋转6.删除算法的时间、至多使用3次旋转10 数据结构的扩张(ch14)1.动态顺序统计:扩展红黑树,支持①选择问题(给定Rank求相应的元素),②Rank问题(求元素x在集合中的Rank)(1)节点结构的扩展;(2)选择问题的算法;(3)Rank问题的算法;(4)维护树的成本分析;2.如何扩张一个数据结构:扩张的步骤;扩张红黑树的定理(略);3.区间树的扩张和查找算法11 动态规划(ch15)1.方法的基本思想和基本步骤2.动态规划和分治法求解问题的区别3.最优性原理及其问题满足最优性原理的证明方法4.算法设计(1)多段图规划;(2)矩阵链乘法;(3)最大子段和;(4)最长公共子序列;12 贪心算法(ch16)1.方法的基本思想和基本步骤2.贪心算法的正确性保证:满足贪心选择性质3.贪心算法与动态规划的比较4.两种背包问题的最优性分析:最优子结构性质和贪心选择性质5.算法设计(1)小数背包;(2)活动安排;(3)找钱问题;13 回溯法(sch2)1.方法的基本思想和基本步骤2.回溯法是一种深度遍历的搜索3.术语: 三种搜索空间, 活结点, 死结点, 扩展结点, 开始结点, 终端结点4.两种解空间树和相应的算法框架5.算法设计(1)图和树的遍历;(2)n后问题;(3)0-1背包;(4)排列生成问题;(5)TSP问题;14 平摊分析(ch17)1.平摊分析方法的作用和三种平摊分析方法各自特点2.聚集分析法及应用3.记账分析法及应用4.势能法及应用15 二项堆(ch19 in textbook version 2)1.为什么需要二项堆?二项堆和二叉堆上的几个基本操作时间复杂性2.二项堆定义和存储结构3.二项堆上合并操作及过程4.二项堆应用(尤其是在哪些图论算法上有应用)16 不相交集数据结构(ch21)1.不相交数据集概念2.两种实现方式:链表表示和森林表示3.两种表示具体实现和其上操作的时间复杂性4.不相交集数据结构应用(尤其是在哪些图论算法上有应用)17 图论算法(ch22-ch25)1.BFS和DFS算法- 白色、灰色和黑色结点概念和作用- 计算过程及其时间复杂度2.最小生成树- 安全边概念和一般算法(Generic algorithm)- Kruskal算法和Prim算法的计算过程和计算复杂性- 两种贪心算法的贪心策略和贪心选择性质3.单源最短路径(略)- 单源最短路径δ(s, v)和短路径上界d[v]概念- 边松弛技术及其一些性质- 三种问题算法的计算过程及其时间复杂度:Bellman-Ford算法、DAG算法和Dijkstra算法4. 所有点对最短路径(略)- 为什么能转换为矩阵乘法?- 基于矩阵乘法的较慢和快速算法的时间复杂度- Floyd-Warshall Algorithm的思路和时间复杂度- Johnson Algorithm适应的问题及其时间复杂度(略)18 数论算法(ch31)1.gcd(a, b)及其表示成a, b线性组合方法2.Euclid’s Alg.的运行时间3.线性模方程的求解方法4.中国余数定理及其相应线性同余方程组的求解5.RSA算法过程及正确性基础6.简单素数测试算法和伪素数测试算法7.MR算法的改进措施和算法复杂性19 串匹配(ch32)1.朴素的串匹配算法及其时间复杂度2.Rabin-Karp串匹配算法及其时间复杂度3.有限自动机串匹配算法及其及其时间复杂度4.KMP串匹配算法及其时间复杂度20 模型和NPC(ch34)1.算法的严格定义2.几种计算模型的语言识别能力3.两类图灵机模型4.P问题、NP问题和NP完全问题的定义及P归约。

算法设计与分析考试重点归纳

算法设计与分析考试重点归纳

算法设计考试重点整理题型:一选择题(10*2=20 分)二简答题(4*5=20分)三应用题(3*10=30 分)四算法题(3*10=30 分)第一、二章算法的定义:解某一特定问题的一组有穷规则的集合(对特定问题求解步骤的一种描述,就是指令的有限序列)算法的特征:1)有限性2)确定性3)输入4)输出5)能行性算法分析的目的:基本数据结构:线性结构(元素之间就是一对一的关系)用顺序存储结构存储的线性表称为顺序表用链式存储结构存储的线性表称为链表。

树形结构(元素之间就是一对多的关系)图(网)状结构(元素之间就是多对多的关系)栈:就是一种只允许在表的一端进行插入或删除操作的线性表。

允许进行插入、删除操作的一端称为栈顶,另一端称为栈底。

当栈中没有数据元素时,称之为空栈。

栈的插入操作称为进压栈,删除操作称为出栈。

队列:只允许在一端进行插入操作,在另一端进行删除操作的线性表。

允许进行插入操作的一端称为队尾。

允许进行删除操作的一端称为队头。

当队列中没有数据元素时,称之为空队列。

队列的插入操作称为进队或入队。

队列的删除操作称为退队或出队。

树:树型结构就是一种非线性结构,它用于描述数据元素之间的层次关系图图:G=(V,E)就是一个二元组其中:V就是图G中数据元素(顶点)的非空有限集集合E就是图G中关系的有限集合由表达式求渐进表达式:例:(n2+n)/4 n2/4(增长速率最快的那一项)时间复杂度的计算:(P23)性能的比较:O(1) <O(log2n)< O(n) <O(nlog2n) =O(nlogn)< O(n2) < O(n3) <O(n k) <O(2n)第三章算法思想、稳定性、时间复杂度、应用、排序的移动次数:希尔排序(数据结构P265):先将待排序列分割为若干个子序列分别进行直接插入排序;待整个序列基本有序时,再对全体记录进行一次直接插入排序。

也称缩小增量的直接插入排序。

《算法设计与分析》复习要点

《算法设计与分析》复习要点

《算法设计与分析》复习要点1、算法的概念,以及算法的5大特征;( P3)2、算法的复杂度分析(P17)一个好算法的4大特性。

影响程序运行时间的因素。

(P18)关键操作的概念。

(P23)常见时间复杂度的大小关系。

(P25)简单程序片段的时间复杂度计算。

(P32习题2-8)3、分治法的基本思想(P73)利用分治算法求解:①、大整数相乘(P101);②、循环体育比赛日程表制订;③、最近点对问题(习题5-21);4、贪心法的基本思想(P102)贪心法的两个特性(P131)利用贪心法求解:①、最小代价生成树(P117);②、单源最短路径(P124);③、背包问题(习题6-1);5、动态规划法的基本思想(P135)设计一个动态规划算法的4个基本步骤(P136)利用动态规划法求解:①、多段图问题(P137);②、矩阵连乘问题(P146);6、回溯法的基本思想(P175)状态空间树的概念(P176)利用回溯法求解:①、n皇后问题(P181);②、0/1背包问题(P191);③、连续邮资问题(习题8-14);④、多机作业调度问题(习题8-15);7、分枝限界法的基本思想(P199)①、FIFO分枝限界法;②、LIFO分枝限界法;③、LC分枝限界法。

课程中涉及到基本概念:1、什么是算法?算法是求解一类问题的人以一种特殊的方法。

一个算法是对特定问题求解步骤的一种描述,它是指令的有限序列。

2、算法有那些特性?输入、输出、确定性、能行性、有穷性。

3、评估一个算法的指标有那些(或者说分析一个算法的优劣主要考虑的因素)?正确性、简明性、效率、最优性。

4、算法运行的时间代价的度量不应依赖于算法运行的软件平台,算法运行的软件包括操作系统和采用的编程语言及其编译系统。

时间代价用执行基本操作(即关键操作)的次数来度量,这是进行算法分析的基础。

5、基本操作(即关键操作)是指算法运行中起主要作用且花费最多时间的操作。

6、基本操作是个概念,无法具体定义。

算法分析与设计复习资料

算法分析与设计复习资料
答1递归算法:直接或间接地调用自身的算法
2递归函数:用函数自身给出定义的函数。
3递归函数的二要素是什么
答1边界条件2递归方程
4分治法的设计思想是什么
答将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题
相同。
选择来达到。
11贪心算法与动态规划算法的的相同点和不同之处
答同贪心算法和动态规划算法都要求问题具有最优子结构性质
异贪心具有贪心选择性质这是贪心算法可行的第一个基本要素也是贪心算法与动
态规划算法的主要区别。
12背包问题与01背包问题有何区别
7动态规划算法的基本要素是什么举例说明一些可以用动态规划算法解决的问题。
答1最优子结构性质和子问题重叠性质是动态规划算法的基本要素
2矩阵连乘问题建立递归关系求最优解0-1背包问题等
8说明分治法与动态规划法的相同点和不同之处
答同基本思想都是将待求解问题分解成若干个子问题先求解子问题然后从这些子问题
O(f+g)
3OfOg=Ofg;
☆4如果g(N)=O(f(N)),则O(f)+O(g)=O(f);
5OCf(N)=O(f(N)),其中C是一个正的常数
6f=O(f) 三、动态规划知识点——流水作业调度 问题: n个作业{12…n}要在由2台机器M1和M2组成的流水线上完成加工,其中机
器M2要等时间t后才可利用。可表示为T(N,t)。每个作业加工的顺序都是先在M1上加工
然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。流水作业调度问题要求
另一个定义是可以在多项式的时间里猜出一个解的问题。
21什么是NP完全问题

算法设计与分析复习重点

算法设计与分析复习重点

0/1背包问题:给定n 个重量为{w 1,w 2,...,w n }、价值为{v 1,v 2,...,v n }的物品和一个容量为C 的背包,应选择哪些物品装入背包,才能使装入背包的物品价值最高? 蛮力法:给出所有子集,计算子集的总重量和总价值,进行比较。

动态规划法:证明0/1背包问题,满足最优性原理,分支限界法:用贪心法求得背包问题的下界,再求得上界:将背包中剩余容量全部装入第i+1个物品,并可以将背包装满,限界函数:ub=v+(W-w)*(v i+1/w i+1)。

总结:1.剪枝函数给出每个可行结点相应的子树可能获得的最大价值的上界。

2.如这个上界不会比当前最优值更大,则可以剪去相应的子树。

3.也可将上界函数确定的每个结点的上界值作为优先级,以该优先级的非增序抽取当前扩展结点。

由此可快速获得最优解。

贪心法:选择单位重量价值最大的物品。

哈密顿回路问题:共有n 个城市,要求从一个城市出发,经过每个城市恰好一次,最后回到出发城市。

蛮力法:对于给定的无向图G=(V ,E ),依次考察图中所有顶点的全排列,满足以下条件的全排列(v i1,v i2,...,v in )构成的回路就是哈密顿回路:(1)相邻顶点之间存在边,即(v ij ,v ij+1)∈E (1≤j ≤n-1)(2)最后一个顶点和第一个顶点之间存在边,即(v in ,v i1)∈E回溯法:假定图G=(V ,E )的顶点集为V={1,2,…,n },则哈密顿回路的可能解表示为n 元组X=(x 1,x 2,…,x n ),其中,xi {1,2,…,n }。

根据题意,有如下约束条件:{(x i ,x i+1)∈E(1≤i ≤n −1)(x n ,x 1)∈E x i ≠x j (1≤i,j ≤n,i ≠j )首先把所有顶点的访问标志初始化为0,然后依次为每个顶点着色。

在解空间树中,如果从根结点到当前结点对应一个部分解,即满足上述约束条件,则在当前结点处选择第一棵子树继续搜索,否则,对当前子树的兄弟子树继续搜索,即为当前顶点着下一个颜色。

算法分析与设计重点知识及试题

算法分析与设计重点知识及试题

递归:直接或间接的调用自身算法称为递归算法;用函数自身给出定义的函数称为递归函数。

分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治法(divide-and-conquer)的基本思想:A分割成k个更小规模的子问题。

B对这k 个子问题分别求解。

假如子问题的规模仍旧不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很简单求出其解为止。

C将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。

设计动态规划算法的步骤(1)找出最优解的性质,并刻划其结构特征。

(2)递归地定义最优值。

(3)以自底向上的方式计算出最优值。

(4)依据计算最优值时得到的信息,构造最优解。

最优子结构性质:矩阵连乘计算次序问题的最优解包含着其子问题的最优解。

递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。

这种性质称为子问题的重叠性质贪心算法: 贪心算法总是作出在当前看来最好的选择,它并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

活动支配问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。

贪心算法:贪心算法求解的这类问题一般具有2个重要的性质:贪心选择性质和最优子结构性质。

贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质贪心算法及动态规划算法的差异:贪心算法和动态规划算法都要求问题具有最优子结构性质,这是2类算法的一个共同点。

动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。

0-1背包问题:给定n种物品和一个背包。

物品i的重量是Wi,其价值为Vi,背包的容量为C。

算法分析与设计--复习要点

算法分析与设计--复习要点

期末考试题型:1 判断题(10题,10分)2 填空题(5题,10分)3 简答题(4题,20分)4 应用题(5题,60分)期末考试复习要点:1 基本概念算法:有限条指令的序列,确定了解决某个问题的运算或操作顺序(了解概念)算法的时间复杂度(了解概念)函数渐进的界O ΩΘo ω有关函数渐进的界的定理(定理1、定理2)(记住、理解)主定理(会使用主定理求解递推方程)分治法相关:分治策略:适用条件:算法的设计步骤:时间复杂度:列出关于时间复杂度函数的递推方程和初值,求解递推方程提高分治算法效率的途径:动态规划算法相关:分治策略:适用条件:算法的设计步骤:时间复杂度:(备忘录的计算工作量)贪心法:贪心法:适用条件:算法的设计步骤:贪心法正确性的证明(第一归纳法、第二归纳法)回溯与分支界限:解空间:回溯算法:分支限界算法:代价函数:界函数:多米诺性质:NP完全性问题:P问题、NP问题、NP hard问题、NPC问题2 几个重要的算法二分检索红黑树插入排序二分归并排序:快速排序堆排序PrimKruskalBellman-FordFloyd-WarshallDijkstra3 几个重要的问题背包问题选最大最小问题第K小问题最长公共子序列问题最优二叉检索树矩阵链乘法问题活动选择问题Huffman编码最小生成树连续邮资问题4 求解递推方程(公式法、迭代法、递归树、主定理):T (n )=T (n −1)+n 2T (n )=9T (n 3)+n T (n )=T (n 2)+T (n 4)+cn c 是常数 T (n )=3T (n −1)+lg3nT (n )=5T (n 2)+(nlgn )2 T (n )=2T (n 2)+n 2lgn T (n )=T (n −1)+1nT (n )=2T (n 3)+nlgn T (n )=3T (n 5)+lg 2n T (n )=T (n 2)+2n T (n )=T(√n)+θ(lglgn )T (n )=10T (n 3)+17n 1.2 T (n )=7T (n 2)+n 3 T (n )=T (n 2+√n)+√6046 T (n )=T (n −2)+lgnT (n )=T (n 5)+T (4n 5)+θ(n ) T (n )=√nT(√n)+100n。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计考试重点整理题型:一选择题(10*2=20 分)二简答题(4*5=20 分)三应用题(3*10=30 分)四算法题(3*10=30 分)第一、二章算法的定义:解某一特定问题的一组有穷规则的集合(对特定问题求解步骤的一种描述,是指令的有限序列)算法的特征:1)有限性 2)确定性 3)输入 4)输出 5)能行性算法分析的目的:基本数据结构:线性结构(元素之间是一对一的关系)用顺序存储结构存储的线性表称为顺序表用链式存储结构存储的线性表称为链表。

树形结构(元素之间是一对多的关系)图(网)状结构(元素之间是多对多的关系)栈:是一种只允许在表的一端进行插入或删除操作的线性表。

允许进行插入、删除操作的一端称为栈顶,另一端称为栈底。

当栈中没有数据元素时,称之为空栈。

栈的插入操作称为进压栈,删除操作称为出栈。

队列:只允许在一端进行插入操作,在另一端进行删除操作的线性表。

允许进行插入操作的一端称为队尾。

允许进行删除操作的一端称为队头。

当队列中没有数据元素时,称之为空队列。

队列的插入操作称为进队或入队。

队列的删除操作称为退队或出队。

树:树型结构是一种非线性结构,它用于描述数据元素之间的层次关系图图:G=(V,E)是一个二元组v1.0 可编辑可修改其中:V是图G中数据元素(顶点)的非空有限集集合E是图G中关系的有限集合由表达式求渐进表达式:例:(n2+n)/4 n2/4(增长速率最快的那一项)时间复杂度的计算:(P23)性能的比较:O(1) < O(log2n) < O(n) < O(nlog2n) =O(nlogn)< O(n2) < O(n3) < O(n k) < O(2n)第三章算法思想、稳定性、时间复杂度、应用、排序的移动次数:希尔排序(数据结构P265):先将待排序列分割为若干个子序列分别进行直接插入排序;待整个序列基本有序时,再对全体记录进行一次直接插入排序。

也称缩小增量的直接插入排序。

希尔排序的时间复杂度在O(nlog2n)和 O(n2)之间,大致为O合并排序(P59):设初始序列含有n个记录,则可看成n个表长为1的有序表将这n个有序表两两合并,则可得n/2个表长为2的有序表再将这n/2个有序表两两合并,则可得n/4个长为4的有序表依次重复,直到对2个表长为n/2的有序表两两合并得1个表长为n的有序表为止。

堆排序、堆调整(P62):初始时把要排序的n个数的序列看作是一棵顺序存储的二叉树(一维数组存储二叉树),调整它们的存储序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最小(或最大)的元素,这时堆的根节点的数最小(或者最大)。

然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。

依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。

基数排序(P71):不进行记录关键字的比较,借助多关键字排序的思想对单逻辑关键字进行排序。

算法时间复杂度稳定性希尔排序 O不稳定快速排序 O(nlogn)不稳定第四章(考一个算法题,课后,不在书上)算法思想:基于归纳的递归算法解规模为 n 的问题 P(n),归纳法的思想如下:1. 基础步:a1 是问题 P(1) 的解2. 归纳步:对所有的 k (1 < k < n),若a k是问题 P(k) 的解,则p(ak)是问题 P(k+1) 的解,其中p(a k)是对a k 的某种运算或处理为求问题 P(n) 的解a n,先求问题 P(n – 1) 的解a n-1再对a n-1进行p(a n-1)运算或处理,得到a n为求问题 P(n – 1) 的解a n-1,先求问题 P(n – 2) 的解a n-2再进行p(a n-2)运算或处理,得到a n-1如此等等,不断地进行递归求解,直到 P(1) 的解a1为止当得到 P(1) 的解之后,再回过头来,不断地把所得到的解进行 p 运算或处理,直到得到P(n) 的解为止分治法:对于一个规模为n的问题p(n),可以把它分解为k个规模较小的子问题,这些子问题相互独立,且结构与原来问题的结构相同。

在解这些子问题时,又对每一个问题进一步的分解,直到某个阀值n0 为止。

递归地解决这些子问题,再把各个子问题的解合并起来,就得到原来问题的解。

分治法设计的3个步骤:1)划分步:把输入的问题实例划分为 k 个子问题。

尽量使 k 个子问题的规模大致相同。

例如,k = 2,如最大最小问题取其中的一部分,而丢弃另一部分,如二叉检索问题用分治法处理的情况2)治理步:由 k 个递归调用组成3)组合步:把 k 个子问题的解组合起来算法思想、应用:快速排序(数据结构P269):把序列就地划分为两个子序列,使第一个子序列的所有元素都小于第二个子序列的所有元素,不断地进行这样的划分,最后构成 n 个子序列,每个子序列只有一个元素,这时,整个序列就是按递增顺序排序的序列了不稳定选择算法:(P125)1)选择问题:用递归方法以 O(n) 时间选取数组的中值元素、或任意的第 k 小元素的算法2)选择问题的思想方法:在递归调用的每一步,放弃固定部分的元素,对其余元素进行递归,使问题的规模以几何级数递减残缺棋盘问题(P131):把棋盘划分为四个区域,每个区域是一个2k-1×2k-1个方格的子棋盘,其中有一个是残缺子棋盘。

用一个 L 型三格板覆盖在其余三个非残缺子棋盘的交界处,把覆盖一个2k×2k 个方格的残缺棋盘,转化为覆盖4 个2k-1×2k-1 个方格的残缺子棋盘。

对每一个子棋盘继续进行这样处理,直到要覆盖的子棋盘转化为2×2个方格的残缺子棋盘为止。

这时只要用一个 L 型三格板覆盖三个非残缺方格即可。

第五章(考一个算法题)可行解:满足约束方程的向量最优解:使目标函数达极值的向量贪婪发的设计思:贪婪算法采用的是逐步构造最优解的方法。

从某个初始状态出发,根据当前局部的而不是全局的最优决策(因此所构造的可行解不一定是问题的最优解),以满足约束方程为条件、以使得目标函数的值增加最快或最慢为准则,选择一个能够最快地达到要求的输入元素(选择一旦做出,就不再更改),以便尽快地构成问题的可行解。

作出这个局部最优决策所依照的标准称为贪心准则。

贪婪发求解步骤:首先根据问题确定约束条件和贪心准则,然后根据贪心准则获得当前每一步的最优解,最终得出解向量。

贪婪法求解的问题需满足2个性质:1)贪心选择性质:指所求问题的整体最优解可以通过一系列局部最优的选择来达到2)最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

算法思想、应用:狄斯奎诺:(P146)贪心算法:Dijkstra 提出按路径长度递增的次序产生最短路径。

贪心准则:使当前已经加入的所有路径的长度之和最小。

为了符合这一准则,其中每一条单独的路径都必须具有最小的长度。

最小生成树的应用:(P151)克鲁斯卡尔,普里姆哈夫曼中的一个基本概念(P159)第六章最优性原理:无论过程的初始状态和初始决策是什么,其余决策都必须相对于初始决策所产生的状态,构成一个最优决策序列多段图的概念、应用、求最短路径有向连通赋权图 G = <V, E, W>,顶点集合 V 划分成k 个不相交的子集v i,1 i k,k ≥ 2,使得 E 中的任一边 (u, v),必有 u v i,v v i+m,m ≥ 1,称 G 为多段图。

数塔问题的应用:如图所示的一个数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的数值和最大。

算法思想、应用:0/1背包(P190)第七章(考一个算法题,一个简答题)回溯法的基本思想:在确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。

这个开始结点就成为一个活结点,同时也成为当前的扩展结点。

在当前的扩展结点处,搜索向纵深方向移至一个新结点。

这个新结点就成为一个新的活结点,并成为当前扩展结点。

如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。

换句话说,这个结点不再是一个活结点。

此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。

回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。

回溯法的求解步骤1)对所给定的问题,定义问题的解空间2)确定状态空间树的结构3)用深度优先搜索方法搜索解空间,用约束方程和目标函数的界对状态空间树进行修剪,生成搜索树,取得问题的解。

状态空间树:问题解空间的树形式表示活结点:所搜索到的结点不是叶结点,且满足约束条件和目标函数的界,其儿子结点还未全部搜索完毕扩展结点:正在搜索其儿子结点的结点,它也是一个活结点;死结点:不满足约束条件、目标函数、或其儿子结点已全部搜索完毕的结点、或者叶结点。

算法思想、判定函数,如何判定(约束方程)n后问题(P208)图的着色问题(P212)哈密尔顿回路问题(P216)简答题考算法思想之类的。

应用题考排序、以上各种算法的应用(要求写求解步骤嗯,排序只求移动次数,不求比较次数)。

算法题预测题:*1设计一个分支算法,求二叉树的高度。

int Height(BTree t){int h1,h2;if(t==NULL) return 0;else{h1=Height(t->lchild)+1;h2=Height(t->rchild)+1;return h1>h2h1:h2;}}*2 假定用面值为2角5分、1角、5分、1分的硬币,来支付n分钱。

设计一个算法,使付出的枚数最少(n由键盘输入)void solve(int p[],int x[],int n){int i;for(i=0;i<4;i++){x[i]=n/p[i];n=n%p[i];}}*3 对于给定的邮箱网G,求网中指定的顶点v到其余各顶点的最短路径。

P147 *4 n后问题(P210)5 图的着色问题(P214)6 哈密尔顿回路问题(P217)。

相关文档
最新文档