首页 > 其他分享 >分治

分治

时间:2023-05-26 09:13:21浏览次数:28  
标签:二分 求解 复杂度 分治 问题 排序

分治法

基本介绍

分治法,即“分而治之”,对于一个难以解决的大问题,将其分解成k个相同或相似的规模更小的子问题,一直分解直到问题足够小,极容易求解为止。

解题步骤

分治法建模的大概流程可以分为三步:

1.分解:将大问题分解成多个更小的独立且相同或相似子问题,直到子问题容易容易求解
2.解决:递归解决子问题
3.合并:将子问题的解一层一层合并,直到最终合并成原问题的解

题目特征

一般能用分治法求解的题目有以下特征:

1.最优子结构:该问题可分解为若干个规模较小的子问题,并且子问题规模缩小到一定程度就能够容易解决,同时子问题的解能够合并为该问题的解
2.平衡子问题:子问题规模大致相同,能将原问题划分为k个大小差不多相等的子问题。一般子问题规模相等的处理效率,相较规模不等的处理效率更高。
3.独立子问题:子问题之间相互独立,子问题之间不包含公共的子问题。这是区别于dp的根本特征。在dp中,子问题之间是相互联系的。

算法优势(时间效率)

分治法解决大规模的问题时,会将问题分为k个子问题分别求解。一般\(k=2\),即分成两个规模相同的子问题求解。

对于分治,不仅能使问题更容易理解,常常也能大大优化时间复杂度。一般体现就是把时间复杂度为\(O(n)\)的某个操作优化为\(O(\log n)\)。

这是根据分治的局部优化,有利于全局的特点,将解决一个子问题的影响力扩大到了全局,最终优化时间复杂度。

基本应用

分治法应用广泛,二分、归并排序、快速排序等算法都是基于分治衍生的。
可以用分治解决的经典问题:
1.二分搜索
2.大整数乘法
3.Strassen矩阵乘法
4.棋盘覆盖
5.归并排序
6.快速排序
7.线性时间选择
8.最近点对问题
9.循环赛日程表
10.汉诺塔
下面是一个简单的算法应用清单(实时更新):
1.二分查找、二分答案
2.归并排序、快速排序
3.双向搜索(折半搜索)

参考资料:百度、oiwiki、算法竞赛(罗勇军、郭卫斌著)

标签:二分,求解,复杂度,分治,问题,排序
From: https://www.cnblogs.com/week-end/p/17433053.html

相关文章

  • 「学习笔记」略谈点分治
    点分治适合处理大规模的树上路径信息问题。引入给定一棵\(n\)个点树和一个整数\(k\),求树上两点间的距离小于等于\(k\)的点对有多少。对于这个题,如果我们进行\(O_{n^3}\)搜索,那只要\(n\)一大,铁定超时。所以,我们要用一个更优秀的解法,这就是我们的点分治。淀粉质可......
  • 不同路径 II(数组、动态规划)、同构字符串(哈希表、字符串)、颠倒二进制位(位运算、分
    不同路径II(数组、动态规划)一个机器人位于一个_mxn_网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网......
  • Summary - 分治
    本文旨在总结数种分治算法。1.区间分治:当需要对所有区间统计答案时,可以考虑这种分治。具体来说,在处理\([l,r]\)内的所有区间时,分三类考虑:跨过\(mid\)的,完全在\(mid\)左边的,完全在\(mid\)右边的。如果可以\(O(m)\)或\(O(m\logm)\)处理第一类情形(\(m=r-l+1\)),然后用分治处理另外两......
  • Solution Set - CDQ分治
    A[洛谷P2163].给定平面上若干个点,多次询问给定矩形内的点数。B[洛谷P3810].给定若干个三元组,对所有\(k\),求这样三元组的个数:恰有\(k\)个三元组,满足其每个分量都不超过它的相应分量。C[洛谷P3157].给定一个序列,从中依次删去某些元素,求每次删除前逆序对数目。D[CF762E/CF1045G].......
  • Solution Set - 点分治
    A[POJ1741].给定一棵树,边有权,求长度不超过\(k\)的路径数目。B[HDU4871].给定一张图,边有权,求它的最短路径树上恰含\(k\)个点的路径中最长路径的长度及数目。C[HDU4812].给定一棵树,点有权,求字典序最小的一个点对,其路径上的所有点权之积模\(100003\)等于\(k\)。D[HDU5469].给定一......
  • 点分治学习笔记
    概念点分治用于解决有一定要求的链的计数。对于点\(u\)的子树的问题,可以将答案分为:经过点\(u\)不经过点\(u\)第一种可以用桶加暴力。枚举一端的长度,用桶计算另一端长度;第二种分到子树中解决即可。注意到,在随机选根的时候该算法表现不优秀,但若根为重心,因为每次子树......
  • 树分治学习笔记
    前言既然序列可以分治,那么树也可以分治。树上的分治可以分为点分治与边分治。点分治边分治主要用于处理树上路径问题。考虑一个分治的过程:选中一棵树的根,计算经过根的路径的贡献,然后以其子结点为根对子树递归地计算贡献。容易发现,在构造数据下这种算法的复杂度是可以达到\(O(......
  • 点分治学习笔记
    点分治序列上的操作可以用很多方式维护,线段树树状数组平衡树啥的,但是如果毒瘤出题人把序列搬到了树上,则需要一些奇妙方法。一般有两种(好几种?)方法:树链剖分,把树上路径转化成dfn序上的多段进行操作。LCT,不多说,目前只会板子,没搞太懂。点分治,这个是不用把树转化成序列的,而是将树......
  • 树分治学习笔记
    一、点分治一、概述前置知识:数的重心。假设我们要统计一棵有\(n\)个节点的树上所有点对之间距离是\(k\)的有多少对。注意树上的边有长度。\(n\le10^5,k\le10^6\)。一个朴素的算法是遍历树上的所有点对,处理出距离(也就是链的长度)。时间复杂度\(O(n^2)\)。考虑优化。......
  • CDQ分治学习笔记
    CDQ分治学习笔记目录CDQ分治学习笔记前言CDQ分治思想例题1、翻转对分析codeP3810三维偏序(陌上花开)输入格式输出格式样例#1样例输入#1样例输出#1提示分析code前言之前在gdkoi讲解是有人用\(CDQ\)分治A了day1T3。好像分治FFT要用到,而且其他人都学过了,所以蒟蒻再次恶补一手......