8算法设计与分析
算法(4分):62-65题
-
回溯法
-
N皇后问题
-
思路
-
按行摆放
-
判断是否同列
-
判断是否同一斜线
-
同行所有情况都不行,则回溯到上一个皇后位置
-
-
求解
-
非递归求解
-
check(j)
-
是否符合规则
-
-
while(q[j] <= N && !check(j))
-
q[j] = N
-
j = N
-
找到合法方案
-
-
j < N
-
j = j + 1
-
找下一个皇后位置
-
-
-
-
q[j] > N
-
q[j] = 0
-
还原当前皇后位置
-
-
j = j - 1
-
回到上一个皇后位置
-
-
-
-
-
递归求解
-
-
-
深度优先
-
-
分治法
-
归并
-
快排
-
分硬币
-
最大子段和问题
-
-
动态规划法
-
思想
-
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合用动态规划法求解的问题,经分解得到的子问题往往不是独立的。若用分治法来解这类问题,则相同的子问题会被求解多次,以至于最后解决原问题需要耗费指数级时间。
-
然而,不同子问题的数目常常只有多项式量级。如果能够保存已解决的子问题的答案,在需要时再找出已求得的答案,这样就可以避免大量的重复计算,从而得到多项式时间的算法。为了达到这个目的,可以用一个表来记录所有已解决的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。
-
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解,每个解都对应于一个值,我们希望找到具有最优值(最大值或最小值)的那个解。当然,最优解可能会有多个,动态规划算法能找出其中的一个最优解。设计一个动态规划算法,通常按照以下几个步骤进行。
-
(1)找出最优解的性质,并刻画其结构特征。
-
(2)递归地定义最优解的值。
-
(3)以自底向上的方式计算出最优值。
-
(4)根据计算最优值时得到的信息,构造一个最优解。
-
-
-
常见例子
-
最优子结构
-
如果一个问题的最优解中包含了其子问题的最优解,就说该问题具有最优子结构。当一个问题具有最优子结构时,提示我们动态规划法可能会适用,但是此时贪心策略可能也是适用的。
-
-
重叠子问题
-
重叠子问题指用来解原问题的递归算法可反复地解同样的子问题,而不是总在产生新的子问题。即当一个递归算法不断地调用同一个问题时,就说该问题包含重叠子问题。此时若用分治法递归求解,则每次遇到子问题都会视为新问题,会极大地降低算法的效率,而动态规划法总是充分利用重叠子问题,对每个子问题仅计算一次,把解保存在一个在需要时就可以查看的表中,而每次查表的时间为常数。
-
-
0-1背包问题
-
公共子序列
-
矩阵连乘
-
时间复杂度
-
O(n^3)
-
-
空间复杂度
-
O(n^2)
-
-
-
路线
-
全局最优解
-
-
-
贪心法
-
思想
-
作为一种算法设计技术,贪心法是一种简单的方法。和动态规划法一样,贪心法也经常用于解决最优化问题。与动态规划法不同的是,贪心法在解决问题的策略上是仅根据当前己有的信息做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。换而言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。这种局部最优选择并不能保证总能获得全局最优解,但通常能得到较好的近似最优解。
-
举一个简单的贪心法例子,平时购物找钱时,为使找回的零钱的硬币数最少,从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币种,当不足大面值币种的金额时才去考虑下一种较小面值的币种,这就是在采用贪心法。这种方法在这里总是最优,是因为银行对其发行的硬币种类和硬币面值的巧妙安排。如果只有面值分别为1、5和11单位的硬币,而希望找回总额为15单位的硬币,按贪心算法,应找1个11单位面值的硬币和4个1单位面值的硬币,共找回5个硬币。但最优的解答应是3个5单位面值的硬币。
-
我们知道,贪心算法并不总能得到最优解,那么对于一个具体的问题,如何得知是否可以用贪心法来求解以及能否得到问题的最优解呢?这个问题很难得到肯定的回答。但是,从许多可以用贪心法求得最优解的问题中看到,这类问题一般具有两个重要的性质。
-
(1)最优子结构
-
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构。问题具有最优子结构是该问题可以采用动态规划法或者贪心法求解的关键性质。
-
-
(2)贪心选择性质
-
指问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来得到。这是贪心法和动态规划法的主要区别。证明一个问题具有贪心选择性质也是贪心法的一个难点。
-
-
-
-
例子
-
部分背包问题
-
按最大价值放
-
按最小重量放
-
按最大单位重量价值放
-
-
活动选择
-
局部最优解
-
哈弗曼树
-
Dijkstra算法
-
Kruskal算法
-
-
-
分支界限法
-
广度优先
-
Dijkstra算法
-