算法复习
计算机算法与设计复习题(含答案)

1、一个算法的优劣可以用(时间复杂度)与(空间复杂度)与来衡量。
2、回溯法在问题的解空间中,按(深度优先方式)从根结点出发搜索解空间树。
3、直接或间接地调用自身的算法称为(递归算法)。
4、 记号在算法复杂性的表示法中表示(渐进确界或紧致界)。
5、在分治法中,使子问题规模大致相等的做法是出自一种(平衡(banlancing)子问题)的思想。
6、动态规划算法适用于解(具有某种最优性质)问题。
7、贪心算法做出的选择只是(在某种意义上的局部)最优选择。
8、最优子结构性质的含义是(问题的最优解包含其子问题的最优解)。
9、回溯法按(深度优先)策略从根结点出发搜索解空间树。
10、拉斯维加斯算法找到的解一定是(正确解)。
11、按照符号O的定义O(f)+O(g)等于O(max{f(n),g(n)})。
12、二分搜索技术是运用(分治)策略的典型例子。
13、动态规划算法中,通常不同子问题的个数随问题规模呈(多项式)级增长。
14、(最优子结构性质)和(子问题重叠性质)是采用动态规划算法的两个基本要素。
15、(最优子结构性质)和(贪心选择性质)是贪心算法的基本要素。
16、(选择能产生最优解的贪心准则)是设计贪心算法的核心问题。
17、分支限界法常以(广度优先)或(以最小耗费(最大效益)优先)的方式搜索问题的解空间树。
18、贪心选择性质是指所求问题的整体最优解可以通过一系列(局部最优)的选择,即贪心选择达到。
19、按照活结点表的组织方式的不同,分支限界法包括(队列式(FIFO)分支限界法)和(优先队列式分支限界法)两种形式。
20、如果对于同一实例,蒙特卡洛算法不会给出两个不同的正确解答,则称该蒙特卡洛算法是(一致的)。
21、哈夫曼编码可利用(贪心法)算法实现。
22概率算法有数值概率算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法23以自顶向下的方式求解最优解的有(贪心算法)24、下列算法中通常以自顶向下的方式求解最优解的是(C)。
计算机算法分析与机器学习算法设计复习

计算机算法分析与机器学习算法设计复习一、算法分析基础算法的定义和特性在计算机科学中,算法是一组定义良好的指令或规则,用于解决特定问题或执行特定计算任务。
算法有以下特点:1. 输入:算法接受零个或多个输入。
2. 输出:算法产生一个或多个输出。
3. 明确定义:算法中的每一条指令都有明确的定义和操作。
4. 有限性:算法只有在有限时间内执行完毕。
算法的时间复杂度和空间复杂度算法的时间复杂度表示算法执行所需的时间资源。
时间复杂度可分为以下几种常见情况:1. 最好情况时间复杂度(best case time complexity):在最理想情况下,算法所需的最少时间。
2. 最坏情况时间复杂度(worst case time complexity):在最不利情况下,算法所需的最长时间。
3. 平均情况时间复杂度(average case time complexity):算法所需的平均时间,考虑到所有可能的输入。
算法的空间复杂度表示算法执行所需的空间资源。
空间复杂度可以通过占用的内存空间大小来衡量。
二、机器学习算法设计基础监督学习与无监督学习机器学习算法可以分为监督学习和无监督学习两大类。
1. 监督学习(Supervised Learning):在监督学习中,训练数据包括输入特征和对应的输出标签。
算法通过学习输入特征与输出标签之间的关系,从而构建一个预测模型。
常见的监督学习算法包括线性回归、逻辑回归、决策树等。
2. 无监督学习(Unsupervised Learning):在无监督学习中,训练数据只包含输入特征,没有对应的输出标签。
算法通过学习输入特征之间的关系,从而将数据划分为不同的类别或进行聚类。
常见的无监督学习算法有聚类算法、关联规则挖掘等。
常见的机器学习算法1. K近邻算法(K-Nearest Neighbors,KNN):KNN是一种常用的监督学习算法,用于分类和回归问题。
它基于实例之间的距离度量进行分类。
算法期末复习重点及答案

