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

def MaxCrossSubarray(num,mid,low,high):
    leftsum=0
    leftmax=-1000000
    rightsum=0
    rightmax=-1000000
    for i in range(mid,low-1,-1):
        leftsum=leftsum+num[i]
        if leftsum>leftmax:
            leftmax=leftsum
            leftlow=i
    for j in range(mid+1,high+1):
        rightsum=rightsum+num[j]
        if rightsum>rightmax:
            rightmax=rightsum
            righthigh=j
    sum=leftmax+rightmax
    return (leftlow,righthigh,sum)

def MaxSubarray(num,low,high):
    if low==high:
        return (low,high,num[low])
    else:
        mid=(low+high)//2
        (left_low,left_high,left_sum)=MaxSubarray(num,low,mid)
        (right_low,right_high,right_sum)=MaxSubarray(num,mid+1,high)
        (cross_low,cross_high,cross_sum)=MaxCrossSubarray(num,mid,low,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)
        elif(cross_sum>left_sum and cross_sum>right_sum):
            return (cross_low,cross_high,cross_sum)

a=[13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
max = MaxSubarray(a, 0, len(a)-1)
print max
时间: 2024-10-09 13:51:22

使用分治算法求解最大子数组问题的相关文章

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

/*     本问题是求解最大子数组问题     普通方法的复杂度为n^2     现在尝试给出一种小于n^2的算法     当然数组中必须要有负数,不然没有意义     本例中使用分治策略 */ #include<stdio.h> #include<stdlib.h> //定义返回结构体 typedef struct result {     int left; //左索引     int right; //右索引     int sum; //最大和 }*Res; //求解包含

求解最大子数组问题 -- 暴力求解 和 分治法求解

/*------------------ 求解最大子数组问题 --------------- 最大子数组,就是求解一个数组的所有元素的各种组合中,和最大的 那个子数组.在这种情况下,如果元素值全部非负,那么最大子数组当然 是所有元素.但是如果有负值的元素存在,那么久需要找到一个由数组中 连续几个元素组成的子数组并且其元素值之和最大. */ #include <iostream> using namespace std; struct ArrayStruct { ArrayStruct(int

分治策略之最大子数组问题

从股票买卖问题转换成为一个求最大子数组问题 天 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 价格 100 113 110 85 105 102 86 63 81 101 94 106 101 79 94 90 97 变化 13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7 暴力求解所花费的时间是O(n^2) 采用分治技术来求解最大子数组问题,假定要求的数组为A[low..high]的最大子数组. 将子数组划分

(算法)最大子数组和以及最大子矩阵和

题目: 1.给定一数组,求该数组的最大子数组和: 2.给定一矩阵,求该矩阵的最大子矩阵和: 思路: 1.求数组的最大子数组和很简单,可以通过动态规划来实现,假设数组为arr: 假设dp[i]表示从0到i的数组的最大子数组和,那么递推关系式表示为: dp[0]=arr[0]; dp[i]=dp[i-1]>0?dp[i-1]+arr[i]:arr[i] 2.求矩阵的最大子矩阵和看似很难,其实也可以转化为最大子数组和的问题.假设矩阵为matrix 首先,我们求出矩阵每个位置按行叠加的结果,设叠加结果矩

【数据结构】分治算法求解假硬币问题

问题描述: 概念 分治算法的基本思想是将一个大的复杂的问题分解成多个小的.容易解决的问题,通过解决这些小问题进而解决这个大问题. 使用分治算法需要待求解问题能够简化为若干个小规模的相同的问题,通过逐步划分,达到一个易于求解的阶段,而直接进行求解,在程序中可以使用递归方法来进行求解. 哈哈,说起来很抽象,举个例子就好理解了. 一个袋子里有n个硬币,其中一枚是假币,并且假币和真币一模一样,仅凭肉眼无法区分,仅知道假币比真币轻一些,请问如何查找到假币? 分治算法: 我们可以这样做: 将这n个硬币分成两

一维回环数组求解最大子数组问题

一.题目与要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n) 二.设计思想 通过上次求解简单一维数组的最大子数组问题的解决,我们找到了一种实现时间复杂为O(n)的方法,采用的是二分法和递归

分治策略---求最大子数组

只有当数组中包含负数时,最大子数组问题才有意义.如果所有元素都是非负的,最大子数组问题没有任何意义,因为整个数组和肯定是最大的 1 public class FindMaxSubArrayDemo { 2 public static void main(String[] args) { 3 int[] arr = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}; 4 int[] result_arr = fi

算法:最大子数组own

转载标明出处:http://i.cnblogs.com/EditPosts.aspx?postid=4726782&update=1 暴力法: 1 // maxValue.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 7 using namespace std; 8 9 int findMax(int *a,int low,int high,int &sub

分治算法求解序列最大子和问题

特别的,当序列所有整数均为负整数时,其最大子和为0. 1 #include <stdio.h> 2 3 int caluMaxSubSum(int *array, int left, int right); 4 5 int main() 6 { 7 int array[6] = {2, -2, 3, 1, -4, 2}; 8 int len_array = sizeof(array)/sizeof(array[0]); 9 int i = 0; 10 int subsum = caluMaxS