21、算法分析与设计
算法是对特定问题求解步骤的一种描述。它是指令的有限序列,其中每一条指令标识一个或多个操作。
它具有有穷性、确定性(含义确定、输入输出确定,相同输入相同输出;执行路径唯一)、可行性、输入(另零个或多个)、输出(零个或多个)五个特性。
算法的时间复杂度分析:主要分析算法的运行时间,即算法执行所需要的基本操作数。
递归:是指子程序或函数直接调用自己活通过一系列调用语句间接调用自己。
T(n) = 8T(n/2) + n2 则:
T(n) = 8 * (8 * T(n/2/2) + (n/2)2 ) + n2
= 82T(n/4) + 2n2+ n2
= 82 (8 * T(n/4/2) + (n/4)2 ) + 2n2 + n2
= 83T(n/8) + 4n2 + 2n2+ n2
=8nT(n/(2n) + 2n-1n2 + 2n-2n2 + … + 21n2+ 20n2
可以看到,肯定是远远大于 n2,所以时间复杂度是 n3
n 足够大,则 X 最大 为 63.
所以答案为:D、C。复杂度为 n2,最大值为63.
1、分治法:分组且子问题相同且独立,最后合并。递归法。
◆分治法的设计思想是将一个难以直接解决的大问题分解成一些规模较小的相同问题,以便各个击破,分而治之。如果规模为n的问题可分解成k个子问题1<k≤n,这些子问题互相独立且与原问题相同。分治法产生的子问题往往是原问题的较小模式,这就为递归技术提供了方便。
◆一般来说,分治算法在每一层递归上都有3 个步骤。
(1)分解。将原问题分解成一系列子问题。
(2)求解。递归地求解各子问题。若子问题足够小则直接求解
(3)合并。将子问题的解合并成原问题的解。
◆凡是涉及到分组解决的都是分治法,且分组时分为的问题相同。
例如归并排序算法完全依照上述分治算法的3 个步骤进行。
(1)分解。将n 个元素分成各含n/2 个元素的子序列,
(2)求解。用归并排序对两个子序列递归地排序。
(3)合并。合并两个已经排好序的子序列以得到排序结果。
2、动态规划法:分组且子问题可能相同、可能独立,记录每个子问题的答案,寻找全局最优(最大、最小等),递归法。一定能得到全局最优。
◆动态规划算法与分治法类似,其**基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。**与分治法不同的是,适合用动态规划法求解的问题,**经分解得到的子问题往往不是独立的。**若用分治法来解这类问题,则相同的子问题会被求解多次,以至于最后解决原问题需要耗费指数级时间。
◆然而,不同子问题的数目常常只有多项式量级。如果能够保存已解决的子问题的答案,在需要时再找出已求得的答案,这样就可以避免大量的重复计算,从而得到多项式时间的算法。为了达到这个目的,可以**用一个表来记录所有已解决的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。**这就是动态规划法的基本思路。
◆**动态规划算法通常用于求解具有某种最优性质的问题。**在这类问题中,可能会有许多可行解,每个解都对应于一个值,我们希望找到具有最优值(最大值或最小值)的那个解。当然,最优解可能会有多个,动态规划算法能找出其中的一个最优解。设计一个动态规划算法,通常按照以下几个步骤进行。
(1)找出最优解的性质,并刻画其结构特征。
(2)递归地定义最优解的值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造一个最优解。
◆步骤(1)~(3)是动态规划算法的基本步骤。在只需要求出最优值的情形
步骤(4)可以省略。若需要求出问题的一个最优解,则必须执行步骤
(4)。
◆对于一个给定的问题,若其具有以下两个性质,可以考虑用动态规划法来求
解。
(1)最优子结构。如果一个问题的最优解中包含了其子问题的最优,也就是说
该问题具有最优子结构。当一个问题具有最优子结构时,提示我们动态规划法可能会适用,但是此时贪心策略可能也是适用的。
(2)**重叠子问题。重叠子问题指用来解原问题的递归算法可反复地解同样的子问题,而不是总在产生新的子问题。**即当一个递归算法不断地调用同一个问题时,就说该问题包含重叠子问题。
动态规划的典型应用:0-1背包问题:即要么不放,要么全放。
两个条件:容量不能超过 W,且价值最大。
3、贪心法:类似动态规划,但得到的是局部最优、可能近似最优,不一定是全局最优。
◆和动态规划法一样,贪心法也经常用于解决最优化问题。与动态规划法不同的是,贪心法在解决问题的策略上是仅根据当前已有的信息做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。换而言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。 这种局部最优选择并不能保证总能获得全局最优解,但通常能得到较好的近似最优解。
◆贪心法问题一般具有两个重要的性质。
(1)**最优子结构。**当一个问题的最优解包含其子问题的最优解时,称此问题具
有最优子结构。问题具有最优子结构是该问题可以采用动态规划法或者贪心法求解的关键性质。
(2)**贪心选择性质。**指问题的整体最优解可以通过一系列局部最优的选择,即
贪心选择来得到。这是贪心法和动态规划法的主要区别。证明一个问题具有贪心选择性质也是贪心法的一个难点。
相较于0-1背包问题:n 个背包,要么不放,要么全放;
而背包问题:n个背包,可以放部分。
4、回溯法
◆概念:有**“通用的解题法”之称,可以系统地搜索一个问题的所有解或任一
解。在包含问题的所有解的解空间树中,按照深度优先的策略**,从根节点出发搜索解空间树。搜索至任一结点时,总是**先判断该结点是否肯定不包含问题的解,**如果不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先的策略进行搜索。
◆可以理解为先进行深度优先搜索,一直向下探测,当此路不通时,返回上一层探索另外的分支,重复此步骤,这就是回溯,意为先一直探测,当不成功时再返回上一层。
一般用于解决迷宫类的问题。
0-1 背包问题: 要么都放、要么都不放(即完整的放,即一个物体,不能切开、拆开的放,这个物体要么放,要么不放)。
已知最大放入5个物品,背包容量最大为10,每个物体要么放,要么不放。
经过推算可以得到最大装包价值为:
排序为:[重量,价值]
[2,6],[2,3],[6,5],[5,4],[4,6]
动态规划采用的是递归法。类似于分治法,而分治法采用的是分组、分子问题。
根据重量限制能放:
2 + 4 + 2,价值为: 6 + 6 + 3 = 15
或
4 + 6,价值为:6 + 5 = 11
或
2 + 2 + 5,价值为 6 + 3 + 4 = 13
或
2 + 2 + 6,价值为 6 + 3 + 5 = 14
或
…
根据答案选项,已经可以验证答案为 C。
即63题答案为 C。
0-1背包的时间复杂度为 O(nW),记住即可。
即64题答案为 A。
部分背包问题,归并排序算法。归并排序算法:分组,排序,合并。时间服复杂度为 nlgn
单位重量价值:6/2 = 3;3/2 = 1.5 ; 5/6≈0.8333 ;4/5 = 0.8;6/4 = 1.5;
从大到小排序:
[单位重量价值,价值,重量]
[3,6,2]、[1.5,3,2]、[1.5,6,4]、[0.83,5,6]、[0.8,4,5]
或
[3,6,2]、[1.5,6,4]、[1.5,3,2]、[0.83,5,6]、[0.8,4,5]
已知最大放入5个物品,背包容量最大为10,
所以:2+2+4 = 8 < 10,放了3个,还可以再放2个,所以最大价值:6 + 3 + 6 + 2 * 0.8333 = 15 + 1.6666 ≈ 16.67。
所以 64 答案为 D、65 答案为 B。
该题的算法思路中只考虑了左端的房子的右侧放消防栓是否可以覆盖,但没有考虑一个消防栓是否同时覆盖左右两侧的。
所以这是一种考虑局部最优解的算法思路。所以是贪心算法的思路。
贪心的时间复杂度为: 考虑第1栋,第2栋…第n栋,所以是线性的,所以是 O(n)
只需要装5个即可:即30装一个(覆盖10、20、30、35),80装一个(覆盖60、80),160装一个、210装一个、280装一个(覆盖260和300)
所以答案为:
62:C
63:B
64:B
65:C**(贪心法可能得到近似最优解,也可能得不到,对有些实例,可能得不到最优)**
5、分支限界法(了解即可)
与回溯法的区别:1、求解目标是找出满足约束条件的一个解,或是在满足约
束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
2、以广度优先或以最小耗费(最大收益)优先的方式搜索解空间树。
6、概率算法(了解即可)
在算法执行某些步骤时,**可以随机地选择下一步该如何进行,同时允许结果以较小的概率出现错误,**并以此为代价,获得算法运行时间的大幅度减少(降低算法复杂度)。
基本特征是对所求解问题的同一实例用同一概率算法求解两次,可能得到完全不同的效果。
四类概率算法:数值概率算法(数值问题的求解)、蒙特卡洛算法(求问题的精确解)、拉斯维加斯算法(不会得到不正确的解)、舍伍德算法(总能求得问题的一个正确解)。
7、近似算法(了解即可)
放弃求最优解,而用近似最优解代替最优解,总会给待求解的问题提供一个解。该算法必须能够给出算法所产生的解与最优解之间的差别或者比例的一个界限。
通过近似算法,以换取算法设计上的简化和时间复杂度的降低。
很凉近似算法性能的两个标准:
(1)算法的时间复杂度:必须是多项式阶
(2)解的近似程度。
8、数据挖掘算法(了解即可)
◆分析爆炸式增长的各类数据的技术,以发现隐含在这些数据中的有价值的信息和知识。数据挖掘利用机器学习方法对多种数据进行分析和挖掘。其核心是算法,主要功能包括分类、回归、关联规则和聚类等。
分类
◆是一种有监督的学习过程,根据历史数据预测未来数据的模型。
◆数据分类的两个步骤:学习模型(基于训练数据集采用分类算法建立学习
型)、应用模型(应用测试数据集的数据到学习模型中,根据输出来评估模型
的好坏以及将未知数据输入到学习模型中,预测数据的类型)。
◆分类算法:决策树归纳(自顶向下的递归树算法)、朴素贝叶斯算法、后向
传播BP、支持向量机SVM。
聚类
是一种无监督学习过程。根据数据的特征,将相似的数据对象归为一类。
9、智能优化算法(了解即可)
优化技术是一种以数学为基础,用于求解各种工程问题优化解的应用技术。
人工神经网络算法ANN:一个以有向图为拓扑结构的动态系统。神经元网络。
遗传算法:模拟优胜劣汰、遗传变异。在迭代过程中保持已有的结构,同时寻找最好的结果。
模拟退火算法SA:求解全局优化泛。模拟物理退火过程:加温、等温、冷却。
禁忌搜索算法TS:模拟人类智力过程的一种全局算法,是对局部邻域搜索的一种扩展。记忆可行解,对已经优化的过程进行记录和选择,指导下一步搜索方向。
10、蚁群算法(了解即可)
是一种用来寻找优化路径的概率型算法。
蚁群可以子在不同的环境下,寻找最短到达食物的路径。
整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放的信息素量较多。
11、粒子群优化算法 PSO(了解即可)
一群鸟随机搜索食物,这个区域只有一个食物,但是所有鸟不知道食物在哪里。但是它们指导当前的位置离食物还有多远。那么最简单有效的就是搜寻目前距离食物最近的鸟的周围区域。
每个优化问题的解都是搜索空间中的一只鸟,称为粒子。所有粒子都有一个由被优化的函数决定的适应值,每个粒子还有一个速度决定它们飞翔的方向和距离。然后粒子就追随当前的最优粒子在解空间中搜索。
粒子通过跟踪两个“极值”来更新自己:第一个是粒子本身所找到的最优解;另个是整个种群目前找到的最优解。