进击的小白857

LIFE IS STRUGGLE!! 记录自己,帮助他人。

算法学习二

一、递归法
1、递归算法是一种通过自身调用自身或者间接调用自身来达到解决问题的算法
•利用递归算法解决的问题通常具有如下3个特性:
①求解规模为n的问题可以转化为一个或多个结构相同、规模较小的问题,然后从这些小问题的解能方便地构造出大问题的解。
②递归调用的次数必须是有限的。
③必须有结束递归的条件(边界条件)来终止递归。
2、算递推式通常有3种方法
①替换方法
•要求首先猜测递推式的解,然后用归纳法证明
②迭代方法
•将递推式先转换成一个和式,然后计算该和式,得到渐近复杂度
③公式法(主方法)
•对于形如以下的递归方程,可以使用公式法,更加方便快捷地得到解T(n)=aT(n/b)+f(n)
式中,a≥1和b>1是常数,f(n)是一个渐近正函数,n/b 指 ⌊n/b⌋或⌈n/b⌉
设n=b^k
T(n)=aT(n/b)+f(n)=a[aT(n/b^2 )+f(n/b)]+f(n)=a^2 T(n/b^2 )+af(n/b)+f(n)=⋯=a^k T(n/b^k )+a^(k-1) f(n/n^(k-1) )+⋯+af(n/b)+f(n)=a^〖log〗b⁡n T(1)+∑(j=0)(k-1)▒〖aj f(n/b^j ) 〗=cn^〖log〗b⁡a +∑(j=0)(〖log〗_b⁡a-1)▒〖aj f(n/b^j ) 〗
大小为n的原问题分成若干个大小为n/b的子问题,其中a个子问题需要求解,而cnk是合并各个子问题的解需要的工作量。

递归法应用举例:
		汉诺塔问题
			时间复杂度分析:T(n)={■(1&n=1@2T(n-1)+1&n>1)┤
			因此对所有的n≥1,T(n)=2^n-1=Θ(2^n )
		斐波那契(Fibonacci)数列问题:
				T(n)=O(2n)说明计算是以指数增长的,基本上是最坏情形

		八皇后问题
				该算法的运行时间和皇后放置方法相关,故其时间复杂度为O(n3)。
二、分治法
		1、分治法的基本思想(自底向上求出问题的解)
首先将一个规模为n的问题分解成k个个规模较小的子问题,这些子问题之间相互独立,且与原问题同类型

☞接着递归求解这些子问题
☞然后将各个子问题的解合并得到原问题的解
☞从分治法的一般设计模式可以看出,用它设
计出的程序一般是递归算法。(但不是绝对
的,也可以是迭代算法)
2、分治法适用的问题的特征
① 该问题的规模缩小到一定的程度就可以容易地解决;
② 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
③ 利用该问题分解出的子问题的解可以合并为该问题的解;
④ 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题
3、排序问题中的分治算法
归并排序
先分解为子序列,子序列里排列再归并
对于给定的算法实例,能够描述其具体的执
行过程。
✧ 可以画出演示图
快速排序
是冒泡排序的一种改进,如图示:

	4、查找问题中的分治算法
		折半查找
			是一种二分查找,效率较高的一种查找方法
			要求序列有序
		选择(最大or最小)问题
			图示:
	5、组合问题中的分治算法
		最大字段和问题
			这个用到了递归
		棋盘覆盖问题:
			用二维数组
循环赛日程安排问题

☞设有n=2k个运动员要进行循环赛,现设计一个
满足以下要求的比赛日程表:
✧ 每个选手必须与其他n-1名选手比赛各一次;
✧ 每个选手一天至多只能赛一次。
循环赛要在最短时间内完成,问:
① 循环赛最少需要进行几天?
② 当n=22=4时,请画出循环赛日程表。
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1

三、贪心算法
1、☞用于求解最优化问题
☞通常以自顶向下的方式选择贪心策略
☞根据最优量度标准实现多步决策
☞总是选择在当前看来最好的选择
☞期望通过局部最优达到全局最优
2、贪心法的基本要素
具有贪心选择性质和最优子结构
3、最优的贪心策略是“最早结束活动优先”
4、组合问题中的贪心算法
背包问题:
先计算单位重量比“收益/重量”,然后降序排列,
多机调度问题:
贪心算法求解:多机调度问题
5、图问题中的贪心算法:
单源最短路径问题(Dijkstra算法)
描述迪杰斯特拉算法的思想
☞会求解具体的算法实例。
✧ 注意给出详细的表格(和离散中使用的方法相同)
背包问题物品可切割(𝑥! ∈ [0,1])
☞使用贪心法求解时的时间复杂度是𝑂(𝑛 log 𝑛)
☞要求能够给出贪心法求解时采用的贪心策略,并能够给出最优解和最优值。
最小(代价)生成树
☞对于给定的无向连通图,要求能够给出Prim算法和Kruskal算法求解MST的基本步骤。
☞Prim算法的时间复杂度是𝑂(𝑛')
四、动态规划法
1、和贪心法思想一致,区别是(以自底向上的方式计算出最优值;)
使用动态规划求解问题的必要条件
① 重叠子问题
② 最优子结构/最优原则
✡ 原问题的最优解包含其子问题的最优解
✡ 原问题的最优解建立在子问题的最优解基础之上
✡ 原问题的最优解依赖于子问题的最优解
2、备忘录法
☞动态规划算法的变形
☞通过分治思想对原问题进行分解,以存储子
问题的解的方式解决冗余计算,并采用自顶向下的递归方式获取问题的最终解。
☞动态规划其具体形式是多种多样的,但都具
有相同的填表模式
动态规划vs备忘录适用范围
☞动态规划✧ 一个问题的所有子问题都至少要解一次
☞备忘录✧ 子问题空间中的部分子问题不需要求解
查找问题中的动态规划算法
最优二叉搜索树
近似串匹配问题O(mn)
图问题中的:
多段图问题
每对节点间的最短距离
组合问题中的动态规划算法
0/1背包问题 物品不可切割(𝑥! ∈ {0,1})
☞总能求得正确最优解的方法
✧ 动态规划(整数规划问题)
✧ 回溯法
✧ 分支限界法
☞目前尚没有找到用于求解该问题的正确的贪心策略,使用时需要排序
☞NP-hard问题,目前为止没有找到有效的P算法
☞最优装载问题是0/1背包问题的特例,即𝑝=1, 1 ≤ 𝑖 ≤ 𝑛。该问题可使用贪心法求解,属于P算法
最长公共子序列
流水作业调度
五、回溯算法(系统式搜索+跳跃式搜索)
1、回溯算法是一种在解空间中搜索可行解或最优解的方法。
该方法通常将解空间看做树形结构,即状态空间树。搜索过程以深度优先对状态空间树进行遍历以避免遗漏可行解。
2、适用条件
判断待求解问题是否满足多米诺性质:

posted on 2020-05-11 16:57  进击的小白857  阅读(373)  评论(0)    收藏  举报

导航

Live2D