算法导论程序3--最大子数组问题(Python)

寻找最大子数组问题:

给定数组A:寻找A中的和最大的非连续子数组。我们称这样的连续子数组为最大子数组(maximum subarray)

使用分治策略的求解方法:

假定我们要寻找子数组A[low...high]的最大子数组。使用分治技术意味着我们要将子数组划分为两个规模尽量相等的子数组。也就是,找到子数组的中央位置,比如mid,然后考虑求解两个子数组A[low...mid]和A[mid+1...high]。A[low...high]的任何连续子数组A[i ...j]所处的位置必然是一下三种情况之一:

1.完全位于子数组A[low...mid]中,因此low<=i<=j<=mid

2.完全位于子数组A[mid+1...high]中,因此mid<i<=j<=high

3.跨越了中点,因此low<=i<=mid<j<=high

我们可以递归地求解A[low...mid]和A[mid+1...high]的最大子数组。剩下的全部工作就是寻找跨越中点的最大子数组,然后在三种情况中选取最大者。


def find_max_crossing_subarray(A,low,mid,high):
    left_sum = float("-inf")
    sum = 0
    max_left = 0
    max_right = 0
    for i in range(mid,low-1,-1):
        sum = sum + A[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
    right_sum = float("-inf")
    sum = 0
    for j in range(mid+1,high+1):
        sum = sum + A[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
    return [max_left,max_right,left_sum+right_sum]


import math
def find_maximum_subarray(A,low,high):
    if high == low:
        return (low,high,A[low])
    else:
        mid = math.floor((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]
        elif right_sum >= left_sum and  right_sum >= cross_sum:
            return [right_low,right_high,right_sum]
        else:return [cross_low,cross_high,cross_sum]
            
算法运行时间复杂度分析:




算法导论是计算机科学中非常重要的一门课程,它涵盖了计算机算法的设计、分析与应用。期末复习是为了加深对所学知识的理解和掌握,为考试做好充分准备。 使用Python语言进行算法导论的复习是一种很好的选择。Python是一种强大且易于上手的编程语言,具有简洁的语法和丰富的库支持。下面是几个复习的重点: 1. 熟悉Python的基本语法和数据结构:掌握Python的基本数据类型如列表、字典和集合,并了解它们的操作与性能。 2. 掌握常见排序算法:复习插入排序、归并排序、快速排序等常见的排序算法,并能够灵活应用它们解决实际问题3. 熟悉图算法:学习图的表示方法,以及广度优先搜索(BFS)和深度优先搜索(DFS)等基本的图算法。 4. 熟练应用动态规划算法:了解动态规划的基本思想,复习使用动态规划解决背包问题、最长公共子序列等典型问题。 5. 学习贪心算法:了解贪心算法的概念和特点,熟悉使用贪心算法解决活动选择、哈夫曼编码等问题。 6. 熟练掌握分治算法:复习分治算法的基本思想和应用,熟悉使用分治算法解决最大子数组和矩阵乘法等问题。 7. 复习基本的算法分析方法:熟悉时间复杂度和空间复杂度的概念,掌握算法的渐进分析方法。 在复习过程中,可以通过参考教材、课堂笔记和习题集等资料进行练习和巩固所学知识。此外,可以参考一些算法导论的相关网上资源和在线教育平台上的课程进行深入学习。最重要的是,要坚持刷题,多进行实际编码练习,巩固所学算法的理解和应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值