1.假设某算法在输入规模为n时的计算时间为T(n)=3*2n,在某台计算机上实现并完成该算法的时间为t秒。
现有另一台计算机,其运行速度是第一台的64倍,那么在新机器上用同一算法在t秒内能解输入规模为多大的问题。
2.若上述算法的计算时间改进为t(n)=n2,其余条件不变,则新机器上用t秒能解问题的规模。
3. 若上述算法的计算时间改进为t(n)=8,其余条件不变,则新机器上用t秒能解问题的规模。
⏹N+6⏹8*n⏹任意规模6☐61到n平方的累加和☐2)基本语句:s=s+i*i;☐3)执行次数:n次☐4)效率类型:时间复杂度为线性阶☐5)利用数学公式进行改进:s=n*(n+1)*(2*n+1)/6⏹时间效率为O(1)7☐)☐T(n)=3T(n-1)☐=3(3T(n-2))=32*T(n-2)☐=……☐=3k T(n-k)☐设n-k=1,则k=n-1☐T(n)=3n-1*T(1)=4*3n-1=O(3n)8☐8. Int Q(int n)☐{▪If(n==1) return 1;▪Else return Q(n-1)+2*n-1;☐}⏹1)求n2⏹2) n=3 Q(3)=Q(2)+2*3-1⏹=(Q(1)+2*2-1)+5⏹=(1+4-1)+5=9⏹3)Q(n)=Q(n-1)+2*n-1⏹=(Q(n-2)+(2*(n-1)-1))+2*n-1=Q(n-2)+2(2n-2)⏹=Q(n-3)+3(2n-3)=….=Q(n-k)+k(2n-k)⏹设n-k=1 则k=n-1⏹Q(n)=1+(n-1)(2n-n+1)=1+n2-1=n2⏹4)非递归算法: return n*n;。
算法复习题

算法复习试题一、名词解释:1、算法:就是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。
2、贪心算法:能够得到某种量度意义下的最优解的分级处理方法称为贪心算法。
3、分治法:分治法的求解思想就是把整个问题分成若干个小问题后分的治之4、递归过程:一个递归过程的执行类似于多个子程序的嵌套调用,递归过程是自己调用自己本身代码。
递归算法的特点:思路清晰,算法的描述简洁且易理解。
5、集合:在研究某一类对象时,可把这类对象的整体称为集合。
6、生成树:设G=(V,E)是一个无向连通图。
如果G的生成子图T=(V,E')是一棵树,则称T是G的一棵生成树。
7、算法具有以下5个属性:有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
确定性:算法中每一条指令必须有确切的含义。
不存在二义性。
只有一个入口和一个出口可行性:就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。
输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。
输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。
8、迭代法:称辗转法,是一种不断用变量的旧值递推出新值的解决问题的方法。
9、贪婪法: 是一种不追求最优解,只希望得到较为满意解的方法。
贪婪法不要回溯10、动态规划:是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。
11、分支限界法:是一种用于求解组合优化问题的排除非解的搜索算法。
12、树:树是一个或多个结点的有限集合。
12、二元树:它是结点的有限集合,它或者为空,或者由一个根和两棵树(左子树和右子树)的不相交的二元树所组成。
13、二分检索树:T是一棵二元树,它或者为空,或者其每个结点含有一个可比较大小的数据元素。
14、图:图是数据结构,一个图G是由称之为结点V和边E的两个集合组成的15、最优解:使目标函数取极值(极大值或极小值)的可行解。
算法与程序设计复习知识点

算法与程序设计复习知识点算法与程序设计复习知识点1. 算法基础1.1. 算法的定义算法是解决特定问题的一系列清晰指令的有限序列,用来描述解决问题的步骤和方法。
1.2. 算法的特性输入:一个算法必须具有零个或多个输入。
输出:一个算法必须具有一个或多个输出。
明确性:算法的每一步骤必须清晰明确,无二义性。
有限性:算法必须在有限的步骤之后终止。
可行性:算法的每一步都可以通过执行有限次来完成。
1.3. 算法的复杂度算法的复杂度是衡量算法性能的指标,主要包括时间复杂度和空间复杂度。
时间复杂度:描述算法执行所需的时间量与输入数据规模之间的关系。
空间复杂度:描述算法执行所需的存储空间量与输入数据规模之间的关系。
2. 程序设计基础2.1. 编程语言选择合适的编程语言,根据问题需求和自身编程经验选择合适的语言,常见的编程语言包括C、C++、Java、等。
2.2. 数据类型在程序中使用合适的数据类型可以更好地组织和操作数据,常见的数据类型有:整型、浮点型、字符型、字符串型、数组、结构体、指针等。
2.3. 控制结构控制结构用来控制程序的执行流程,主要包括选择结构(if-else语句、switch语句)和循环结构(for循环、while循环)。
2.4. 函数函数是一段独立完成特定任务的代码块,函数可以提高代码的重用性和可维护性,降低代码的复杂度。
2.5. 数据结构数据结构是组织和存储数据的方式,不同的数据结构适用于不同的问题场景,常见的数据结构包括数组、链表、栈、队列、树、图等。
3. 常见算法3.1. 排序算法常见的排序算法包括:冒泡排序、选择排序、插入排序、快速排序、归并排序等。
3.2. 查找算法常见的查找算法包括:顺序查找、二分查找、哈希查找等。
3.3. 图算法常见的图算法包括:深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra算法、Floyd-Warshall算法)等。
3.4. 动态规划动态规划是一种将复杂问题分解为简单子问题的方法,通过解决子问题来解决原始问题,常见的动态规划问题包括背包问题、最长公共子序列问题等。
算法期末复习题2

