实验一 分治策略
一、 实验目的及任务
1、理解递归的概念,掌握设计有效算法的分治策略。
2、分治法求解最大连续子数组(字段和)问题
二、 实验环境
python
三、 问题描述
Input : 一个数组
Output:最大连续子数组。
四、 编程任务
一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。
五、 数据输入
随机产生1000以上的整数(有正有负),写入文件input.txt
六、 结果输出
比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。将结果输出到文件output.txt
参考代码:
def maxSubArray(nums):
max_sum = float('-inf') # 记录最大子数组和
cur_sum = 0 # 当前子数组和
for num in nums:
cur_sum += num
if cur_sum > max_sum:
max_sum = cur_sum
if cur_sum < 0:
cur_sum = 0
return max_sum
# 读取输入数据
with open('input.txt', 'r') as f:
nums = [int(x.strip()) for x in f.readlines()]
# 求出最大子数组和
max_sum = maxSubArray(nums)
# 输出结果
with open('output.txt', 'w') as f:
f.write(str(max_sum) + '\n')
这个算法的时间复杂度是 O(n),其中 n 是输入数组的长度。因为枚举所有可能的子数组只需要常数时间,最坏时间复杂度为 O(n^2),但是在本题中,输入数组长度远远大于 n^2,所以时间复杂度可以接受。