算法设计技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计技术
常用技术
分治法(Divide and Conquer)
贪心法(Greedy)
动态规划法(Dynamic programming)
回溯法(Backtracking)
分枝界限法(Branch and Bound)
局部搜索法 (Local search algorithms)
一、分治法
定义:对于一个输入大小为n的函数或问题,用某种方法把输入分划成k个子集。(1< k ≤ n)。从而产生L个子问题,解出这L个子问题后再用某种方法把它们组合成原来的解。如子问题相当的大,则递归使用分治法。
时间复杂度 T(n)
g(n) n足够小
T(n)=
2T(n/2)+f(n). 其它
g(n) n很小时,直接计算时间。
f(n) 分成二个子问题解后的整合时间。
例1.1 求一个集合中的最大元素和最小元素。
Procedure maxmin(s);
1.if |s|=2
2.then begin 设|s|={c,d};
3. (a,b)←(MAX(c,d),MIN(c,d)).
end
else begin
4.把S分成二个子集S1,S2,各存一半元素;
5. (maxl, minl) ←maxmin(S1 );
6. (max2, min2) ←maxmin(S2 );
7.(a,b)← (MAX(max1,max2), MIN(min1,min2))
end
例:1.2 找第k个最小元素。
一般先分类为递减序列,得到第k个最小元素,要O (nlogn). 分治法可以O (n)内得到第k个最小元素。当k=[n/2]时,成为在线性时间内找一个序列的中值问题。
procedure SELECT(k,s)
bagin.
1. if |s|<50 then
2. begin
3. 把S 分类
4. return S 的第K 个最小元素.
end
5. else
6. begin
7. 把S 划分成各为五个元素的[|s|/5]个子序列;
8. 设L 是剩余元素(如果有的话);
9. 把上述各5个元素序列分类;
10. 设M 是5个元素的中值序列;
11. m ← SELECT( ∇|M|/2 ® ,M);
12. 设S 1,S 2,S 3为S 的分别<,=,> m 的元素序列;
13. if |S 1|≥k
then return SELECT(k, S 1 )
else
14. if (|S 1|+|S 2|≥k)
then return m
15. else
16. return SELECT(k-|S 1|-|S 2|, S 3 )
end
end
说明:1.把S 大问题化为S 1,S 2,S 3 三个小问题。
2.选合适中值,原n 变为[n/5]个数中选,速度就快5倍。
至少有1/4的元素 m, 至少有1/4的元素 m 。
3.子序列用5分割是算法中有二个SELECT 递归调用,每次是对r|s|的序列调用, 二个序列之和必须<|s|的保证。
按分类次序列出的序列M 每列为5个 元素分类序列 [n/5] 个已分类序列
Procedure (k,s) (类似快速分类)
1. if |s|=1
2. then return S
else
3. begin
4.随机地从S选出一个元素a;
5.设S1,S2,S3分别为>,=,< a的序列
6. if |S1|≥k
then return SELECT(k, S1 )
else
7. if |S1|+|S2|≥k
then return(a)
8. else
9. return SELECT(k-|S1|-|S2|, S3 )
end
二、贪心法
问题:n个输入及一组约束条件。
求:可行解 --- 满足约束条件的任一输入子集。
最优解 --- 满足给定目标函数达到极大或极小的解。
方法:①每步上考虑一个输入
②根据某个优化测度(可以是目标函数),每一步上都保证获得局部最优解。
③一步一步进行,直到可行解。
注意:贪心法并不一定是最优解,但当一个问题复杂度很高时能用复杂度低得多
的方法快速得到次优解也值得。
例2.1 背包(knapsack)问题。
问题: n个物体(物体i的重量为wi,价值为pi)
背包载荷能力m
求:把物体i的Xi部分(1 i n ,0 Xi 1)装入背包中,
使背包内所放物体的价值最高∑ Pi Xi 且∑ Wi Xi m
例如 n=3, m=20
(p1, p2, p3)=(25, 24, 15) (w1, w2, w3)=(18, 15, 10)
四种可行解
(x
1, x
2
, x
3
)∑WiXi ∑PiXi
1 (1/2, 1/3,1/4) 16.5 24.25
2 (1, 1/15, 0) 20.0 28.2
3 (0, 2/3, 1) 20.0 31.0
4 (0, 1,1/2) 20.0 31.5
思路:把单位价值最高的先放入,物2,为24/15。放满15,余5 把次价值再放入,物3,为15/10 放10/2 = 5。
所以此解最优。