分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。

分治法的基本思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略:对于一个规模为n的问题,若该问题可以容易的解决(比如规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解。

如果原问题可以分割成k个子问题,1

分治法使用场景该问题的规模缩小到一定的程度就可以容易的解决。

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

利用该问题分解出的子问题的解可以合并为该问题的解。

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

第一条特征是绝大多数问题可以满足的,问题的复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提。它是大多数问题可以满足的,此特征反映了递归思想的应用。第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条,而不具备第三条特征,则可以考虑使用贪心法或者动态规划法。第四条关系到分治法的效率,如果各个子问题是不独立的则分治法要做寻多不必要的工作,重复的解决公共的子问题,此时虽然可用分治法,但一般使用动态规划法较好。

分治法的基本步骤分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题

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

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

分治法的复杂性分析

一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。设分解阈值

,且最小子解规模为1的问题消耗一个单位时间。设将原问题分解为k个子问题以及用merge将K个子问题的解合并为原问题的解需用f(n)个单位时间,用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间:

可以使用分治法求解的一些经典问题二分搜索

大整数乘法

Strassen矩阵乘法

棋盘覆盖

线性时间选择

最接近点对问题

循环赛日程表

汉诺塔

二分搜索法

又叫做二分查找,折半查找,它是一种效率较高的查找方法。

线性表为有序表,先确定待查找记录所在的范围,然后逐步缩小范围直至找到或找不到该记录的位置。先确定中间位置:

;

将待查找的key值与data[middle].key的值比较,相等则查找成功并返回该位置,否则须确定新得查找区间,继续二分查找,如果data[middle].key大于key,由于data为有序线性表,可知data[middle...right].key均大于key,因此若表中存在关键字等于key的节点,则一定在位置middle左边的子表中。

反之,data[middle].key小于key,若表中存在关键字等于key的节点,则一定在位置middle右边的子表中,下一次查找对新的区域进行查找。

和动态规划一样,作为一种解决问题的算法思想,仅仅知道其概念是远远不够的,需要出培养这种思维方式,所以必须要有针对性的勤刷题,培养出一种解决问题的思维方式,这样以后遇到类似的问题才能迎刃而解。

参考博客:五大常用算法之一:分治算法 - Will_Don - 博客园​www.cnblogs.com

分治法的关键特征_经典算法思想2——分治(Divide-and-Conquer)相关推荐

  1. 分治法的关键特征_算法系列之常用算法之一----分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主要是三点: 1.将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问 ...

  2. 分治法的关键特征_你真的读懂《OKR工作法》了吗?

    OKR <哈佛商学院最受欢迎的领导课>一书中,提到"一个管理者在工作过程中一定要注意关键要务",现在很多公司都考虑到了这一点,但是对关键要务的推进并没有好的方法,而OK ...

  3. java贪心算法几个经典例子_经典算法思想5——贪心(greedy algorithm)

    贪心算法,是指在对问题求解时,总是做出再当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是某种意义上的局部最优解. 贪心算法没有固定算法框架,算法设计的关键是贪心策略的选择.必须注 ...

  4. c语言分治法求众数重数_算法实验二 分治法 众数问题.pdf

    算法实验二 分治法 众数问题 算法分析与设计实验二 分治法 主要内容 • 实验目的 • 主要实验仪器设备和环境 • 实验内容 • 实验要求 • 注意点 实验目的 • 理解分治法的基本思想 • 针对特定 ...

  5. c语言分治法求众数重数_分治算法:求众数及其重数

    问题描述: 给定含有 n 个元素的多重集合 S,每个元素在 S 中出现的次数称为该元素的重数.多重集合 S 中重数最大的素称为众数.例如多重集合 S={1,2,2,7,2,7,5},其中众数是 2,其 ...

  6. 遗传算法经典实例代码_经典算法研究系列 之 深入浅出遗传算法

    关注数学,关注AI,关注我们公众号ID:Math-AI 经典算法研究系列 遗传算法 1 初探遗传算法 Ok,先看维基百科对遗传算法所给的解释: 遗传算法是计算数学中用于解决最优化的搜索算法,是进化算法 ...

  7. c语言分治法求众数重数_分治法实现众数问题--例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。...

    题目的描述: 例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3. 对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数. 众数------一组元素中出现的次数是最多的 重 ...

  8. c语言分治法求众数重数_分治法求众数问题 (配图)

    标签: 采用分治法,以中间为界限, 先计算围绕中间这个数字的众数情况,然后左右分开递归计算结果,取最值即可. 左右递归计算的时候要先做判断,假如左边或是右边的个数都比已求的重数小,就没必要计算了,即使 ...

  9. c语言分治法求众数重数_分治法求众数 - osc_twlari2q的个人空间 - OSCHINA - 中文开源技术交流社区...

    分治法求众数 Problem Description 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为 众数.例如,S={1,2,2,2,3,5}. ...

最新文章

  1. 独家 | 带你入门比Python更高效的Numpy(附代码)
  2. OSChina 周六乱弹 ——土肥圆装高富帅相亲节目现场拆穿
  3. #ifdef _DEBUG #define new DEBUG_NEW #endif的解释
  4. BZOJ4562: [Haoi2016]食物链
  5. poj1753 Flip Game
  6. 【Java】实现矩阵的转置
  7. 计算机的发展经历阶段应用领域,手机的发展经历了哪3个阶段?
  8. 两台linux建立GRE隧道
  9. Hive_Hive的数据模型_分区表
  10. 怎么用手机当电脑摄像头?安卓苹果都可以,巨简单的N种方案任君挑选
  11. 摩西十诫 摩西简介 世界宗教图谱
  12. 【教程】小米盒子4 刷机,无广告,总是无限重启,刷入2%报错的解决方法
  13. idea破解永久免费
  14. 【HUSTOJ】1050: 字符图形6-星号倒三角
  15. 图文详解如何从win8/8.1中文版(核心版)升级到win8/8.1专业版
  16. LSD-SLAM论文总结
  17. Linux - 可视化菜单界面设计
  18. 晨山资本王志飏:万物智联时代,智能企业的创新路径
  19. android面试总结加强再加强版
  20. 金指拓客助力实体门店在短视频低成本精准拓客 打造同城私域号

热门文章

  1. 理想化的 Redis 集群
  2. mysql连接数据库的包_java连接mysql数据库包
  3. 广度优先搜索_快速入门广度优先搜索
  4. OLAP和OLTP的区别(基础知识) 【转】
  5. Tomcat 启动耗时严重
  6. lucene Collector 文档收集器
  7. (多重背包+记录路径)Charlie's Change (poj 1787)
  8. 《延世大学韩国语教程2》第十九课 生病(下)
  9. Mybatis学习笔记-CURD(基于配置文件的方式)
  10. setTimeOut与setInterval的区别