关闭

数据结构与算法分析--最大子序列和问题

标签: 算法优化数据结构分治联机算法
682人阅读 评论(0) 收藏 举报
分类:
**最大连续子数列和一道很经典的算法问题,给定一个数列,其中可能有正数也可能有负数,我们的任务是找出其中连续的一个子数列(不允许空序列),使它们的和尽可能大。我们一起用多种方式,逐步优化解决这个问题。**

例:
输入{ -2, 11, -4, 13, -5, -2 }时,答案为 20 (从A2到 A4).
算法1:

#include <stdio.h>
//N是数组长度,A是待计算的数组,放在全局区是因为可以开很大的数组
int N, A[1024];
int MaxSumsequenceSum(const int A[],int N);
int main()
{
    //输入数据
    scanf("%d", &N);
    for(int i = 1; i <= N; i++)
        scanf("%d", &A[i]);

    printf("%d\n",MaxSumsequenceSum(A,N));
    return 0;
}
int MaxSumsequenceSum(const int A[],int N)
{
    int ThisSum,MaxSum,i,j,k;
    MaxSum=0;
    for( i = 1; i <= N; i++)
        for( j = i; j <= N; j++)
         {
            ThisSum = 0;
            for( k = i; k <= j; k++)
            ThisSum+=A[k];

            if(ThisSum>MaxSum)
            MaxSum=ThisSum;
        }
     return  MaxSum;
}

算法2:

