算法设计与分析要点复习
算法设计与分析重点总结
算法设计与分析重点总结考试题型:选择 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.空间复杂度:算法的空间复杂度表示算法的内存消耗和输入数据规模之间的关系。
算法分析与设计基本知识点复习
2.重叠子问题 动态规划应用于组合优化问题的第二个特征是问 题自身具有重叠子问题。 动态规划算法的运行时间取决于两个因素的乘积: 备忘录方法(64) 自顶向下的动态规划方法具有如下特点: · 它是一种对自然问题求解的机械转换。 · 方法自身可以确定计算子问题的顺序。 · 可能不需要计算出所有子问题的解。
找最大值与最小值分治算法
算法思想 如果我们将分治策略用于此问题,每次将 问题分成大致相等的两部分,分别在这两部分 中找出最大值与最小值,再将这两个子问题的 解组合成原问题的解,就可得到该问题的分治 算法。
归并排序算法(P28) 归并排序的关键操作是归并两个已排序的子序 列的过程。
归并排序最坏情况下的时间复杂度Θ(n lb n)要优 于冒泡排序最坏情况下的时间复杂度Θ(n2)。
渐近表示(P8)
渐进表示:是方便地表示算法的最坏情况下,计算的复杂度。 三个定义,三例题。 定义1.1如果存在三个正常数
第2章 分 治 法
递归(P13) 递归程序可被简单地定义为对自己的调用。 递归程序要求必须有终止条件。 斐波那契(Fibonacci)序列。 • 替换方法(P16) • 用替换方法解某个递归方程时,分为两步。首 先猜测问题解的某个界限,然后用数学归纳法证明 所猜测解的正确性。 • 主方法(P18) 主定理(三种情况,三个例题)
分治法的基本思想 (p20) 分治法在每一层递归上由三个步骤组成: (1)划分(divide):将原问题分解为若干规模较小、 相互独立、与原问题形式相同的子问题。 (2)解决(conquer):若子问题规模较小,则直接求 解;否则递归求解各子问题。 (3)合并(combine):将各子问题的解合并为原问题 的解。
循环不变式具有以下三个性质: 初始:在循环的第一次迭代之前,循环不变式为 真。 维持:如果在循环的某次迭代之前循环不变式为 真,那么在下一次迭代之前,循环不变式仍然为真。 终止:当循环终止时,循环不变式给出有用性质, 这个性质可以用于证明算法的正确性
算法设计与分析考试重点归纳
算法设计考试重点整理题型:一选择题(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.最优性:算法的执行时间已达到求解该类问题所需时间的下界。
算法设计与分析复习资料
1.什么是算法?算法是一系列解决问题的指令,对符合规范的输入,能在有限时间内获得预期的输出。
2.算法的特点?有穷性-有限步内完成;确定性-每一步是确定的,不能有二义性;可行性-每一步有意义,每一步能求解;输入-须检查输入值值域合法性;输出-输出问题的解,无输出的算法没有意义。
补:排序算法的特点:稳定性,在位性。
稳定性:如果一个排序算法保留了等值元素在输入中的相对顺序,他被称为是稳定的。
换句话说,如果一个输入列表包含两个相等的元素,他们的位置分别是i和j。
i<j。
而在排好序的列表中,他们的位置分别是i`和j`,那么i`<j`肯定成立。
在位性:如果一个算法不需要额外的存储空间(除了个别存储单元外),我们称它是在位的。
3.求最大公约数的伪码?Euclid(m,n)//计算m和n最大公约数的欧式算法//输入:两个不全为0的非负整数m>=n//输出:m和n的最大公约数while n≠0 do{r←m mod nm←nn←r}return m4.问题求解过程理解问题;了解设备性能选择计算方法,精确或近似接法高效的数据结构算法的设计技术;设计算法;正确性证明;分析算法;编程实现算法。
1-2-3-4-5-6.4-3,4-2,5-3,5-2(理解问题;决定:计算方法:精确或近似方法:数据结构:算法设计技术;设计算法;正确性证明;分析算法;根据算法写代码.)5.算法分析主要步骤(框架)算法的运行效率也称为计算复杂性(计算复杂度);计算复杂性:时间复杂性(时间效率)空间复杂性(空间效率)时间效率-算法运行所耗费的时间。
空间效率-算法运行所需的存储空间。
输入规模事实:几乎所有算法对更大规模的输入都要耗费更长的时间!即算法耗时随输入规模增大而增大;增长函数定义为输入规模的函数,用它来研究算法;输入规模的选择它的选择比较直接容易。
6.n元列表查找最大值-数组实现列表MaxElement(A[0..n-1])maxval←0for i←1 to n-1 doif A[i]>maxvalmaxval←A[i]return maxval7.检查数组元素是否唯一UniqueElement(A[0..n-1])for i←0 to n-2 dofor j←i+1 to n-1 doif A[i]=A[j] return falsereturn true8.计算方阵A B的矩阵乘积MatrixMultiplication(A[0..n-1][0..n-1],B[0..n-1][0..n-1])for i←0 to n-1 do//行循环for j←0 to n-1 do//列循环M[i][j]←0.0 //积矩阵初始化for k←0 to n-1 do//用变量k表示变化的脚标M[i][j]←M[i][j]+A[i][k]*B[k][j]return M9.计算十进制正整数n的二进制位数b算法的时间复杂性分析Binary(n)count←1while n>1 docount++n←「n/2「return count10.求m,n最大公约数gcd(int m,int n)//求m,n最大公约数的欧式递归版本//输入:两个正整数m≥n//输出:最大公约数{if(n=0)//递归出口,结束递归write(M);//输出结果elsegcd(n,m mod n);}11.选择排序(每次从数组中选取最小的按顺序插入) SelectionSort(A[1..n]){for i←1 to n-1 domin←ifor j←i+1 to n doif(A[j]<A[min])min←jA[i]↔A[min]}12.冒泡排序(相邻的比较,a<b则交换,最后一位则为最大) BubbleSort(A[1..n]{ for i←1 to n-1 dofor j←1 to n-i doif(A[j]>A[j+1])A[j]↔A[j+1]}13.顺序查找SequentialSearch(A[n..n],k){ A[n]←Ki←0while(A[i]≠k) i←i+1if(i<n)return(i)else return(-1)}14.串匹配BruteForceStringMatch(T[0..n-1],P[0..m-1]){for i←0 to n-m do{ j←0while j<m and P[j]=T[i+j] doj←j+1if i=m return i}return -1}15.最近对BruteForceCloserPoints(Object P[1..n]){ dmin←∞for i←1 to n-1 dofor j←1 to n dod←sqrt((Xi-Xj)2+(Yi-Yj)2)if(d<dmin){dmin←d,index1←i,index2←j}return(index1,index2)}16.分治算法DivideandConquer(s){if(|s|≤t)then adhocery(s)else{ divide s into smaller subset s1,s2,skfor i←1 to k do{Yi←DivideandConquer(Si)}return merge(Y1,Y2,Yk)}}17.分治法查找最大元素DivideandConquerSearchMax(S){ t←2if(|S|≤t)then return max(S1,S2)else{divide S into two smaller subset S1 and S2,|S1|=|S2|}=|S|/2 max1=DivideandConquerSearchMax(S1)max2=DivideandConquerSearchMax(S2)return max(max1,max2)}}18.合并排序之分治算法MergeSort(A[0..n-1]){ if(n>1){copy A[0..」n/2」-1]to B[0..」n/2」-1]copy A[」n/2」..n-1]to C[0..」n/2」]MergeSort(B)MergeSort(C)Merge(B,C,A)}}Merge(B[0..p-1],C[0..q-1],A[0..p+q-1]){i←0,j←0,k←0while i<p and j<q doif(B[i]≤C[j])A[k]←B[i],i←i+1else A[k]←B[j],j←j+1k←k+1if(i=p)copy C[j..q-1]to A[k..p+q-1]else copy B[j..q-1]to A[k..p+q-1]}19.快速排序QuickSort(A[L..R]){ if(L<R)S←Partition(A[L..R])QuickSort(A[L..S-1])QuickSort(A[S+1..R])}Partition(A[l..r])p←A[l] i←l; j←r+1repeatrepeat i←i+1 until A[i]≥prepeat j←j-1 until A[j]≥pswap(A[i],A[j])until i≥jswap(A[i],A[j]swap(A[l],A[j]return j20.两次扫描确定分区算法Partition(A[L..R]){ p←A[L]i←L+1,j←Rwhile(true){ while(A[i]<p)and(i≤R)do i←i+1while(A[j]>q)and(j≥R)do j←j-1if(i≥j)then breakswap(A[i],A[j])}swap(A[L],A[j])return (j)}21.折半查找BinarySearch(A[0..n-1],K){L←0,R←n-1while(L<R) dom←」(L+R)/2」if(K=A[m])return melse if(K<A[m])R←m-1else L←m+1return(-1)}22.插入排序(比较两个相邻的数,依次从小到大插入) InsertionSort(A[0..n-1]){ for(i←1 to n-1) doj←i-1,V←A[i]while(j≥0 and A[j]>V)A[j+1]←A[j]j←j-1A[j+1]←V}23.DFS递归版DFSRecursion(vertex v){ count←count+1visit(v)Mark[v]←countfor each vertex w adjacent to v doif Mark[w]=0 thenDFSRecursion(w)}非递归:DFS(Graph G,Vertex v){ count←0virst(v)Initialize(S)Push(v)while(isEmpty(S)=FALSE)x←Pop(S)for each vertex w adjacent to x doif Mark[w]=0 thenvirst(w),count←count+1,Mark[w]←countPush(w)}23.BFS非递归算法BFS(Graph G,Vertex v){ count←0 virst(v) Initialize(Q) Enqueue(v)while(isEmpty(Q)=FALSE)x←Dequeue(Q)for each vertex w adjacent to x doif Mark[w]=0 then virst(w),count++,Mark[w]←count Enqueue(w)}24.预排序检验数组中元素唯一性PresortElementUniqueness(A[0..n-1])For i←0 to n-2 doif A[i]=A[i+1]return falsereturn true时间效率蛮力法:2n变治法:T(n)=Tsort(n)+Tscan(n)∈O(nlogn)+O(n)∈O(nlogn)25.变治法预排序蛮力法效率:T(n)=1+…+n-1∈Θ(n*n)变治法预排序:T(n)=n-1PresortMode_1(A[0..N-1])//行程算法,对数组排序i←0,ModeFrequency←0//最大频率while(i≤n-1)runlength←1,runvalue←A[i]while(i+runlength≤n-1 and A[i+runlength]=runvalue)runlength ++if(runlength>ModeFrequency)ModeFrequency←runlength,modeValue←runvaluei←i+runlengthreturn(ModeValue,ModeFrequency26.堆构造的值交换算法HeapValueExchange(H[1..n])For i←」n/2」downto 1 dok←I,v←H[k]heap←FALSEwhile(not heap)and(2*k≤n)doj←2*k if(j+1≤n)if(H[j]<H[j+1])j←j+1if(v≥H[j] heap←TRUEelse{H[k] ←H[j],k←j}H[k] ←v时间效率T(n)=Ε(n=o,h-1)[2(h-k)2k次方]=2hΕ(k=0,h-1)2k次方-2Ε(k=1,h-1)2k次方=2(n-log2(n+1))<2n,n>027.三种贪婪策略解决01背包的过程和结果价值最大:满足约束条件下,每次装入价值最大的物品----不一定能找到最优解(背包称重量消耗过快)重量最小:满足约束条件下,每次装入重量最轻的物品---不一定找到最优解(装入总价值增加太慢)单位价值最大:满足约束条件下,每次装入价值/重量最大的物品---能找到最优解28.连续背包的贪婪算法GreedyKnapsack(n,w[1..n],v[1..n],x[1..n],W,V)X[1..n] ←0 Wo←W V←0MergeSort(v[1..n]/w[1..n])For(i←1 to n)doIf(w[i]<Wo)then x[i]←1Wo←Wo←w[i]V←V+v[i]Else x[i]←Wo/w[i], V←V+x[i]*v[i]BreakReturn V29.贪婪算法Prim算法:PrimMST(G)Vt←{vo}Et←ΦFor(i←1 to|V|-1)do在V-Vt中选与当前树最小距离的边e*=(v*,u*)Vt←Vt∪{u*}Et←Et∪{e*}Return EtDijkstra算法伪码:Dijkstre(G,s)Initialize(Q)For(each vertex v∈V)dv←∞Isert (Q,v,dv)ds←0,Decrease(Q,s,ds)Vt←ΦFor(i←0 to |V|-1)U*←DeleteMin(Q)Vt←Vt∪{u*}For(each vertex u∈(V-Vt)adjacent to u*∈Vt)If(dn*+w(u*,u)<du)du←du*+w(u*,u)Decrease(Q,u,dn)Kruskal算法:Kruskal(G)Et←∅;ecounter←0k←0while ecounter<|V|-1 dok←k+1if Et∪{Eik}无回路ET←Et∪{Eik};ecounter←ecounter+1Return Eta.设计一个蛮力算法,对于给定的x0,计算下面多项式的值:P(x)=a n x n+a n-1x n-1+…+a1x+a0并确定该算法的最差效率类型.b.如果你设计的算法属于Θ(n2),请你为该算法设计一个线性的算法.。
算法设计与分析期末备考知识点总结
算法设计与分析期末备考知识点总结●通俗地说,算法是解决咨询题的办法,严格地讲,算法是对特定咨询题求解步骤的一种描述,是指令的有限序列。
●算法还必须满脚一下五个重要特性:输入、输出、有穷性、确定性、可行性。
●程序(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)。
算法分析与设计考前复习重点
分治法中的各个子问题是独立的(即不包含公共的子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。不足之处:如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。
程序是算法用某种程序设计语言的具体实现。
程序可以不满足算法的性质(4)有限性。
2算法分析是对算法所需要的两种计算机资源——时间和空间进行估算。
3何谓递归?构成递归需具备的2个条件(要素)。
递归(recursion)是数学与计算机科学中的基本概念。直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。
动态规划法通常以自底向上的方式求解各个子问题,而贪心法则通常以自顶向下的方式做出一系列的贪心选择。
10、什么是最优子结构性质?动态规划法如何利用问题的最优子结构性质求解问题的最优解?(利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。)
该问题可以分解为若干个规模较小的相同问题,即该问题具有结构自相似性质
利用该问题分解出的子问题的解可以合并为该问题的解;
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
6、求解背包问题和0/1背包问题的约束条件有什么不同?
7、动态规划法和分治法之间有什么共同点?有什么不同点?
动态规划的实质是分治思想和解决冗余
(1)最近邻点策略:从任意城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。
最近顶点策略:任选一个顶点,并以此建立起生成树,每一步的贪心选择是简单地把不在生成树中的最近顶点添加到生成树中。
算法设计与分析知识点
第一章算法概述1、算法的五个性质:有穷性、确定性、能行性、输入、输出。
2、算法的复杂性取决于:(1)求解问题的规模(N) , (2)具体的输入数据(I),( 3)算法本身的设计(A),C=F(N,I,A。
3、算法的时间复杂度的上界,下界,同阶,低阶的表示。
4、常用算法的设计技术:分治法、动态规划法、贪心法、回溯法和分支界限法。
5、常用的几种数据结构:线性表、树、图。
第二章递归与分治1、递归算法的思想:将对较大规模的对象的操作归结为对较小规模的对象实施同样的操作。
递归的时间复杂性可归结为递归方程:1 11= 1T(n) <aT(n—b) + D(n) n> 1其中,a是子问题的个数,b是递减的步长,~表示递减方式,D(n)是合成子问题的开销。
递归元的递减方式~有两种:1、减法,即n -b,的形式。
2、除法,即n / b,的形式。
2、D(n)为常数c:这时,T(n) = 0(n P)。
D(n)为线形函数cn:r O(n) 当a. < b(NT(n) = < Ofnlog^n) "n = blljI O(I1P)二"A bl吋其中.p = log b a oD(n)为幕函数n x:r O(n x) 当a< D(b)II JT{ii) = O(ni1og b n) 'ia = D(b)ll].O(nr)D(b)lHJI:中,p= log b ao考虑下列递归方程:T(1) = 1⑴ T( n) = 4T(n/2) +n⑵ T(n) = 4T(n/2)+n2⑶ T(n) = 4T(n/2)+n3解:方程中均为a = 4,b = 2,其齐次解为n2。
对⑴,T a > b (D(n) = n) /• T(n) = 0(n);对⑵,•/ a = b2 (D(n) = n2) T(n) = O(n2iog n);对⑶,•/ a < b3(D(n) = n3) - T(n) = 0(n3);证明一个算法的正确性需要证明两点: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. 递归算法的优化:尾递归优化、记忆化搜索等。
算法设计与分析要点复习
定问题求解步骤的一种描述,它是指令的有限序列。 2、算法有那些特性?输入、输出、确定性、能行性、有穷性。 3、评估一个算法的指标有那些(或者说分析一个算法的优劣主要考虑的因素)?
正确性、简明性、效率、最优性。 4、算法运行的时间代价的度量不应依赖于算法运行的软件平台,算法运行的软
件包括操作系统和采用的编程语言及其编译系统。时间代价用执行基本操作 (即关键操作)的次数来度量,这是进行算法分析的基础。 5、基本操作(即关键操作)是指算法运行中起主要作用且花费最多时间的操作。 6、基本操作是个概念,无法具体定义。问题的实例长度是指作为该问题的一个 实例的输入规模的大小。这个概念也很难精确定义。算法的时间(或)空间 复杂度是由问题实例长度的函数来表示的。即:一个算法的时间代价由该算 法用于问题长度为 n 的实例所需要的基本操作次数来表示。 7、算法的时间复杂度、空间复杂度。T(n)、S(n) 8、在实际的算法中 T(n)是否唯一?不唯一。可能有最好、最坏、平均情形的时 间复杂度。 9、算法与程序的区别? 10、 算法按计算时间可分为两类:多项式是时间算法、指数时间算法。最常 见的多项式时间算法的渐进时间复杂度之间的关系为: O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3) 最常见的指数时间算法的渐进时间复杂度之间的关系为:O(2n)<O(n!)< O(nn) 11、 算法的作用和地位? 12、 算法问题的求解过程是怎样的?如下图所示:理Biblioteka 问题选择求解方法确定数据结构
设计算法
正确性证明 分析算法
13、
《算法设计与分析》复习提纲
《算法设计与分析》复习提纲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归约。
算法分析与设计复习资料
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,然后依次为每个顶点着色。
在解空间树中,如果从根结点到当前结点对应一个部分解,即满足上述约束条件,则在当前结点处选择第一棵子树继续搜索,否则,对当前子树的兄弟子树继续搜索,即为当前顶点着下一个颜色。
算法分析与设计--复习要点
期末考试题型: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)输出 (3)确定性 (4)有限性。
算法复杂性分析主要包括空间复杂性和时间复杂性。
算法复杂性分析(1)渐近上界记号OO(g(n)) ={ f(n)| 存在正常数c和n0使得对所有n≥n0有:0 ≤f(n) ≤cg(n) } (2)渐近下界记号ΩΩ(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥n0有:0≤cg(n)≤f(n) } (3)紧渐近界记号ΘΘ(g(n)) = { f(n) | 存在正常数c1,c2和n0使得对所有n≥n0有:c1g(n) ≤f(n) ≤c2g(n) }定理1:Θ (g(n)) = O (g(n)) ?Ω (g(n))最常见的多项式时间算法的渐近时间复杂度O(1)<O(log n)<O(n)<O(n log n)<O(n2)<O(n3)最常见的指数时间算法的渐近时间复杂度O(2n)<O(n!)<O(n n)通⽤分治递推式⼤⼩为n的原问题分成若⼲个⼤⼩为n/b的⼦问题,其中a个⼦问题需要求解,⽽cn k是合并各个⼦问题的解需要的⼯作量。
NP完全性理论P是所有可在多项式时间内⽤确定算法求解的判定问题的集合。
NP是所有可在多项式时间内⽤不确定算法求解的判定问题的集合。
(NP难度)对于问题Q以及任意问题Q1∈NP,都有Q1∝Q,则Q是NP难度(NP hard)的。
其中∝表⽰约化,Q1∝Q,表⽰Q1可以在多项式时间转化为问题Q,从⽽可通过调⽤问题Q的算法求解。
(NP完全)对于问题Q∈NP,Q是NP难度的,则称Q是NPC(NP complete)的。
P NP NPC的关系第2章递归与分治策略分治法的设计思想是,将⼀个难以直接解决的⼤问题,分割成⼀些规模较⼩的相同问题,以便各个击破,分⽽治之。
2.2 分治法的基本思想divide-and-conquer (P){if ( | P | <= n0) adhoc (P); //解决⼩规模的问题divide P into smaller subinstances P1,P2,...,Pk ;//分解问题 for (i=1,i<=k,i++)yi=divide-and-conquer (Pi); //递归的解各⼦问题return merge(y1,...,yk); //将各⼦问题的解合并为原问题的解 }在⽤分治法设计算法时,最好使⼦问题的规模⼤致相同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析要点复习:
一、基本概念
1、什么是算法?算法是求解一类问题的人以一种特殊的方法。
一个算法是对特
定问题求解步骤的一种描述,它是指令的有限序列。
2、算法有那些特性?输入、输出、确定性、能行性、有穷性。
3、评估一个算法的指标有那些(或者说分析一个算法的优劣主要考虑的因素)?
正确性、简明性、效率、最优性。
4、算法运行的时间代价的度量不应依赖于算法运行的软件平台,算法运行的软
件包括操作系统和采用的编程语言及其编译系统。
时间代价用执行基本操作(即关键操作)的次数来度量,这是进行算法分析的基础。
5、基本操作(即关键操作)是指算法运行中起主要作用且花费最多时间的操作。
6、基本操作是个概念,无法具体定义。
问题的实例长度是指作为该问题的一个
实例的输入规模的大小。
这个概念也很难精确定义。
算法的时间(或)空间复杂度是由问题实例长度的函数来表示的。
即:一个算法的时间代价由该算法用于问题长度为n的实例所需要的基本操作次数来表示。
7、算法的时间复杂度、空间复杂度。
T(n)、S(n)
8、在实际的算法中T(n)是否唯一?不唯一。
可能有最好、最坏、平均情形的时
间复杂度。
9、算法与程序的区别?
10、算法按计算时间可分为两类:多项式是时间算法、指数时间算法。
最常
见的多项式时间算法的渐进时间复杂度之间的关系为:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
最常见的指数时间算法的渐进时间复杂度之间的关系为:O(2n)<O(n!)< O(n n)
11、算法的作用和地位?
12、算法问题的求解过程是怎样的?如下图所示:
13、
14、简述分治法是怎样的一种算法设计策略。
15、二分查找算法的实现前提?
16、为什么要对二叉排序树进行平衡操作?
17、什么是平衡因子?什么是二叉平衡树?二叉平衡树对平衡因子的取值有
什么要求?
18、最优化问题:是指对于某类问题,给定某些约束条件,满足这些约束条
件的问题解称为可行解。
为衡量可行解的好坏,还给出了称为目标函数的某个数值函数,使目标函数取的最大(或最小)值的可行解称为最优解。
19、贪心算法总是做出在当前看来是最好的选择。
也就是说贪心算法并不从
整体最优上加以考虑,它所作出的选择只是在某种意义上的局部最优选择,即使贪心算法不能得到整体最优解,但其最终结果也是最优解的很好的近似解。
20、贪心选择的基本要素:贪心选择性质、最优子结构性质
21、动态规划算法的基本要素:最优子结构性质、子问题重叠性质。
22、动态规划算法与分治法、贪心法比较有何特点?
23、比较回溯算法、分枝限界算法。