算法导论(1)

分治策略
1.递归式:
用来描述递归求解的分治算法的运行时间。求解递归式有三种方法:
(1)代入法,猜测一个界,然后用数学归纳法证明这个界是正确的。
(2)递归树法,将递归式转换为一棵树,利用递归式,将每层的代价以及深度都表示出来,节点代表不同层次产生的代价,最后利用边界和技术求解。递归树法常用来生成一个好的猜测,然后利用代入法验证是否正确。
(3)主方法。
求解递归式时,我们常忽略向下取整、向上取整以及边界条件。

2.最大子数组问题
即求一个数组中最大的非空连续子数组,只有当数组中包含负值时,此问题才有意义。
问题分解:将数组分为两段,最大子数组所处位置必然是以下三种情况之一:
(1)完全位于子数组A[low..mid]中
(2)完全位于子数组A[mid..high]中
(3)跨越中点。
对于前两种情况,是与原问题相同的子问题,可以递归调用处理,重点处理第三种情况,然后在三种情况中选最大的。第三种情况也比较好处理,因为有了限制,必须过中点,因此可从中点分别向两边找和最大的边界,即为跨越中点的最大数组,伪代码为:

FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
    left-sum=-∞
    sum=0
    for i=mid downto low
        sum=sum+A[i]
        if sum>left-sum
            left-sum=sum
            max-left=i
    right-sum=-∞
    sum=0
    for j=mid+1 to high
        sum=sum+A[j]
        if sum>right-sum
            right-sum=sum
            max-right=j
    return (max-left,max-right,left-sum+right-sum)
FIND-MAXIMUM-SUBARRAY(A,low,high)
    If high==low
        return(low,high,A[low])
    else mid=(low+high)/2
        (left-low,left-high,left-sum)=
            FIND-MAXIMUM-SUBARRAY(A,low,mid)
(right-low,right-high,right-sum)=
            FIND-MAXIMUM-SUBARRAY(A,mid+1,high)
(cross -low, cross -high, cross -sum)=
            FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
        If left-sum>=right-sum and left-sum>=cross-sum
            return left-low,left-high,left-sum
If right-sum>=left-sum and right-sum>=cross-sum
            return right-low,right-high,right-sum
If cross-sum>=right-sum and cross-sum>=left-sum
            return cross -low, cross -high, cross –sum

简化掉一些运算步骤,最大数组运行时间的递归式为:
T(n)=2T(n/2)+Θ(n)

3.矩阵乘法的Strassen算法
直接递归是将矩阵分为4个矩阵分别进行乘法计算,然后进行相加。Strassen算法是利用数学技巧将乘法转变为更多的加法计算,从而降低了运行时间,对分治算法应用感觉比较简单。

4.主方法求解递归式
主定理:令a≥1和b>1是常数,f(n)是一个函数,T(n)是定义在非负整数上的递归式:
T(n)=aT(n/b)+f(n)
其中我们将n/b解释为,那么T(n)有如下渐进界:
(1)若对某个常数ε>0有f(n)=O(n^log_b⁡〖a-ε〗 ),则T(n)=Θ(n^log_b⁡a )。
(2)若f(n)=O(n^log_b⁡a ),则T(n)=Θ(n^log_b⁡a log⁡n)。
(3)若对某个常数ε>0有f(n)=O(n^log_b⁡〖a+ε〗 ),且对某个常数c<1和所有足够大的n有af(n/b)≤cf(n),则T(n)=Θ(f(n))。
就是将f(n)与n^log_b⁡a 做比较,如果前者小,并且是多项式意义上小(渐进小于n^log_b⁡a ,相差一个因子),则对应情况1,如果前者大,并且多项式意义上大,则对应情况3,如果二者相当,则对应情况2。三种情况之间有空隙,并没有覆盖所有,因此也有不能采用主方法的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值