int MaxSumsequenceSum(const int A[],int N)
{
    int ThisSum,MaxSum,i,j;
    MaxSum=0;
    for( i = 1; i <= N; i++)
    {
        ThisSum=0;
        for( j = i; j <= N; j++)
         {
              ThisSum+=A[j];

            if(ThisSum>MaxSum)
            MaxSum=ThisSum;
        }
     return  MaxSum;
}

算法3:

static int MaxSubSum(int A[], int left, int right){
    int maxLeftSum, maxRightSum;
    int maxLeftBorderSum, maxRightBorderSum;
    int leftBorderSum, rightBorderSum;

    if(left == right)
        if(A[left] > 0)
            return A[left];
        else
            return 0;

    int mid = (left + right) / 2, i;
    maxLeftSum = MaxSubSum(A, left, mid);
    maxRightSum = MaxSubSum(A, mid + 1, right);

    maxLeftBorderSum = 0, leftBorderSum = 0;
    for(i = mid; i >= left; i--){
        leftBorderSum += A[i];
        if(leftBorderSum > maxLeftBorderSum)
            maxLeftBorderSum = leftBorderSum;
    }

    maxRightBorderSum = 0, rightBorderSum = 0;
    for(i = mid + 1; i <= right; i++){
        rightBorderSum += A[i];
        if(rightBorderSum > maxRightBorderSum)
            maxRightBorderSum = rightBorderSum;
    }

    return max3(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);
}

算法4:

int MaxSumsequenceSum(const int A[],int N)
{
    int ThisSum,MaxSum , j ;
    ThisSum=MaxSum=0;
    for( j = i; j <= N; j++)
         {
                       ThisSum+=A[j];

            if(ThisSum>MaxSum)
            MaxSum=ThisSum;
     else if(ThisSum<0)
           ThisSum=0;
        }
     return  MaxSum;

}

四种算法的复杂度分别为O(N^3), O(N^2) , O(NlogN) , O( N);

其中算法3采用的是”分治(divide-and-conquer)策略. 其想法是把问题分成两个大致相等的子问题,然后递归的对他们求解,这是”分”部分,”治”阶段将两个子问题的解合并到一起并可能在做些少量的附加工作,最后的到问题的解;

算法4的一个附带优点是:它只对数据进行一次扫描,一旦A[i]被读入并处理,它就不再被记忆。因此,如果数组在磁盘上,它就可以被顺序读入,在主存中不必存储数组的任何部分。不仅如此,在任意时刻,算法都能对它已经读出子序列问题的正确答案(其他算法不具有这个特性), 具有这种特性的算法叫做联机算法( online algorithm),仅需要常量空间并以线性时间运行的联机算法几乎是完美的算法.

0
0
查看评论

【数据结构和算法分析】最大子序列求和问题及联机算法

最大子序列求和问题
  • huyuanjava
  • huyuanjava
  • 2014-07-26 13:00
  • 986

求最大子序列和问题(读《数据结构与算法分析——C语言描述》有感)

根据《数据结构与算法分析——C语言描述》中的“最大子序列和”问题来看如何分析算法。
  • longli6438
  • longli6438
  • 2015-02-01 21:04
  • 947

四皇后问题代码注析 数据结构与算法分析 张琨

#include"iostream" using namespace std; class Backtracking { public: Backtracking(){ n = 4; C = new int[n]; count = 0; }; void...
  • eettttttt
  • eettttttt
  • 2017-11-20 18:38
  • 52

《数据结构与算法分析C++描述》Mark.Allen.Weiss.pdf

下载地址:网盘下载 内容简介 编辑 此书是作者1996年出版“Algorithm,Data Structures,and Problem Solving with C++”的缩编本,原书正文807页,作者对内容包括算法重新作了编排,本书正文575页共分12章,其...
  • cf406061841
  • cf406061841
  • 2017-05-27 19:17
  • 1034

数据结构与算法分析:C语言描述(pdf+源码+答案)

书    名:数据结构与算法分析:C语言描述                   作    者:Mark Allen Weiss (维斯)&...
  • Tracyhuixingfu
  • Tracyhuixingfu
  • 2014-11-28 19:21
  • 2237

【java版】数据结构与算法分析学习之路【一】前言

一.数据结构和算法概述?【框范围】 基础数据结构主要包括表【数组+链表】、栈、队列【散列表】、树、图、堆。高级数据结构包括伸展树、红黑树、确定性跳跃表、AA树、treap树、k-d树、配对堆。常用的算法内容包括排序算法【插入排序+希尔排序+堆排序+归并排序+快速排序+桶式的排序+外部排序】...
  • shengmingqijiquan
  • shengmingqijiquan
  • 2016-09-22 09:48
  • 1377

数据结构与算法分析 c++描述 读书笔记(1)

开卷有益,多多益善。由于过年期间学习了下python,再加上之后又在看图像处理和机器学习的东西,c++几乎荒废了,所以抽空就拜读下这本经典的书。网上找的书皮: 把博客当读书笔记了,不然曾经写的好几本的c++笔记,也懒得看,最后都扔了,好可惜啊。 正文如下: 代码见高低,直接上书上的两套代码,对比就知...
  • y277an
  • y277an
  • 2016-04-28 19:33
  • 455

数据结构与算法分析经典高清珍藏版

数据结构与算法分析经典高清珍藏版 http://download.csdn.net/detail/oyy_ou/5071561
  • wangfei0904306
  • wangfei0904306
  • 2017-02-15 20:06
  • 223

《数据结构与算法分析》学习笔记

A Practical Introduction to Data Structures and Algorithm Analysis (C++ Edition).
  • u011076940
  • u011076940
  • 2016-08-27 21:04
  • 4805

浅谈数据结构与算法分析学习及如何进行算法分析

前言都说数据结构与算法分析是程序员的内功,想要理解计算机世界就不能不懂点数据结构与算法,然而这也备受争议,因为大多数的业务需求都用不上数据结构与算法,又或者说已经有封装好的库可以直接调用,例如Java中的ArrayList与LinkedList,直接调用add、remove等方法就已经可以完成插入删...
  • github_37022917
  • github_37022917
  • 2017-01-26 21:54
  • 1786
    My GitHub
    https://github.com/HuirongZhang
    个人资料
    • 访问:12857次
    • 积分:681
    • 等级:
    • 排名:千里之外
    • 原创:55篇
    • 转载:13篇
    • 译文:0篇
    • 评论:2条
    博客专栏
    最新评论