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

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

一、 实验目的及任务

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

二、 实验环境

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。

七、 实验报告内容

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文件中

目录
相关文章
|
7月前
|
算法
代码随想录 Day26 贪心算法01 中 LeetCode T376 摆动序列
代码随想录 Day26 贪心算法01 中 LeetCode T376 摆动序列
30 1
|
5天前
|
搜索推荐 Python
python实现快速排序算法。
【2月更文挑战第9天】【2月更文挑战第23篇】python实现快速排序算法。
|
5月前
|
大数据 定位技术 vr&ar
分治策略之归并排序(Python实现)
分治策略之归并排序(Python实现)
48 0
|
6月前
|
算法 C++
C++基础算法二分篇
C++基础算法二分篇
|
9月前
|
人工智能 搜索推荐 算法
八大排序算法使用Python实现(干货)
八大排序算法使用Python实现(干货)
|
11月前
|
算法 Python
Python实现二分查找算法
Python实现二分查找算法
65 0
基础算法-区间合并
一、区间合并 区间合并,是指将若干个 有交集 的区间合并为 1 个区间。关于区间的写法,我们可以用结构体进行实现,其中既包括左节点,也包括右节点。
|
算法 测试技术
分治法解二维的最近对问题,算法分析与代码实现,蛮力法与分治法解决二维的最近对问题的区别
分治法解二维的最近对问题,算法分析与代码实现,蛮力法与分治法解决二维的最近对问题的区别
267 0
|
算法 Java Linux
【基础算法】二分例题(我在哪?)
【基础算法】二分例题(我在哪?)
94 0
【基础算法】二分例题(我在哪?)
算法模板:基础算法之区间合并
区间合并 给定 n 个区间 [l i,r i],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。