1、算法的复杂性有 时间 复杂性和 空间 复杂性之分。
2、算法要满足输入、 输出 、确定性、可行性和 有限性 四条性质。
算法设计的目标:
(1)正确性:正确地执行预先规定的功能和性能要求。
(2)可使用性(用户友好性):可以很方便地使用。
(3)可读性:易于理解。
(4)健壮性:提供异常处理,能够对不合理的数据进行检查。
(5)高效率与低存储:执行时间短的算法效率高,所需的最大存储容量低的算法好。
算法的重要特性:
(1)有限性:执行有限步之后结束。
(2)确定性:每一条指令无二义性。
(3)可行性:每一条运算都能精确地执行。
(4)输入性:一个算法有零个或多个输入。
(5)输出性:一个算法有一个或多个输出。
3、算法的“确定性”指的是组成算法的每条 指令 是清晰的,无歧义的。
算法的重要特性:
(1)有限性:执行有限步之后结束。
(2)确定性:每一条指令无二义性。
(3)可行性:每一条运算都能精确地执行。
(4)输入性:一个算法有零个或多个输入。
(5)输出性:一个算法有一个或多个输出。
4、任何可用计算机求解的问题所需的时间都与其 规模 有关。
5、当设定的问题有多种算法去解决时,其选择算法的主要原则是 选择其中复杂性最低者。
6、用函数自身所定义的函数是一种 递归函数。
7、一个直接或间接调用自身的算法称为 递归算法。
递归分为直接递归和间接递归。
8、穷举法的基本思想是对问题的 所有可能状态 一一测试,直到找到解或将全部可能状态都测试为止。
9、在直接采用穷举法设计算法中,主要是使用循环语句和选择语句,循环语句用于穷举所有可能的情况,而选择语句判定当前的条件是否为所求的解。
穷举法:找出所有可能的解,然后选择其中一种或多种解,若该解不可行则试探下一种可能的解。主要使用:选择结构+循环结构
优点:逻辑清晰、可解决小规模问题等
缺点:效率低
10、冒泡排序算法属于穷举法
冒泡排序有两种求解方法:
(1)穷举法:两层for循环,for循环内用if对元素是否反序进行判断。
(2)递归法:采用一层for循环加上if对是否进行交换进行判断。
11、分治法通常采用递归算法设计技术,在每一层递归上都有3个步骤:分解、求解子问题、合并。
分治法是采用递归的思想,将大问题转化为小问题,然后由小问题(子问题之间相互独立且与原问题的形式相同)构造出大问题的解。
分治法的特性:
(1)问题的规模缩小到一定程度可以很容易的解决;
(2)可以分解为若干个规模较小的相同问题;
(3)子问题的解可以合并为该问题的解;
(4)该问题分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题
13、快速排序算法是基于 分治策略 的一种排序算法。
选择一个基准,大的数放右边,较小的数放左边。如果选择第一个数为基准,时间复杂度为:nlog2n
快速排序也是一个分治的算法,快排算法每次选择一个元素并且将整个数组以那个元素分为两部分,根据实现算法的不同,基准的选择一般有如下几种:
选择第一个元素
选择最后一个元素
随机选择元素
取中间值
14、快速排序算法的性能取决于 划分的对称性 。
为了保证划分的对称性,可以在数组中随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分是对称的。
15、使用二分搜索算法在n个有序元素中,在最佳情况下,搜索的时间复杂度为o(1),在最坏情况下,搜索的时间复杂度为O(log2n)。
折半查找也称为二分查找,要求元素必须按照关键字有序排列。
查找过程:从表的中间开始,如果给定值和中间记录的关键字相同,则查找成功;如果大于或者小于中间记录,则在大于或小于中间记录的那一半查找。
16、大整数乘积算法是用 分治法 来设计的。
17、贪心法的基本思路是在对问题求解时总是做出在当前看来是最好的选择,也就是说贪心法不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解
18、贪心算法的基本要素是 贪心选择 性质和 最优子结构 性质 。
19、所谓贪心选择性质是指 所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到 。
20、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
贪心算法基本要素:
(1)贪心选择性质:每一步所做的贪心选择最终导致问题的整体最优解。
(2)最优子结构性质:一个问题的最优解包含其子问题的最优解。
而动态规划也具有最优子结构性质。
21、问题的最优子结构性质 是该问题可用动态规划算法和贪心算法求解的关键特征。
贪心算法基本要素:
(1)贪心选择性质:每一步所做的贪心选择最终导致问题的整体最优解。
(2)最优子结构性质:一个问题的最优解包含其子问题的最优解。
而动态规划也具有最优子结构性质。
22、7个独立的作业{a, b, c, d, e, f, g},加工时间分别为{2,14,4,16,6,5,3},3台机器:M1, M2, M3贪心调度结果的加工时间为 17,达到最优。
三台机器并行工作:
一号:16(16)
二号:14、3(17)
三号:2、4、5、6(17)
23、动态规划算法的基本思想是将待求解问题分解成若干 子问题 ,先求解 子问题 ,然后从这些 子问题 的解得到原问题的解。
动态规划的三个性质:
(1)最优子结构:问题的最优解所包含的子问题也是最优的。
(2)无后效性:某状态以后的过程不会影响以前的状态。
(3)有重叠子问题:子问题之间是不独立的,一个子问题在下一阶段的决策中可能会被多次使用。(分治法的子问题是相互独立的)
24、动态规划算法的两个基本要素是 最优子结构 性质和 重叠子问题 性质 。
25、若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},序列X和Y的最长公共子序列是{BABCD}或{CABCD}或{CADCD}
字符序列的子序列是指:从字符序列中随意地去掉若干个字符后形成的字符序列。
27、问题的解空间树常见的有子集树、排列树两种类型。
子集树:所给的问题是从n个元素的集合中找到满足某种性质的子集
排列树:所给的问题是从n个元素满足某种性质的排列时相应的解空间树
28、以深度优先方式系统搜索问题解空间的算法称为 回溯法 。
回溯法:深度优先
分支限界法:广度优先
29、回溯法在解空间树上的搜索方式是 深度优先。
28、以深度优先方式系统搜索问题解空间的算法称为 回溯法 。
30、回溯法搜索解空间树时,常用的两种剪枝函数为 约束函数 和 限界函数 。
避免无效搜索的方法:
(1)约束函数:减去不满足约束的子树
(2)限界函数:剪去得不到解或最优解的子树
31、用回溯法解0/1背包问题时,该问题的解空间结构为 子集树 结构。
子集树:所给的问题是从n个元素的集合中找到满足某种性质的子集
排列树:所给的问题是从n个元素满足某种性质的排列时相应的解空间树
32、用回溯法解批处理作业调度问题时,该问题的解空间结构为 排列树 结构。
33、旅行售货员问题的解空间树是 排列树 。
34、分支界限法和回溯法分别用广度优先遍历或者最小耗费优先、深度优先的方式搜索解空间树。
35、回溯法和分支限界法 在搜索解空间树的时候,为了避免无效搜索,通常使用剪枝策略来提高搜索效率。
避免无效搜索的方法:
(1)约束函数:减去不满足约束的子树
(2)限界函数:剪去得不到解或最优解的子树
36、广度优先是 分支限界法 的一种搜索方式。
37、以广度优先或以最小耗费方式搜索问题解的算法称为 分支限界法 。
38、分支界限法和回溯法主要区别在于 求解目标和搜索方式不同。
回溯法:
(1)求解目标:找出解空间中满足约束条件的所有解
(2)搜索方式:深度优先搜索
分支限界法:
(1)求解目标:在解空间中找到满足约束条件的最优解
(2)搜索方式:广度优先搜索
38、分支限界法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
40、分支限界法主要有 队列式(FIFO) 分支限界法和 优先队列式 分支限界法。
队列式分支限界法:将活结点组织成为一个队列,并按照队列先进先出的原则选取下一个结点作为扩展节点
优先队列式分支限界法:将活结点组织成一个优先队列,并选取优先级最高的结点作为扩展结点
活结点:自身已经生成但是孩子结点没有全部生成的结点
扩展结点:正在产生孩子的结点
41、优先队列式分支界法选取扩展结点的依据是 结点的优先级
队列式分支限界法:将活结点组织成为一个队列,并按照队列先进先出的原则选取下一个结点作为扩展节点
优先队列式分支限界法:将活结点组织成一个优先队列,并选取优先级最高的结点作为扩展结点
42、利用分支界限法实现算法设计时,通常采用 堆 实现来构造优先队列。
最大优先队列:大根堆
最小优先队列:小根堆
队列式分支限界法:队列
43、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是 动态规划,需要排序的是回溯法,分支限界法。
(1)贪心算法在某些情况下会出错
(2)0-1背包问题可以用穷举法、动态规划、回溯法和分支限界法这三种任意一种算法策略来求解