(2)算法学习-分治法
分治法:就是将一个大问题分割成许多小问题,持续分割知道小问题容易求解。分治法分为三个步骤:1.divide,把原问题分割成小问题,2.Conquer,解决小问题,3.Combine,运用小问题的解答整理出原问题的解答。
合并排序法:
1.divide,将数列平分为两组,迭代平分,直到分成只有一个数字或两个数字停止分割。
2.Conquer,解决小问题,当分成只有一个数字或两个数字时,进行比较排序。
3.Combine,合并这也是最重要的一部分,将两部分排好序的数列进行合并,合并过程如下。
快速排序法:任选去一个数字当枢纽元,将比枢纽元小的数字放左边,比枢纽元大德放右边,然后对两边继续进行快速排序。
汉诺塔:
大盘子在下面,小盘子在上面,需要将第一根柱子上的盘子移动到第三根柱子上,可以分为三个步骤:
1.将上面的n-1个盘子移动到第二根柱子上。
2.将最大的盘子移到第三根柱子上。
3.将上面n-1个盘子移动到第三根柱子上。
如此变成了如何将n-1个盘子移动到第二根柱子上的问题+n-1个盘子从第二根柱子移动到第三根柱子上的问题。这与汉诺塔原问题是类似的,所以可以使用分治法,不断迭代得到移动方案。
快速选择算法:运用快速排序算法的思路如下:
分解并在解决之前合并法 divide and marriage before conquest
一种分治法的变形,其特点是将分解出的子问题在解决之前合并。
管道传输分治法 pipelined divide and conquer
一种分治法的变形,它利用某种称为“管道”的数据结构在递归调用结束前将其中的某些结果返回。此方法经常用来减少算法的深度。