前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分治策略之最大子数组(Python实现)

分治策略之最大子数组(Python实现)

作者头像
手撕代码八百里
发布2020-07-29 09:45:16
8600
发布2020-07-29 09:45:16
举报
文章被收录于专栏:猿计划猿计划

一、 实验目的及任务

分治法求解最大子数组问题

二、 实验环境

c++或java

三、 问题描述

Input : 一个数组

Output:最大连续子数组。

四、 编程任务

一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。

五、 数据输入

随机产生1000以上的数据(有正有负),放入输入文件input.txt

六、 结果输出

比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。

七、 实验报告内容

代码语言:javascript
复制
import random
import math

#随机生成数
def randomData():
    # 打开input文件
    file = open('input.txt', 'w', encoding='utf8');

    print("正在随机生成数据,写入input.txt文件")
    # 产生10万个数据,从0到100000
    i = 0;
    while i < 110000:
        file.write(str(random.randint(-5000, 110000))+"\n")
        i = i + 1;
    file.close()
    print("写入input.txt文件完毕")


#一、输入n个整数,求出连续的m个的和最大。


#打开input.txt文件   读取文件
def readLine():
    # 行数
    count_line = 0;
    # 定义存储的元组
    arr1 = []
    file = open('input.txt', 'r', encoding='utf8');
    for line in file.read().splitlines():
        arr1.append(int(line))
        count_line = 1 + count_line;  # 计算行数
    file.close();
    return arr1;


def writeLine(A,arrA):
    # 打开input文件
    file = open('output.txt', 'w', encoding='utf8');
    print("正在打开output.txt文件")
    i = arrA[0];
    while i < arrA[1]:
        file.write(str(A[i]) + "\n")
        i = i + 1;
    file.close()
    print("结果写入output.txt文件完毕")


def FIND_MAXIMUM_SUBARRAY(A,low,high):
    if high == low:
        return [low,high,A[low-1]]
    else:
        mid = math.floor((low+high)/2) #向下取整
        left = FIND_MAXIMUM_SUBARRAY(A,low,mid)
        right = FIND_MAXIMUM_SUBARRAY(A, mid+1, high)
        cross = FIND_MAX_CROSSING_SUBARRAY(A, low, mid,high)
        if left[2] >= right[2] and left[2] >= cross[2]:
            return left
        elif right[2] >= left[2] and  right[2] >=  cross[2]:
            return right
        else:
            return cross

def FIND_MAX_CROSSING_SUBARRAY(A,low, mid,high):
    left_sum =  -1568413122
    sum = 0
    max_left = 0
    for i in range(mid, low,-1):
        sum = sum + int(A[i])
        if sum > left_sum:
            left_sum = sum
            max_left = i

    right_sum = -1568413122
    sum = 0
    max_right = 0
    for j in range(mid+1,high):
        sum = sum + A[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
    return [max_left,max_right,(left_sum+right_sum)]  #结果 [0, 109999, 2888566239]



if __name__ == '__main__':
    #随机生成数据并存放在input.txt文件中
    randomData();
    #读取数据
    print("正在获取数据")
    A = readLine();
    # A = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
    low = 0;
    high = len(A)
    arrA = FIND_MAXIMUM_SUBARRAY(A,low,high)
    print("结果",arrA)
    writeLine(A,arrA)


# for i in "100000":
#     print(i)
#     print(random.randint(1,100))

实验结果

结果1:使用课本上的测试数据:[12,5,1,9,-11]进行排序

在这里插入图片描述
在这里插入图片描述

结果2:随机生成1100000个数字,从-5000到182000,存入到input1.txt文件中

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 实验目的及任务
  • 二、 实验环境
  • 三、 问题描述
  • 四、 编程任务
  • 五、 数据输入
  • 六、 结果输出
  • 七、 实验报告内容
  • 实验结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档