填空题:1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:确定性有穷性可行性 0个或多个输入一个或多个输出2.算法的复杂性有时间复杂性和空间复杂性之分,衡量一个算法好坏的标准是时间复杂度高低。
3.某一问题可用动态规划算法求解的显著特征是该问题具有最优子结构性质。
5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解6.动态规划算法的基本思想是将待求解问题分解成若干子问题_,先求解子问题,然后从这些子问题的解得到原问题的解。
7.以深度优先方式系统搜索问题解的算法称为回溯法。
8.0-1背包问题的回溯算法所需的计算时间为o(n*2n),用动态规划算法所需的计算时间为o(min{nc,2n})。
9.动态规划算法的两个基本要素是最优子结构和重叠子问题。
10.二分搜索算法是利用动态规划法实现的算法。
11.一个算法复杂性的高低体现在计算机运行该算法所需的时间和存储器资源上,因此算法的复杂性有时间复杂性和空间复杂性之分。
12.出自于“平衡子问题”的思想,通常分治法在分割原问题,形成若干子问题时,这些子问题的规模都大致相同。
13.动态规划算法有一个变形方法备忘录方法。
这种方法不同于动态规划算法“自底向上”的填充方向,而是“自顶向下”的递归方向,为每个解过的子问题建立了备忘录以备需要时查看,同样也可避免相同子问题的重复求解。
14、这种不断回头寻找目标的方法称为回溯法。
15、直接或间接地调用自身的算法称为递归算法。
16、 记号在算法复杂性的表示法中表示渐进确界或紧致界。
17、由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
18、建立计算模型的目的是为了使问题的计算复杂性分析有一个共同的客观尺度。
19、下列各步骤的先后顺序是②③④①。
①调试程序②分析问题③设计算法④编写程序。
20、最优子结构性质的含义是问题的最优解包含其子问题的最优解。
算法与程序设计复习知识点

