教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 学前教育 >

0003算法笔记 - [分治法]分治法与二分搜索,棋盘覆盖问题

来源:网络收集 时间:2026-09-04
导读: 1、分治法 分治法的基本思想是将一个规模为 n的问题分解为k个规模较小的子问 题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的

1、分治法

分治法的基本思想是将一个规模为

n的问题分解为k个规模较小的子问

题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。

分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决

2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。

3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 分治法的基本步骤:

分治法在每一层递归上都有三个步骤:

分解:将原问题分解为若干个规模较小,相互独立,与原问题形式

相同的子问题;

解决:若子问题规模较小而容易被解决则直接解,否则递归地解各

个子问题;

合并:将各个子问题的解合并为原问题的解。

它的一般的算法设计模式如下:

[cpp] view plain copy

1.

Divide-and-Conquer(P)

2. 3. 4. 5. 6. 7. 8.

1. if |P|≤n0

2. then return(ADHOC(P))

3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk 4. for i←1 to k

5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi 6. T ← MERGE(y1,y2,...,yk) △ 合并子问题 7. return(T)

其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不

超过n0时,问题已容易直接解出,不必

再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0

时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,...,Pk的相应的解y1,y2,...,yk合并为P的解。

子问题的划分:人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。换句话说,将一个问题分成大小相等的k个子问题的处理方法是行之有效的。许多问题可以取 k = 2。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。 2、二分搜索

大部分程序员应该都知道二分搜索的大致原理,这里不再赘述。需要说明的是二分搜索是所有以比较为基础的搜索算法时间复杂度最低的算法。用二叉树描速二分查找算法,最坏情况下与二叉树的最高阶相同。比较二叉树线性查找也可用二叉树表示,最坏情况下比较次数为数

组元素数量。任何一种以比较为基础的搜索算法,其最坏情况所用时间不可能低于

O(logn)。

二分搜索程序清单如下:

[cpp] view plain copy

1.

//2d3 二分搜索技术

2. #include \

3. #include 4. using namespace std; 5.

6. template

7. int BinarySearch(Type a[],const Type& x,int n); 8.

9. int main() 10. {

11. int x = 6; 12. int a[10];

13. for(int i=0; i<10; i++) 14. {

15. a[i] = i + 1; 16. }

17. cout<

21. template

22. int BinarySearch(Type a[],const Type& x,int n) 23. {

24. int left = 0; 25. int right = n-1; 26. while(left<=right) 27. {

28. int mid = (left + right)/2; 29. if(x == a[mid]) 30. {

31. return mid; 32. }

33. if(x>a[mid]) 34. {

35. left = mid + 1; 36. } 37. else 38. {

39. right = mid - 1; 40. } 41. } 42.

43. return -1; 44. }

3、棋盘覆盖问题

在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。四个L型骨牌如下图:

棋盘中的特殊方格如图:

实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理如图所示:

…… 此处隐藏:282字,全部文档内容请下载后查看。喜欢就下载吧 ……
0003算法笔记 - [分治法]分治法与二分搜索,棋盘覆盖问题.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/596584.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)