1. 分治法
1.基本说明
- 1、基本思想
- 分而治之,大问题拆解成小问题,降低解决难度
- 2、分解注意点
- 1)该问题的规模缩小到一定的程度就可以容易地解决
- 2)该问题可以分解为若干个规模较小的相同问题利用
- 3)该问题分解出的子问题的解可以合并为该问题的解
- 4)该问题所分解出的各个子问题是相互独立的
- 3、步骤
- 1)分解
- 2)解决
- 3)合并
2. 分治法———递归技术(在运行的过程中
,自己调用自己
)
3. 分治法———二分查找
- 1、输入参数说明
- L———查找的数列
- a———起点
- b———终点
- x———要查找的元素
2. 回朔法———一步一步探到底
,走不通
时回到分叉路再探
,不断重复
- 1、说明
- 一种深度优先搜索法
- 2、主要解决的问题
- 比如:迷宫问题
3. 贪心法———每一步
取最优
,得到的结果不一定最优
- 1、基本思想
- 根据一个标准,不断的获取最好的,但是得不到最优解
- 2、经典实例
- 0-1背包问题(
一样最多有一个
)- 1)获取(
所有项的公约数
),计算(每个项
的公约价值(单位价值*公约数)
)- 物品1、物品2、物品3———空间
公约数=10
- 物品1————
公约价值
=140
/(20
/10
)=70
- 物品2————
公约价值
=180
/(30
/10
)=60
- 物品3————
公约价值
=200
/(40
/10
)=50
- 物品1、物品2、物品3———空间
- 2)
依次(公约价值价值从低到高)
从中挑选公约价值最高
的- 公约价值价值从低到高排序为———物品1、物品2、物品3
- (总空间=70),选
物品1
装入后,剩余空间50
- 再次选
物品2
装入后,剩余空间20
- 再装不下
物品3
- 3)得到结论
- 物品1、物品2———总价值为320———不是最优解
- 4)说明
- 其实最优解为(物品2、物品3)
- 1)获取(
- 0-1背包问题(
4. 动态规划法(逻辑最复杂
)
- 1、基本思想
大问题分子问题
解决每一个
子问题,使用表存
起来- 再
处理表
,得到结果
- 2、识别———都要用的
查表
的方式
5. 例题示例
1. 试题1
- 0、代码角度求复杂度———
选最高的
- 赋值常数级———O(1)
- 单层循环———O(n)
- 双层循环———O(n^2)
- 1、问题分析
- 问题1
- (1)———j = 0;
- (2)———b[j]=b[j]+S[i];
- (3)———min=temp
- (4)———b[m]=b[m]+S[i];
- 问题2
- (5)———贪心算法
- (6)———贪心算法
- (7)———O(n^2)
- (8)———O(n^2)
- 问题3
- (9)———5
- (10)———4
- (11)———否
- 问题1
2. 试题2
- 1、问题分析
- 问题1
- (1)———k <= r;
- (2)———arr[k] = right[j];
- (3)———begin < end
- (4)———mergeSort(arr,mid+1,end);
- 问题2
- (5)———分治法
- (6)———T(n)=2T(n/2)+O(n)
- (7)———O(nlogn)
- (8)———O(n)
- 问题3
- (9)———n1+n2
- (9)———5
- (10)———4
- (11)———否
- (9)———n1+n2
- 问题1