算法与程序设计复习知识点算法与程序设计复习知识点一、数据结构1.数组1.1 一维数组1.1.1 定义和初始化1.1.2 访问和修改元素1.1.3 数组的长度和容量1.1.4 数组的扩容和缩容1.2 二维数组1.2.1 定义和初始化1.2.2 访问和修改元素1.2.3 数组的长度和容量1.2.4 数组的扩容和缩容2.链表2.1 单链表2.1.1 节点定义2.1.2 头节点和尾节点 2.1.3 插入节点2.1.4 删除节点2.2 双链表2.2.1 节点定义2.2.2 头节点和尾节点 2.2.3 插入节点2.2.4 删除节点3.栈和队列3.1 栈3.1.1 定义和基本操作 3.1.2 栈的应用3.2 队列3.2.1 定义和基本操作3.2.2 队列的应用4.树4.1 二叉树4.1.1 定义和基本操作4.1.2 先序遍历、中序遍历和后序遍历 4.2 二叉搜索树4.2.1 定义和基本操作4.2.2 查找、插入和删除节点4.3 平衡二叉树4.3.1 定义和基本操作4.3.2 平衡因子和旋转操作4.4 堆4.4.1 定义和基本操作4.4.2 堆排序二、常用算法1.排序算法1.1 冒泡排序1.2 插入排序1.3 选择排序1.4 快速排序1.5 归并排序1.6 堆排序1.7 计数排序1.8 桶排序1.9 基数排序2.查找算法2.1 顺序查找2.2 二分查找2.3 哈希查找2.4 平衡二叉搜索树查找2.5 B+树查找3.图算法3.1 图的表示和基本操作 3.2 深度优先搜索3.3 广度优先搜索3.4 最小树3.5 最短路径3.6 图的遍历4.动态规划算法4.1 背包问题4.2 最长公共子序列4.3 最短编辑距离4.4 最大子序列和三、程序设计1.编程语言1.1 C语言1.1.1 基本语法1.1.2 数据类型和变量 1.1.3 控制语句1.1.4 函数和指针1.2 C++语言1.2.1 基本语法1.2.2 类和对象1.2.3 继承和多态2.算法设计和分析2.1 时间复杂度和空间复杂度2.2 递归和迭代2.3 动态规划和贪心算法2.4 分治算法2.5 回溯算法附件:●示例代码●算法示意图法律名词及注释:1.著作权:对作品享有的权利,包括复制权、发行权、展览权等。
算法复习题

