第四章 分治策略

第四章 分治策略

最大子数组问题

解题思路:使用分治法

分:将数组分成两半,直到只有一个元素

治:当只有一个元素的时候这个小部分的最大就是它本身

合:将两个数组和在一起的时候是那种情况:

  (1)最大子数组是其左侧数组的最大子数组

   (2)最大子数组是其右侧数组的最大子数组

  (3)最大子数组出现在中间位置(这个需要另外计算)

              第三种情况需要另外计算一下:从中间向两侧分别加起来,找到分别的最大值然后求和
import sys

def findmaxsubarray(lis, left, right):
    if left == right:
        return lis[right]
    else:
        mid = int((left+right)/2)
        left_max = findmaxsubarray(lis, left, mid)
        right_max = findmaxsubarray(lis, mid+1, right)
        mid_max = findmidmaxsubarry(lis, left, mid, right)
        # 判断返回三者最大值
        if left_max >= right_max & left >= mid_max:
            return left_max
        elif right_max >= left_max & right_max >= mid_max:
            return right_max
        else:
            return mid_max
def findmidmaxsubarry(lis, left, mid, right):
    left_max = -9999
    sum = 0
    # 从中间向左依次加找到最大值
    for i in range(mid, left-1):
        sum += lis[i]
        if sum > left_max:
            left_max = sum
    right_max = -9999
    sum = 0
    for i in range(mid+1, right+1):
        sum += lis[i]
        if sum > right_max:
            right_max = sum

    return left_max + right_max

if __name__ == '__main__':
    lis = list(input().split())     # 第一行将整一行的输入值放入列表lis中,注意,由于input函数的作用,每一个列表元素都是str类型
    for i in range(len(lis)):
        lis[i] = int(lis[i])        # 转化为int
    print(findmaxsubarray(lis, 0, len(lis)))



Strassen矩阵乘法

矩阵乘法是线性代数中最常见的运算之一,它在数值计算中有广泛的应用。
给定两个的矩阵A和B,求它们的积 C = A × B

算法:

a

直接相乘做累加,需要做 N^3 乘法,复杂度为 O(NNN)。

Strassen实现步骤
1.按上述方法将矩阵 分解(花费时间 )。
2. 如下创建10个 的矩阵 (花费时间 )。
b
3. 递归地计算7个矩阵积,每个矩阵 n/2 * n/2 的。
c
时间复杂度为O(n^lg7)
目的是从8次乘法变成7次矩阵乘法,从而加快计算速度。

递推式求解递归式

每个结点对应单一子问题的代价,将树中每层代价求和得到每层代价,所有层代价求和得到递归调用的总代价。
详细解答在《算法导论》P50

用主方法求解递推式

f(n) = af(n/b) + d(n)

1.当d(n)为常数时:
d
2.当d(n) = cn 时:
e阿萨德
3.当d(n)为其他情况时可用递归树进行分析。

主定理

定理4.1(主定理) 令 a≥1 和 b>1 是常数,f(n) 是一个函数,T(n) 是定义在非负整数上的递归式:
T(n) = aT(n/b) + f(n)
那么T(n)有如下渐进界:

若对某个常数 ε>0 有 f(n) = O(nlogba-ε),则 T(n) = Θ(nlogba) 。
若 f(n) = Θ(nlogba),则 T(n) = Θ(nlogba lgn) 。
若对某个常数 ε>0 有 f(n) = Ω(nlogba+ε),且对某个常数 c<1 和所有足够大的 n 有 af(n/b) ≤ cf(n),则 T(n) = Θ(f(n)) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值