1、算法分析总复习第 1 页 共 8 页算法分析总复习考试题型:填空、简答、编程、计算。算法的定义:按照某种机械步骤得到问题结果的处理过程。算法的 3 要素:操作、控制结构、数据结构。算法的 3 个结构:顺序结构、选择结构、循环结构。算法的基本性质:目的性、分布性、有序性、有限性、操作性。算法的基本特征:有穷性、确定性、可行性、输入性、输出性。 (前 3 个是最主要的)算法的(质量)指标:正确性、可读性、稳健性、高效率与低存储量需求。算法的抽象描述:算法=控制结构+ 原操作算法的表示方式包括:自然语言、流程图、盒图、PAD 图、伪代码、程序设计语言。算法分析的任务:利用数学工具,讨论算法的复杂度。
2、评价算法的标准:1)算法实现所消耗的时间;2)算法实现所消耗的存储空间;3)算法应易于理解、易于编码、易于调试。算法复杂度:算法的时间复杂度与算法的空间复杂度的统称。算法时间复杂度的估算: 1)算法的执行时间= 原操作的执行次数原操作的执行时间2)算法时间复杂度的数量级的形式: O(L) 称为常数级; O(Logn) 称为对数级; O(n)称为线性级; O( )称为多项式级; O( )称为指数级; O(n!)称为阶乘级; cnnc判断时间复杂度的数量级:1)顺序结构的算法的时间复杂度是 O(L);2)循环结构的算法的时间复杂度是 O( )(x:循环的层数) ;n算法时间复杂度的最坏情况:可操作
3、性最好的,且最有实际价值的,是最坏情况下的时间复杂性。算法的存储量包括:1)输入数据所占空间; 2)算法本身所占空间; 3)辅助变量所占空间。NP 完全问题:算法分析总复习第 2 页 共 8 页多项式复杂程度的非确定性问题,是图灵机在 P 时间内解决的问题,是世界 7 大数学难题之一。递归算法设计: 就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题,逐步求解小问题后,再返回得到大问题的解。递归与非递归的比较程序可读性 代码量大小 时间 占用空间 使用范围 设计难度递归 易 小 长 大 广 易非递归 难 大 短 小 窄 难算法与数据结构:1)计算机处理的问题类型:数值计算问题、
4、非数值性问题。2)算法设计的实质:对实际问题要处理的数据选择一种恰当的存储结构,并在选定的存储结构上设计一个好的算法,实现对数据的处理。好的算法在很大程度上取决于问题中数据所采用的数据结构。3)常用的数据结构的分类:连续存储、链式存储。4)连续存储和链式存储的优缺点比较: 基于存储的考虑:顺序表的存储空间是静态分配的,事先必须明确规定其存储规模;链表不用事先估计存储规模,但存储密度较低。 基于运算的考虑:运算若按序号访问数据元素,则顺序表优于链表;若是比较操作,则链表优于顺序表。 基于环境的考虑:顺序表容易实现;链表的操作是基于指针的。总之,通常较稳定的线性表选择顺序存储;而动态性较强的线性表
5、宜选择链式存储。选学生会主席问题(P70)的算法分析:先为 5 个候选人设置 5 个计数器,然后根据选票分别对 5 个计数器累加 1。即数组用于存储统计结果,而其下标则是输入的原始信息。编程统计身高问题(P71)的算法分析:由于多数统计区间的大小都固定为 5,这样用“身高/529”做下标,只须开辟 8 个元素的数组,对应 8 个统计档次,即可完成统计工作。统计 3 科全及格的学生问题(P71)的算法分析:从语文名单中逐一抽出及格学生学号,先在代数名单中查找,若有该学号,则代数也及格了,再在外语名单中查找,看该学号是否外语也及格了,若仍在,则该学号学生 3 科全及格,否则至少有一科不及格。语文名
6、单中没有的学号,不可能 3 科全及格,所以,语文名单处理完后算法就可以结束了。数字编号翻译成英文编号问题(P73)的算法分析:将英文的“zeronine ”存储在数组中,对应下标为 “09” 。通过求余、取整运算,可以取到编号的各个位数字。用这个数字作下标,正好能找到对应的英文数字。高精度数据长整数问题(P78)的算法分析:一个高精度数据与一个自然数的乘法运算过程,用一重循环来实现,循环变量 i 代表算法分析总复习第 3 页 共 8 页当前参与运算的数组下标,d 表示存储进位。统计 50 个学生中至少有 3 门成绩高于 90 分的人数问题(P91)的算法分析:对每个同学,先计算其成绩高于 90
7、 分的课程科目,若超过 3,则累加到满足条件的人数中。用二重循环实现以上过程,外层循环模拟 50 个同学,内层循环模拟 5 门课程。开灯问题(P92)的算法分析:定义有 n 个元素的 a 数组,它的每个下标变量 ai视为一灯, i 表示其编号。ai=1 表示第 i 盏灯处于打开状态,ai=0 表示第 i 盏灯处于关闭状态。通过算术运算 ai=1-ai,就能很好地模拟开关灯的操作。数字圆圈问题(P93)的算法分析:数组定义为 an,则有 a0an-1共 n 个元素。用 i 代表下标,题目就是顺序将 a(i-1)与 a(i+1)相乘,通过求余运算求出乘积的最大值和最小值。任意 3 个数的最小公倍数
8、问题(P97 和 P136)的算法分析:用蛮力法最方便,但运算时间最长。警察抓小偷问题(P99)的算法分析:将 a、b、c 、d 4 个人进行编号,号码分别是 1、2、3、4。接着用枚举法来解决。老师预测数学竞赛问题(P100)的算法分析:利用三重循环把所有的情况枚举出来即可。找次品问题(P102)的算法分析:110 号箱取产品的件数分别为 件,然后称量,就可以很简单地找到次品。029数学模型的定义:数学模型是利用数学语言模拟现实的模型。把现实模型抽象、简化为某种数学结构是数学模型的基本特征。上楼梯问题(P114)的算法分析:设 n 阶台阶的走法数位 f(n),则: 2)()1(21) nff
9、f迭代法的定义:也称辗转法,是一种不断用变量的旧值推出新值的解决问题的方法。兔子繁殖问题(P124)的算法分析:把 a,b 表示成每月的前 2 个月和前 1 个月的兔子的对数,它们的初值均为 1,这样 3月兔子的对数 c=a+b;求 4 月兔子的对数时,先将 4 月前 2 个月和前 1 个月兔子的对数存储在变量 a,b 中,即 a=b, b=c,再将 4 月份兔子的对数继续保存在变量 c 中,即c=a+b+当然,在变量中的数据被覆盖之前应先行输出已求解的结果。main( )int i,a=1,b=1;printf(“%d %d”,a,b);fot(i=1;i1/n;输出 1/n;计算 f=f-
10、1/n;若此时的 f 是埃及分数,输出 f,否则返回第一步。贪心算法的基本思路:从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解。动态规划的基本思想:把求解的问题分成许多阶段或多个子问题,然后按顺序求解各子问题。前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。不同算法策略特点总结:1、贪婪法:“通过局部最优得到全局最优”2、递推法:由当前问题的逐步解决从而得到整个问题的解,多用于计算。3、递归法:利
11、用大问题与其子问题间的递推关系来解决问题。4、枚举法:逐一尝试问题的所有可能的解,从而找出真正的解,多用于决策类问题。5、递归回溯法:通过递归尝试遍历问题各个可能解得的通路,当发现此路不通时,回溯到上一步继续尝试别的通路。6、分治法:把一个大问题分解成若干个容易解决的子问题,分而治之,然后把子问题的解合成,得到大问题的解,多用于较复杂的问题。7、动态规划法:通过多阶段决策过程来解决问题。每个阶段决策的结果是一个决策结果序列,这个结果序列的最优结果,取决于以后每个阶段的决策。搜索算法的定义:有目的地枚举一个问题的部分或所有的可能情况,从而找到问题的解。显示图的常用方法:1)邻接矩阵法:邻接矩阵是
12、表示顶点之间相邻关系的矩阵。2)邻接表法:对于图 G 中的每个结点 ,该方法把所有邻接于 的顶点 链成一个单链,这个单ivivj链表就称为顶点 的邻接表。邻接表由顶点表和边表两部分组成。i广度优先搜索算法的基本思路:通过搜索图的过程中进行相应的操作,从而解决问题,主要用于解决在显式图中寻找某一方案的问题。1)邻接表表示图的广度优先搜索算法:int visitedn;bfs(int k,graph head )算法分析总复习第 6 页 共 8 页int I;queue Q;edgenode *p;InitQueue(Q);print(“visit vertex”,k);visitedk=1;En
13、Queue(Q,k);while(not QueueEmpty(Q)i=DeQueue(Q);p=headi.firstedge;while(padjvex=0)print(“visitertex”,p-adjvex);visitedp-adjvex=1;EnQueue(Q,p-adjvex); p=p-next;2)邻接矩阵表示的图的广度优先搜索算法:brsm(int k,graph g 100,int n)int i,j;queue Q;InitQueue(Q);print(“visit vertex”,k);visitedk=1;EnQueue(Q,k);while(not QueueE
14、mpty(Q)i=DeQueue(Q);for(j=0;jnull)if(visitedptr-vertex=0)dfs(ptr-vertex)ptr=ptr-nextnode;2)用邻接矩阵存储图的搜索算法如下:int visitedn;graph g 100,int n;dfsm(int k)int j;print(“访问”,k);visitedk=1;for(j=1;j=n;j+)if(gkj=1 and visitedj=0)dfsm(g,j);走迷宫问题(P204)的算法分析:深度优先搜索,就是一直向着可通行的下一个方格进行,直到搜索到出口就找到一个解。若行不通,则返回上一个方格,继
15、续搜索其他方向。七巧板问题(P206)的算法分析:在深度优先搜索顶点时,并不加入任何涂色的策略,只是对每一个顶点逐个尝试 4 种颜色,检查当前顶点的颜色是否与前面已确定的相邻顶点的颜色发生冲突,若不冲突,则继续以同样的方法处理下一个顶点;若 4 个颜色都尝试完毕,仍然与前面顶点的颜色发生冲突,则返回到上一个还没有尝试完 4 种颜色的顶点,再去尝试别的颜色。回溯法的基本思想:按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否满足问题的约束条件。如果满足进入该子树,继续搜索。否则,不去搜索以该结点为根的子树,而是逐层向其祖先结点回溯。其实回溯法就是对隐式图的深度优先搜索算法。分支限界法:分支限界法是由分支策略和限界策略两部分组成。分支策略是按广度优先的策略对问题空间进行搜索;限界策略是为了加速搜索速度而采用启发信息剪枝的策略。算法分析总复习第 8 页 共 8 页猴子选大王问题(P262)的算法分析: