码迷,mamicode.com
首页 > 编程语言 > 详细

【经典算法】分治策略

时间:2015-01-24 21:18:28      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

一、什么是分治  

  有很多算法是递归的:为了解决一个给定的问题,算法要一次或多次递归调用其自身来解决的子问题。这些算法通常采用分治策略:将原问题划分为n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

 

二、分治算法的三个步骤

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

  分解(Divide)步骤将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。

  解决(Conquer)步骤递归地求解出子问题。如果子问题规模足够小,则停止递归,直接求解。

  合并(Combine)步骤将子问题的解合并为原问题的解。

 

三、分治算法的应用场景

  1、该问题的规模缩小到一定的程度就可以容易的解决;

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

  3、该问题分解出的子问题的解可以合并成为该问题的解。

  4、该问题所分解出的各子问题是相互独立的,即子问题之间不包括公共的子问题。

  

  第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;

  第二条特征是应用分治法的前提,它也是绝大多数问题可以满足的,此特征反映了递归思想的应用

  第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条而不具备第三条,则可以

考虑用贪心法或动态规划法。

  第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解决公共的子问题,此时虽然可用分治法,但一般用动态规划法要好。

 

四、可使用分治法解决的问题

  (1)二分搜索

  (2)大整数乘法

  (3)Strassen矩阵乘法

  (4)棋盘覆盖
  (5)合并排序
  (6)快速排序
  (7)线性时间选择
  (8)最接近点对问题
  (9)循环赛日程表
  (10)汉诺塔
 
参考资料:
     1.http://blog.csdn.net/com_stu_zhang/article/details/7233761
     2.《王道程序员求职宝典》
     3.《算法导论》

【经典算法】分治策略

标签:

原文地址:http://www.cnblogs.com/vincently/p/4246501.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!