算法设计技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

所以此解最优。

相关文档
最新文档