分治算法(Divide ans conquer ,D&C)

一.基本概念

在计算机科学中,分治算法(Divide ans conquer ,D&C)是一种基于多分支递归的算法设计范例。“分而治之”,它通过将复杂的问题分解(devide)成两个或多个同类型(或相关类型)的子问题,直至达到能直接解决(conquer)的程度(否则继续分解或递归),最终合并(combine)成原始问题的解来实现分治。

https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms

二.分治法的适用特征

分治法所能解决的问题一般具有以下几个特征:

    1) 该问题通过分解(devide)将问题规模缩小到一定的程度就可以容易地解决

    2) 该问题分解为的若干个规模同类型(或相关类型)的子问题具有最优子结构性质

    3) 利用该问题分解出的子问题的解可以合并为该问题的解;(不具备,可以考虑贪心(greedy algorithm)或者动态规划(DP)

    4) 该问题所分解出的各个子问题是互斥的,即子问题之间不包含公共的子子问题(若有,动态规划更优(DP))

三.分治法的基本思想与步骤

在分治策略中,在每个层次递归中应用了三个步骤:

1.分解(Divide):将P分解为较小的子问题 P1 ,P2 ,...,Pk

    2.解决(Conquer):

If Pi is enough small to solve, thensolve.(直接解决)

Else for i←1 to k,do yi ← Divide-and-Conquer(Pi)递归解决Pi

    3.合并(Combine): T ← MERGE(y1,y2,...,yk)合并子问题, return(T)

    子问题足够大需要递归时,称递归情况(recursive case)。足够小可以直接解决,递归“触底”,称基本情况(base case)。如果除了与原问题形式完全一样的规模更小的子问题外,还需求解不一样的子问题,将其看做合并。

递归与分治紧密相关,递归式很容易刻画分治算法的时间复杂度。一个递归式是一个等式或者不等式,通过更小的输入上的函数值来描述。

通常,解决这类问题(一直递归式,找答案)有三种方法:

1)  数学归纳法(Mathematical Induction)

2)  递归树找规律(Recursion Tree)

3)  主定理(Master Theorem)

 

四.分治法的复杂性分析

一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。再设将原问题分解为k个子问题以及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间,则有:

   T(n)= k T(n/m)+f(n)

通过迭代法求得方程的解:

递归方程及其解只给出n等于m的方幂时T(n)的值,但是如果认为T(n)足够平滑,那么由n等于m的方幂时T(n)的值可以估计T(n)的增长速度。通常假定T(n)是单调上升的,从而当       mi≤n<mi+1时,T(mi)≤T(n)<T(mi+1)。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值