分治算法/分治思想 |
您所在的位置:网站首页 › 快速排序的优点有哪些 › 分治算法/分治思想 |
学习参考来自:lloil的分治算法详解 和 编程帮的分治算法
分治算法的基本思想:
将一个问题分解为n个相互独立且与原问题性质相同的子问题,通过逐个解决小问题,从而解决整个问题。(逐个击破,分而治之 分治算法是很多高效算法的基础:排序算法:快速排序、归并排序、堆排序…… 查找算法:二分查找(折半查找算法)…… 傅立叶变换:快速傅立叶变换…… 各类问题:大整数乘法、棋盘覆盖、汉诺塔…… 采用分治算法能解决问题有以下特征: 原问题规模大,不易解决。但原问题可缩小且到一定程度就可以容易解决。绝大多数问题都可以满足的,问题的计算复杂性一般是随着问题规模的增加而增加。 原问题可以分解为多个规模较小、求解方式相似的子问题。且各个子问题之间相互独立、互不影响。这是应用分治算法的前提,绝大多数问题都可以满足的,反映了递归思想的应用。 若干子问题的解进行合并后,可以得到原问题的解。这是应用分治算法的关键,能否利用分治法完全取决于问题是否满足这点。 如果仅仅具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心算法或动态规划。 原问题所分解出的各个子问题是相互独立的。这与分治算法的效率相关,如果子问题不是相互独立的,那么采用动态规划较好。 分治算法的优缺点:分治算法主要用于解决规模较大的问题,通过将大问题“分而治之”将有效降低题目难度。又因为分解得到的子问题之间是相互独立且互不影响的,所以可以同时进行,以此提升解决问题的效率。 分治算法的缺陷在于,分治算法常常采用递归的方式实现,整个过程需要消耗大量的系统资源,严重时还会导致程序崩溃。 分治重要的是一种思想,注重的是问题分、治、合并的过程。在分治算法中,递归是一种通过方法调用自身形成一个回路的过程,而分治可能就是利用了多次这样的来回过程。 分治算法经典问题:因为分治算法重要在于理解其思想,还有一些典型的分治算法解决的问题,所以博主在这里主要讲述数组最大值和最小值、汉诺塔问题、二分查找算法、归并算法查找、快速排序算法。 1 数组最大值和最小值数组最大值和最小值问题:是指在长度为 n 的数字序列中找到最大的数和最小的数。 1.1 普通算法普通算法中:定义两个变量 max 和 min 并将序列中首个数字赋值给他们,从第 2 个数字开始遍历整个序列,如果遍历到的数字比 max 大,将其赋值给 max,如果遍历到数字比 min 小,将其赋值给 min。整个序列遍历完成后,max 记录的是序列中最大的数字,min 记录的是序列中最小的数字。 #include int main() { int n; scanf("%d",&n); int arr[n]; for(int i=1;i>1 和 /2 操作是一样的 不过网上说>>1的效率高一点 if(m>a[mid]) low = mid+1; else if(ma[mid-1]) return mid; else low = mid - 1; } return 1; } int main() { while(scanf("%d",&n)) //输入值…… 正常操作 { for(int i=0;i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |