转上一节:
http://t.csdnimg.cn/7djZ6http://t.csdnimg.cn/7djZ6
课程内容提要:
理论基础
●回顾算法策略区分
●回顾时间复杂度与空间复杂度
代码填空技巧
实战演练
7:知识点考点详解
7.1:回顾算法策略区分
1:常见算法特征总结
(1)分治法
特征:把一个问题拆分成多个小规模的相同子问题,一般可用递归解决。
经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔
(2)贪心法(一般用于求满意解)
特征:局部最优,但整体不见得最优。每步有明确的、既定的策略。
经典问题:背包问题(如装箱)、多机调度、找零钱问题、最小生成树问题(普里姆算法、克鲁斯
卡尔算法)
(3)动态规划法(用于求最优解)——“最优子结构”和递归式
特征:划分子问题,使用数组存储子问题结果,利用查询子问题结果构造最终问题结果。(一般自
顶向下时间复杂度为O()),自底向上时间复杂度为O()效率更高)
经典问题:斐波那契数列、矩阵乘法、背包问题、LCS最长公共子序列
(4)回溯法(前进和回退)
特征:系统地搜索一个问题的所有解或任一解。
经典问题:N皇后问题、迷宫、背包问题。
2:算法策略判断
(1)分治:在软设考试中,分治法目前只有二分的分治思想,二分以外的思想都选择动态规划法
解决了。注意:二分的时间复杂度,与O()相关,注意有没有外层嵌套循环。(结合归并排
序、快速排序的过程,也是二分的)
(2)贪心法:有时候也会出现“最优子结构”的描述但出现较少,通常不会出现递归式。考虑的是
当前最优,求得的是满意解。(特殊情况下,贪心法有时候得到的也可以是最优解,比如部分背包
问题)
(3)回溯:探索和回退。
(4)动态规划法:问题具有“最优子结构”,可以列出递归式进行求解。与分治法的区别主要在于,
动态规划法对重复子问题会进行记录,最终问题可以通过中间结果记录(查表)进行求解。
注意:此时自底向上实现时,中间解基本上是查表可得的,所以时间复杂度一般是O(),具体k
是多少,根据for循环的嵌套,此时循环变量能够看到,是从0或1开始,到n结束,这种情况就是从
小规模到大规模,自底向上的;如果用到自顶向下,其实跟分治的实现就差不多了,查表的意义基
本上可以忽略不计了,时间复杂度为O(),递归的变量一般由n开始,向1缩小,所以是大规模到
小规模,也就是自顶向下的。(动态规划法经常在代码填空考查中让大家结合递归式补充缺失的代
码。)
7.2:回顾时间复杂度与空间复杂度
时间复杂度是指程序运行从开始到结束所需要的时间。通常分析时间复杂度的方法是从算法中选取
一种对于所研究的问题来说是基本运算的操作,以该操作重复执行的次数作为算法的时间度量。
常见的对算法执行所需时间的度量:
空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只
考虑在运行过程中为局部变量分配的存储空间的大小。
7.3:代码填空技巧
仔细审题:
1、检查所有用到的变量是否有声明,是否赋初值;
2、检查是否有返回值或中间值记录,与题干要求的变量名或上下文是否一致;
3、有一些变量名具有特殊含义,比如一般用max/min保存最大值/最小值,temp作为中间变量,一
般用来存储中间值或用来作数值交换的中间过渡。x>max,则修正max=x;x<min,则修正
min=x。
4、循环结构:检查for循环是否有计数变量的赋值、初值和终止条件,注意while循环的开始和结
束;
5、特殊的算法策略,有特定的操作:回溯法是否有回退k=k-1;对分治法递归的递归调用(调用自
身函数名);对动态规划法的查表操作。
6、注意题干描述和代码说明、递归式(条件和等式)、代码中的注释、代码上下文。一般特殊数
据结构调用方式会在代码说明或代码上下文中给出。
(1)题干公式很重要,一般公式体现在代码中,会有循环边界、判断条件等;
(2)代码上下文很重要,可以根据上下文判断有没有缺失变量声明、变量赋值;
(3)注释很重要,有时候逻辑比较复杂的程序,注释会给出代码的功能说明;
(4)题干说明很重要,题干有时候也会给出循环边界、判断条件等内容,还可以根据题干描述,
判断使用的算法策略,不同的算法策略,一般会有一些典型的代码缺失,比如:动态规划法可能会
考查题干给出的递归式以及最优解的判断,分治法一般也会考查递归式以及问题的划分,贪心法一
般会考查满意解的当前最优判断条件,回溯法一般会考查回退的过程。
解题技巧:代入简单的实例数据进行分析,最有效。