一、选择题1、衡量一个算法好坏的标准是( )。
(A )运行速度快 (B )占用空间少 (C )时间复杂度低 (D )代码短2、函数n n 1032 的渐进表达式是( )。
(A )O (23n ) (B)O (3) (C )O (n 10) (D )O(2n )3、以下不可以使用分治法求解的是( )。
(A )棋盘覆盖问题 (B )选择问题 (C )归并排序 (D) 0/1背包问题4、二分搜索算法是利用( )实现的算法。
(A)分治策略 (B )动态规划法 (C)贪心法 (D )回溯法5、二分搜索算法的时间复杂性为( )。
(A )O(2n ) (B )O (n ) (C )O (n log ) (D)O (n n log )6、快速排序算法的时间复杂性为( )。
(A )O (2n ) (B)O (n ) (C )O(n log ) (D)O(n n log )7、实现大整数的乘法是利用( )的算法.(A )分治策略 (B)动态规划法 (C)贪心法 (D )回溯法8、矩阵连乘问题的算法可由( )设计实现。
(A )分支界限算法 (B)动态规划算法 (C)贪心算法 (D )回溯算法9、实现循环赛日程表利用的算法是( )。
(A )分治策略 (B )动态规划法 (C )贪心法(D )回溯法10、下列是动态规划算法基本要素的是( ).(A )定义最优解 (B )构造最优解 (C )算出最优解 (D )子问题重叠性质11、最长公共子序列算法利用的算法是( )。
(A )分治法 (B )动态规划法 (C )贪心法 (D)回溯法12、下列算法中通常以自底向上的方式求解最优解的是( )。
(A)备忘录法 (B )动态规划法 (C )贪心法 (D )回溯法13、以下不可以使用分治法求解的是( ).(A)棋盘覆盖问题 (B )选择问题 (C )归并排序 (D )0/1背包问题14、下列算法中不能解决0/1背包问题的是( )(A)贪心法 (B )动态规划 (C)回溯法 (D)分支限界法15、算法是由若干条指令组成的有穷序列,而且满足以下性质( )(A )输入:有0个或多个输入 (B)输出:至少有一个输出(C )确定性:指令清晰,无歧义 (D)有限性:指令执行次数有限,而且执行时间有限A (1)(2)(3)B (1)(2)(4)C (1)(3)(4)D (1) (2)(3)(4)16、函数32n +10nlog n 的渐进表达式是( ).A. 2n B 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
22 T (n / 22 ) 2O(n / 2) O(n) 2k T (n / 2k ) 2k 1 O(n / 2k 1 ) 2O(n / 2) O( n) Let n 2k , then T (n / 2k ) O(1) T (n) 2k O(1) 2k 1 O(2) 2O(n / 2) O(n) O(n) O(n) ...O(n) O(n) (k 1)O(n) O(kn n) O(n log n)
• 如果最接近点对是{p,q},p∈S1且q∈S2,那么 d×2d的矩形R中最多只有6个点
– 鸽巢原理
最接近点对
• 复杂性分析
– Presorting:O(nlogn) – Divide:
• Median: 找x坐标的中位数,O(n) • Partition: O(n)
– Conquer: 2T(n/2) – Combine: at most n/2 × 6 = 3n
算法渐近复杂性
• T(n) , as n ; • (T(n) - t(n) )/ T(n) 0 ,as n; • t(n)是T(n)的渐近性态,为算法的渐近复杂 性。 • 在数学上, t(n)是T(n)的渐近表达式,是T(n) 略去低阶项留下的主项。它比T(n)简单。
Ο:当对算法的最坏情况运行 时间限界时,隐含地给出了对 任意输入的运行时间的上界。 cg(n)
•
Conquer
If k = s, return s //s为划分的位置 If p < k < s, 递归选择A[p…s-1]中第k小元素 If s < k < r, 递归选择A[s+1…r]中第k-(s-p+1)小元素
•
Combine:无
线性时间选择
• 算法分析
– Divide
• 找到划分基准
– n/5次(5个元素的)排序: O(n) – Median of medians: T(n/5)
• Conquer
– 递归分割为2T(n/2);
• Combine
– 设d=min{d1,d2},S中的最接近点对或者是d,或 者是某个{p,q},其中p∈S1且q∈S2。
最接近点对
• 如果最接近点对是{p,q},p∈S1且q∈S2
– 先考虑p和q的横坐标:p,q必定在距离L最大为d的一条 长带区域内,p∈P1且q∈P2 – 再考虑p和q的纵坐标:对于P1中任意一点p,P2中的点 一定落在一个d×2d的矩形R中
• 每执行一次循环,数组的大小就减少一半,那么从初始大小n 减少到最终大小1,需要经历logn次循环。 • T(n) = O(logn)
大整数的乘法
• 设计一个有效的算法,可以进行两个n位大整数的乘法运算。 • 减少乘法的次数:适当增加加法的次数
原算法:XY = ac10n + (ad + bc)10n/2 + bd 改进后:XY = ac10n + ((a-b)(d-c)+ac+bd)10n/2 + bd 或XY = ac10n + ((a+b)(d+c)-ac-bd)10n/2 + bd 如果是二进制,则XY = ac2n + ((a-b)(d-c)+ac+bd) 2n/2 + bd 或XY = ac2n + ((a+b)(d+c)-ac-bd)2n/2 + bd
2 2 4 4
2 1
1
3 1 5 5 13
3 3
5 0 0
7
7
8 6
8 8
7 9
9 0
6
9 17
6
10
4
10 10
18 18
12 12
12 11
14 11 14 14
13 13 17 11 15 19 15 15
17 16 18 16 16 20
19 19 20
20
最接近点对
• Divide
– 选取一垂直线L作为分割直线。其中L的横坐标 m为S中各点横坐标的中位数。由此将S分割为 S1和S2;
求ac: a’=2, b’=1, c’=1, d’=1, ac=a’c’10n + ((a’-b’)(d’-c’)+a’c’+b’d’)10n/2 + b’d’=200+30+1=231 求bd: a’’=0, b’’=1, c’’=3, d’’=0, bd=a’’c’’10n + ((a’’-b’’)(d’’c’’)+a’’c’’+b’’d’’)10n/2 + b’’d’’=30 求(a-b)(d-c): a’’’=2, b’’’=0, c’’’=1, d’’’=9, (a-b)(d-c)=a’’’c’’’10n + ((a’’’b’’’)(d’’’-c’’’)+a’’’c’’’+b’’’d’’’)10n/2 + b’’’d’’’=200+180=380
算法设计策略
回溯:深度搜索解空间树、剪枝 贪心:按阶段划分、按贪心策略扫描输入
分支限界:广度搜索解空间树、剪枝
设计算法 证明正确性 分析算法
贪心选择性质: 贪心策略能够得到整体最优解
分治:T(n)=aT(n/b)+f(n) 动态规划:填表+查表 贪心:预排序nlogn、扫描
回溯和分支限界: 子集树2n,排列树n!
• 在一定条件下,当前阶段(stage)的状态(state)和下一阶段的状 态之间的转移(transition)。
– 规划Programming
• 建立状态转移方程(或称各阶段间的递推关系式,recursive relationship),将各个阶段的状态以表格式方法存储。 • 表格式方法(tabular method):用一个表来记录所有已解决的子 问题的解。「以空间换时间(space-for-time tradeoff) 」。
X*Y= ac10n + ((a-b)(d-c)+ac+bd)10n/2 + bd =2310000+64100+30=2374130
线性时间选择
• Divide
– 找划分基准:中位数的中位数(median of medians),近似中位数 1. 将n个元素划分成n/5个组,每组5个元素(只有一组不是5个元 素);O(1) 2. 用任意一种排序算法将每组中的5个元素排好序,并取出每组 的中位数,共n/5个;O(n) 3. 递归找出这n/5个中位数的中位数,作为划分基准;T(n/5) – 按median of medians对输入数组Partition(划分) O(n)
• T(n) = 3次n/2位的乘法 + 6次不超过2n位的加法 + 2次移位 = 3T(n/2) + O(n) = O(nlog3) = O(n1.59)
大整数的乘法
• 写出采用分治法计算2101×1130的过程。
X=2101, Y=1130 a=21, b=1, c=11, d=30 X*Y= ac10n + ((a-b)(d-c)+ac+bd)10n/2 + bd ac=21*11, bd=1*30, (a-b)(d-c)=20*19
• Partition: O(n)
– Conquer
• 至少有3n/10个元素比基准大(或小),最多有7n/10个元素比 基准小(或大) • 即,将原问题划分为两个规模分别为3n/10和7n/10的子问题
– Combine: 0
棋盘覆盖
• 当k=0时(1×1棋盘),即特殊方格,骨牌数为0; • 当k>0时, - Divide:将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘。特殊方 格位于4个较小子棋盘之一中,而其余3个子棋盘中无特殊方 格。 - 在递归之前要将原问题转化为4个较小规模的相同子问题。 - 用一个L型骨牌覆盖这3个子棋盘的会合处 - Conquer:递归地使用这种分割,直至棋盘缩小到1×1。 - Combine:无
分治法的基本步骤
• 分治法: “分而治之”
– 将一个问题划分成若干个规模较小的相同子问题;当 问题规模缩小到一定程度就很容易求解
• 理想的情况是划分成相同规模
– 子问题被递归地解决 – 必要的话,子问题的解可以合并为原问题的解 • Divide-and-Conquer(P) if |P| ≤ n0 Adhoc(P) Divide P to smaller subproblems P1, P2, … , Pk for i = 1 to k do yi = Divide-and-Conquer(Pi) return Combine(y1, y2, … , yk)
All Get Open Reasonably in The Math.
Algorithm
2014 Nan Guo
P问题
NP问题 子集选取问题
计数问题
解空间 排列问题
构造性问题
判定性问题 Y or N 分治的性质
最优化问题: 约束、目标 最优子结构性质
理解问题
重叠子问题
贪心选择性质
分治:按规模划分、递归、合并 动态规划:按阶段划分、状态转换
算法正确性证明
• 数学归纳法(mathematical induction)
– 当n = 1时,这个算法是正确的; – 假设n = k 时,这个算法是正确的,那么当n = k+1时,这个算法也是正确的。
• 例如,证明某个问题具有贪心选择性质
– 首先考察问题的一个整体最优解,并证明可修 改这个最优解,使其以贪心选择开始。 – 然后,假设第i步贪心选择能够得到整体最优解, 那么证明第i+1步贪心选择也能得到整体最优解。